From c1f17bac347f9ab4c83242999c4dfddd9e9fbf87 Mon Sep 17 00:00:00 2001 From: Ralf Lang Date: Sat, 27 Jun 2026 10:14:15 +0200 Subject: [PATCH] ci: install horde-components CI pipeline --- .github/bin/ci-bootstrap.sh | 166 ++++++++++++++++++++++++++++++++++++ .github/workflows/ci.yml | 58 +++++++++++++ .horde.yml | 31 ++++++- 3 files changed, 251 insertions(+), 4 deletions(-) create mode 100755 .github/bin/ci-bootstrap.sh create mode 100644 .github/workflows/ci.yml diff --git a/.github/bin/ci-bootstrap.sh b/.github/bin/ci-bootstrap.sh new file mode 100755 index 0000000..3069d96 --- /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:58 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="Oauth" +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..71cc058 --- /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:58 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/*/Oauth/build/*.json + /tmp/horde-ci/lanes/*/Oauth/build/*.xml + retention-days: 30 diff --git a/.horde.yml b/.horde.yml index 0dd130d..b6a022c 100644 --- a/.horde.yml +++ b/.horde.yml @@ -10,14 +10,12 @@ list: horde type: library homepage: https://www.horde.org/libraries/Horde_Oauth authors: - - - name: Chuck Hagenbuch + - name: Chuck Hagenbuch user: chuck email: chuck@horde.org active: false role: lead - - - name: Ralf Lang + - name: Ralf Lang user: ralf.lang email: ralf.lang@ralf-lang.de role: lead @@ -63,3 +61,28 @@ autoload-dev: quality: phpstan: level: 3 +ci-platform: + '8.1': + - php: ^8.1 + - ext-hash + - ext-openssl + '8.2': + - php: ^8.1 + - ext-hash + - ext-openssl + '8.3': + - php: ^8.1 + - ext-hash + - ext-openssl + '8.4': + - php: ^8.1 + - ext-hash + - ext-openssl + '8.5': + - php: ^8.1 + - ext-hash + - ext-openssl + '8.6': + - php: ^8.1 + - ext-hash + - ext-openssl