Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
166 changes: 166 additions & 0 deletions .github/bin/ci-bootstrap.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
#!/bin/bash
# Horde CI Bootstrap Script (GitHub Actions)
# Generated by: horde-components 1.0.0-RC10
# Template version: 1.5.2
# Generated: 2026-07-02 20:16:48 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="GithubApiClient"
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
64 changes: 64 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
name: CI

# Generated by: horde-components 1.0.0-RC10
# Template version: 1.5.2
# Generated: 2026-07-02 20:16:48 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
with:
# Fetch git submodules alongside the working tree.
# A no-op for components without a .gitmodules
# Required for pulling in externally maintained test suites
# i.e. horde/Yaml pulls yaml-test-suite as a submodule because it's large and not ours.
submodules: recursive

- 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/*/GithubApiClient/build/*.json
/tmp/horde-ci/lanes/*/GithubApiClient/build/*.xml
retention-days: 30
33 changes: 0 additions & 33 deletions .github/workflows/on-pr-merged.yml

This file was deleted.

43 changes: 0 additions & 43 deletions .github/workflows/on-pr.yml

This file was deleted.

5 changes: 0 additions & 5 deletions .horde.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,6 @@ dependencies:
psr/http-client: ^1.0
psr/http-factory: ^1.0
psr/http-message: ^2.0
dev:
composer:
phpunit/phpunit: ^11 || ^12
friendsofphp/php-cs-fixer: ^3
phpstan/phpstan: ^2
nocommands:
- bin/demo-client.php
quality:
Expand Down
3 changes: 0 additions & 3 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,6 @@
"psr/http-message": "^2.0"
},
"require-dev": {
"phpunit/phpunit": "^11 || ^12",
"friendsofphp/php-cs-fixer": "^3",
"phpstan/phpstan": "^2"
},
"suggest": {},
"autoload": {
Expand Down
7 changes: 0 additions & 7 deletions phpstan.neon

This file was deleted.

Loading
Loading