diff --git a/.github/bin/ci-bootstrap.sh b/.github/bin/ci-bootstrap.sh new file mode 100755 index 0000000..5252421 --- /dev/null +++ b/.github/bin/ci-bootstrap.sh @@ -0,0 +1,166 @@ +#!/bin/bash +# Horde CI Bootstrap Script (GitHub Actions) +# Generated by: horde-components 1.0.0-RC9 +# Template version: 1.5.1 +# Generated: 2026-06-27 08:08:57 UTC +# +# DO NOT EDIT - Regenerate with: horde-components ci init +# +# This script uses the runner's preinstalled PHP (8.3 on ubuntu-24.04). +# horde-components will install additional PHP versions as needed. + +set -e +set -o pipefail + +# Configuration +COMPONENTS_PHAR_URL="${COMPONENTS_PHAR_URL:-https://github.com/horde/components/releases/latest/download/horde-components.phar}" +COMPONENT_NAME="Form" +WORK_DIR="/tmp/horde-ci" + +# Colors for output (disabled in CI) +RED='' +GREEN='' +YELLOW='' +NC='' + +# Logging functions +log_info() { + # Bootstrap-stage progress lines stay as plain stdout under + # GitHub Actions. Routing them through ::notice:: would flood the + # Annotations panel with non-actionable entries. log_warn and + # log_error still emit workflow commands because bootstrap-level + # problems (missing GITHUB_TOKEN, download failure, etc.) belong + # in the panel. + echo "[INFO] $*" +} + +log_warn() { + if [ -n "$GITHUB_ACTIONS" ]; then + echo "::warning::$*" + else + echo "[WARN] $*" + fi +} + +log_error() { + if [ -n "$GITHUB_ACTIONS" ]; then + echo "::error::$*" + else + echo "[ERROR] $*" + fi >&2 +} + +# Stage 1: Validate environment +log_info "Horde CI Bootstrap (GitHub Actions mode)" +log_info "Component: $COMPONENT_NAME" + +# Check we're in GitHub Actions +if [ -z "$GITHUB_ACTIONS" ]; then + log_error "This script is for GitHub Actions. Use ci setup --ci-mode=local for local development." + exit 1 +fi + +# Validate required environment variables +if [ -z "$GITHUB_REPOSITORY" ]; then + log_error "GITHUB_REPOSITORY not set" + exit 1 +fi + +if [ -z "$GITHUB_REF" ]; then + log_error "GITHUB_REF not set" + exit 1 +fi + +if [ -z "$GITHUB_TOKEN" ]; then + log_error "GITHUB_TOKEN not set" + exit 1 +fi + +# Stage 2: Verify PHP (use runner's default - PHP 8.3) +if ! command -v php &> /dev/null; then + log_error "PHP not found. ubuntu-24.04 runner should have PHP preinstalled." + exit 1 +fi + +PHP_VERSION=$(php -r 'echo PHP_VERSION;') +log_info "Using runner's PHP version: $PHP_VERSION" + +# Stage 3: Locate horde-components.phar +# +# Lookup order: +# 1. Repo-bundled phar at $GITHUB_WORKSPACE/ci-tools/horde-components.phar +# (committed alongside the workflow for repos that pin a specific build) +# 2. Cached phar from a previous run at $WORK_DIR/bin/horde-components.phar +# 3. Download from $COMPONENTS_PHAR_URL +REPO_PHAR="$GITHUB_WORKSPACE/ci-tools/horde-components.phar" +mkdir -p "$WORK_DIR/bin" +COMPONENTS_PHAR="$WORK_DIR/bin/horde-components.phar" + +if [ -f "$REPO_PHAR" ]; then + log_info "Using repo-bundled horde-components.phar from ci-tools/" + cp "$REPO_PHAR" "$COMPONENTS_PHAR" + chmod +x "$COMPONENTS_PHAR" +elif [ -f "$COMPONENTS_PHAR" ]; then + log_info "Using cached horde-components.phar" +else + log_info "Downloading horde-components from $COMPONENTS_PHAR_URL" + + if ! curl -sS -L -o "$COMPONENTS_PHAR" "$COMPONENTS_PHAR_URL"; then + log_error "Failed to download horde-components.phar" + exit 1 + fi +fi + +# Validate it's a valid phar +if ! php "$COMPONENTS_PHAR" help &> /dev/null; then + log_error "horde-components.phar is not valid or not executable" + exit 1 +fi + +log_info "horde-components.phar ready at $COMPONENTS_PHAR" + +# Stage 4: Install sudo helper script +log_info "Installing sudo helper script" + +# Extract and install the helper script from PHAR +php -r "copy('phar://$COMPONENTS_PHAR/data/ci/sudo-helper.sh', '$WORK_DIR/sudo-helper.sh');" 2>/dev/null || \ + log_warn "Could not extract sudo helper from PHAR (older version?)" + +if [ -f "$WORK_DIR/sudo-helper.sh" ]; then + sudo install -m 755 "$WORK_DIR/sudo-helper.sh" /usr/local/bin/horde-ci-sudo-helper + log_info "Sudo helper installed successfully" +else + log_warn "Sudo helper not found, will try to proceed without it" +fi + +# Stage 5: Handoff to PHP (horde-components ci setup) +log_info "Bootstrap complete. Handing off to horde-components ci setup" + +php "$COMPONENTS_PHAR" ci setup \ + --ci-mode=github \ + --work-dir="$WORK_DIR" \ + --component="$COMPONENT_NAME" + +EXIT_CODE=$? + +if [ $EXIT_CODE -eq 0 ]; then + log_info "CI setup complete. Workspace: $WORK_DIR" +else + log_error "CI setup failed with exit code $EXIT_CODE" + exit $EXIT_CODE +fi + +# Stage 6: Run CI tests +log_info "Running CI tests" + +php "$COMPONENTS_PHAR" ci run \ + --work-dir="$WORK_DIR" + +EXIT_CODE=$? + +if [ $EXIT_CODE -eq 0 ]; then + log_info "CI tests complete" +else + log_error "CI tests failed with exit code $EXIT_CODE" + exit $EXIT_CODE +fi diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..91b3da4 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,58 @@ +name: CI + +# Generated by: horde-components 1.0.0-RC9 +# Template version: 1.5.1 +# Generated: 2026-06-27 08:08:57 UTC +# +# DO NOT EDIT - Regenerate with: horde-components ci init +# +# This workflow uses the runner's preinstalled PHP 8.3 for bootstrap. +# horde-components will install additional PHP versions as needed. + +on: + push: + branches: [ FRAMEWORK_6_0 ] + pull_request: + branches: [ FRAMEWORK_6_0 ] + workflow_dispatch: + +jobs: + ci: + name: CI + runs-on: ubuntu-24.04 + permissions: + contents: read + pull-requests: write + checks: write + + steps: + - name: Checkout code + uses: actions/checkout@v5 + + - name: Cache horde-components.phar + uses: actions/cache@v5 + with: + path: /tmp/horde-ci/bin + key: components-phar-${{ hashFiles('.github/bin/ci-bootstrap.sh') }} + + - name: Cache QC tools (PHPUnit, PHPStan, PHP-CS-Fixer) + uses: actions/cache@v5 + with: + path: /tmp/horde-ci/tools + key: ci-tools-${{ hashFiles('.horde.yml') }} + + - name: Run CI + run: bash .github/bin/ci-bootstrap.sh + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + COMPONENTS_PHAR_URL: ${{ vars.COMPONENTS_PHAR_URL || 'https://github.com/horde/components/releases/latest/download/horde-components.phar' }} + + - name: Upload test results + if: always() + uses: actions/upload-artifact@v5 + with: + name: ci-results-pr${{ github.event.pull_request.number || github.run_number }}-${{ github.sha }} + path: | + /tmp/horde-ci/lanes/*/Form/build/*.json + /tmp/horde-ci/lanes/*/Form/build/*.xml + retention-days: 30 diff --git a/.github/workflows/on-pr-merged.yml b/.github/workflows/on-pr-merged.yml deleted file mode 100644 index b131005..0000000 --- a/.github/workflows/on-pr-merged.yml +++ /dev/null @@ -1,35 +0,0 @@ -name: After-Merge Chores -on: - pull_request: - types: - - closed - # branches: - # - FRAMEWORK_6_0 - workflow_dispatch: - -jobs: - PostMerge: - if: github.event.pull_request.merged == true - runs-on: ubuntu-24.04 - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup PHP - uses: shivammathur/setup-php@7c071dfe9dc99bdf297fa79cb49ea005b9fcadbc # v2.37.1 - with: - php-version: 8.3 - extensions: bcmath, ctype, curl, dom, gd, gettext, iconv, imagick, json, ldap, mbstring, mysql, opcache, openssl, pcntl, pdo, posix, redis, soap, sockets, sqlite, tokenizer, xmlwriter, xdebug - ini-values: post_max_size=512M, max_execution_time=360 - coverage: xdebug - tools: php-cs-fixer, phpunit:${{ matrix.phpunit-versions }}, composer:v2 - - - name: Setup Github Token as composer credential - run: composer config -g github-oauth.github.com ${{ secrets.GITHUB_TOKEN }} - - - name: Install dependencies and local tools - run: | - COMPOSER_ROOT_VERSION=dev-FRAMEWORK_6_0 composer config minimum-stability dev - COMPOSER_ROOT_VERSION=dev-FRAMEWORK_6_0 composer config prefer-stable true - COMPOSER_ROOT_VERSION=dev-FRAMEWORK_6_0 composer config --no-plugins --global allow-plugins.horde/horde-installer-plugin true - COMPOSER_ROOT_VERSION=dev-FRAMEWORK_6_0 composer install --no-interaction --no-progress diff --git a/.github/workflows/on-pr.yml b/.github/workflows/on-pr.yml deleted file mode 100644 index bb62146..0000000 --- a/.github/workflows/on-pr.yml +++ /dev/null @@ -1,46 +0,0 @@ -name: Pull Request Chores -on: - pull_request: - branches: - - FRAMEWORK_6_0 - workflow_dispatch: - -jobs: - CI: - runs-on: ubuntu-24.04 - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup PHP - uses: shivammathur/setup-php@7c071dfe9dc99bdf297fa79cb49ea005b9fcadbc # v2.37.1 - with: - php-version: 8.3 - extensions: bcmath, ctype, curl, dom, gd, gettext, iconv, imagick, json, ldap, mbstring, mysql, opcache, openssl, pcntl, pdo, posix, redis, soap, sockets, sqlite, tokenizer, xmlwriter, xdebug - ini-values: post_max_size=512M, max_execution_time=360 - coverage: xdebug - tools: php-cs-fixer, phpunit:${{ matrix.phpunit-versions }}, composer:v2 - - - name: Setup Github Token as composer credential - run: composer config -g github-oauth.github.com ${{ secrets.GITHUB_TOKEN }} - - - name: Install dependencies and local tools - continue-on-error: true - run: | - COMPOSER_ROOT_VERSION=dev-FRAMEWORK_6_0 composer config minimum-stability dev - COMPOSER_ROOT_VERSION=dev-FRAMEWORK_6_0 composer config prefer-stable true - COMPOSER_ROOT_VERSION=dev-FRAMEWORK_6_0 composer config --no-plugins --global allow-plugins.horde/horde-installer-plugin true - COMPOSER_ROOT_VERSION=dev-FRAMEWORK_6_0 composer install --no-interaction --no-progress - - - name: Run PHPUnit - run: vendor/bin/phpunit --testdox - - - name: Run php-cs-fixer - run: vendor/bin/php-cs-fixer check -vvv - - - name: Run phpstan (mandatory level) - run: vendor/bin/phpstan --no-progress - - - name: Run phpstan (level 9, allowed to fail) - run: vendor/bin/phpstan --no-progress --level=9 - continue-on-error: true diff --git a/.horde.yml b/.horde.yml index 24ad64b..f6e0cda 100644 --- a/.horde.yml +++ b/.horde.yml @@ -7,32 +7,27 @@ list: dev type: library homepage: https://www.horde.org/libraries/Horde_Form authors: - - - name: Dmitry Petrov + - name: Dmitry Petrov user: dpetrov email: ~ active: true role: lead - - - name: Torben Dannhauber + - name: Torben Dannhauber user: tdannhauer email: torben@dannhauer.de active: true role: releasemanager - - - name: Ralf Lang + - name: Ralf Lang user: rlang email: ralf.lang@ralf-lang.de active: true role: contributor - - - name: Jan Schneider + - name: Jan Schneider user: jan email: jan@horde.org active: false role: lead - - - name: Chuck Hagenbuch + - name: Chuck Hagenbuch user: chuck email: chuck@horde.org active: false @@ -78,3 +73,158 @@ keywords: - render - validation - crud +ci-platform: + '8.0': + - php: '>=7.2' + - composer-plugin-api: ^2.2.0 + - ext-ctype + - ext-dom + - ext-filter + - ext-gettext + - ext-hash + - ext-iconv + - ext-intl + - ext-json + - ext-libxml + - ext-mbstring + - ext-openssl + - ext-pcre + - ext-phar + - ext-session + - ext-simplexml + - ext-spl + - ext-tokenizer + - ext-xml + - ext-xmlwriter + '8.1': + - php: '>=7.2' + - composer-plugin-api: ^2.2.0 + - ext-ctype + - ext-dom + - ext-filter + - ext-gettext + - ext-hash + - ext-iconv + - ext-intl + - ext-json + - ext-libxml + - ext-mbstring + - ext-openssl + - ext-pcre + - ext-phar + - ext-session + - ext-simplexml + - ext-spl + - ext-tokenizer + - ext-xml + - ext-xmlwriter + '8.2': + - php: '>=7.2' + - composer-plugin-api: ^2.2.0 + - ext-ctype + - ext-dom + - ext-filter + - ext-gettext + - ext-hash + - ext-iconv + - ext-intl + - ext-json + - ext-libxml + - ext-mbstring + - ext-openssl + - ext-pcre + - ext-phar + - ext-session + - ext-simplexml + - ext-spl + - ext-tokenizer + - ext-xml + - ext-xmlwriter + '8.3': + - php: '>=7.2' + - composer-plugin-api: ^2.2.0 + - ext-ctype + - ext-dom + - ext-filter + - ext-gettext + - ext-hash + - ext-iconv + - ext-intl + - ext-json + - ext-libxml + - ext-mbstring + - ext-openssl + - ext-pcre + - ext-phar + - ext-session + - ext-simplexml + - ext-spl + - ext-tokenizer + - ext-xml + - ext-xmlwriter + '8.4': + - php: '>=7.2' + - composer-plugin-api: ^2.2.0 + - ext-ctype + - ext-dom + - ext-filter + - ext-gettext + - ext-hash + - ext-iconv + - ext-intl + - ext-json + - ext-libxml + - ext-mbstring + - ext-openssl + - ext-pcre + - ext-phar + - ext-session + - ext-simplexml + - ext-spl + - ext-tokenizer + - ext-xml + - ext-xmlwriter + '8.5': + - php: '>=7.2' + - composer-plugin-api: ^2.2.0 + - ext-ctype + - ext-dom + - ext-filter + - ext-gettext + - ext-hash + - ext-iconv + - ext-intl + - ext-json + - ext-libxml + - ext-mbstring + - ext-openssl + - ext-pcre + - ext-phar + - ext-session + - ext-simplexml + - ext-spl + - ext-tokenizer + - ext-xml + - ext-xmlwriter + '8.6': + - php: '>=7.2' + - composer-plugin-api: ^2.2.0 + - ext-ctype + - ext-dom + - ext-filter + - ext-gettext + - ext-hash + - ext-iconv + - ext-intl + - ext-json + - ext-libxml + - ext-mbstring + - ext-openssl + - ext-pcre + - ext-phar + - ext-session + - ext-simplexml + - ext-spl + - ext-tokenizer + - ext-xml + - ext-xmlwriter