all tests use the test DB #36
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: COmanage Registry setup + PHPUnit (multi-PHP, multi-DB) | |
| on: | |
| workflow_dispatch: | |
| push: | |
| pull_request: | |
| jobs: | |
| setup-and-test: | |
| runs-on: | |
| - codebuild-comanage-pipeline-${{ github.run_id }}-${{ github.run_attempt }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| php: ["8.3"] | |
| db: | |
| - engine: postgres | |
| image: postgres:16-alpine | |
| port: 5432 | |
| health_cmd: 'pg_isready -U "$POSTGRES_USER" -d "$POSTGRES_DB"' | |
| - engine: mysql | |
| image: mysql:8.0 | |
| port: 3306 | |
| health_cmd: 'mysqladmin ping -h 127.0.0.1 -uroot -p"$MYSQL_ROOT_PASSWORD" --silent' | |
| - engine: mariadb | |
| image: mariadb:11 | |
| port: 3306 | |
| health_cmd: 'mariadb-admin ping -h 127.0.0.1 -uroot -p"$MARIADB_ROOT_PASSWORD" --silent' | |
| # Exactly ONE service container per matrix run (the image changes) | |
| services: | |
| db: | |
| image: ${{ matrix.db.image }} | |
| # Publish the DB port so the job can connect via Docker-host networking. | |
| # NOTE: If your runner executes steps in a container, 127.0.0.1 won't work; | |
| # we compute the Docker host gateway IP in a later step. | |
| ports: | |
| - ${{ matrix.db.port }}:${{ matrix.db.port }} | |
| env: | |
| # Postgres vars (used only by postgres image) | |
| POSTGRES_DB: registry_test | |
| POSTGRES_USER: test_user | |
| POSTGRES_PASSWORD: test_password | |
| # MySQL vars (used only by mysql image; mariadb image ignores these) | |
| MYSQL_DATABASE: registry_test | |
| MYSQL_USER: test_user | |
| MYSQL_PASSWORD: test_password | |
| MYSQL_ROOT_PASSWORD: root_password | |
| # MariaDB vars (used only by mariadb image) | |
| MARIADB_DATABASE: registry_test | |
| MARIADB_USER: test_user | |
| MARIADB_PASSWORD: test_password | |
| MARIADB_ROOT_PASSWORD: root_password | |
| options: >- | |
| --health-cmd "${{ matrix.db.health_cmd }}" | |
| --health-interval 10s | |
| --health-timeout 5s | |
| --health-retries 20 | |
| env: | |
| COMANAGE_REGISTRY_DIR: /srv/comanage-registry | |
| # Matrix DB selection for this run | |
| DB_ENGINE: ${{ matrix.db.engine }} | |
| # Values used by your PHPUnit setup test | |
| COMANAGE_REGISTRY_ADMIN_GIVEN_NAME: Admin | |
| COMANAGE_REGISTRY_ADMIN_FAMILY_NAME: User | |
| COMANAGE_REGISTRY_ADMIN_USERNAME: admin | |
| COMANAGE_REGISTRY_SECURITY_SALT: phpunit-security-salt | |
| # DB credentials/name (host/port will be set dynamically in a step) | |
| COMANAGE_REGISTRY_DATABASE: registry_test | |
| COMANAGE_REGISTRY_DATABASE_USER: test_user | |
| COMANAGE_REGISTRY_DATABASE_USER_PASSWORD: test_password | |
| COMANAGE_REGISTRY_DATABASE_PERSISTENT: "false" | |
| steps: | |
| - name: Show OS info | |
| shell: bash | |
| run: | | |
| set -euxo pipefail | |
| cat /etc/os-release || true | |
| uname -a | |
| - name: Upgrade OS packages | |
| shell: bash | |
| run: | | |
| set -euxo pipefail | |
| sudo apt-get update | |
| sudo apt-get upgrade -y | |
| - name: Checkout repository at the exact commit | |
| shell: bash | |
| run: | | |
| set -euxo pipefail | |
| git clone "${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}.git" "${COMANAGE_REGISTRY_DIR}" | |
| cd "${COMANAGE_REGISTRY_DIR}" | |
| git fetch --no-tags --prune --depth=1 origin "${GITHUB_SHA}" | |
| git checkout --force "${GITHUB_SHA}" | |
| git rev-parse HEAD | |
| - name: Install PHP ${{ matrix.php }} and extensions | |
| shell: bash | |
| run: | | |
| set -euxo pipefail | |
| sudo apt-get install -y --no-install-recommends \ | |
| software-properties-common ca-certificates gnupg | |
| sudo add-apt-repository -y ppa:ondrej/php | |
| sudo apt-get update | |
| PHP_VER="${{ matrix.php }}" | |
| sudo apt-get install -y --no-install-recommends \ | |
| php${PHP_VER}-cli \ | |
| php${PHP_VER}-mbstring \ | |
| php${PHP_VER}-intl \ | |
| php${PHP_VER}-ldap \ | |
| php${PHP_VER}-xml \ | |
| php${PHP_VER}-zip \ | |
| php${PHP_VER}-pdo \ | |
| php${PHP_VER}-mysql \ | |
| php${PHP_VER}-pgsql \ | |
| php${PHP_VER}-gd \ | |
| php${PHP_VER}-xsl \ | |
| php${PHP_VER}-memcached \ | |
| php${PHP_VER}-curl | |
| sudo update-alternatives --set php /usr/bin/php${PHP_VER} | |
| sudo ln -sf /usr/bin/php${PHP_VER} /usr/local/bin/php | |
| echo "PHP_VER=${PHP_VER}" >> "$GITHUB_ENV" | |
| echo "/usr/local/bin" >> "$GITHUB_PATH" | |
| - name: Install OS packages needed for setup | |
| shell: bash | |
| run: | | |
| set -euxo pipefail | |
| sudo apt-get update | |
| sudo apt-get install -y --no-install-recommends \ | |
| wget curl tar ca-certificates \ | |
| git unzip \ | |
| libicu-dev \ | |
| libldap2-dev \ | |
| libxml2 \ | |
| zlib1g \ | |
| libsodium23 \ | |
| libpng-dev \ | |
| libjpeg-dev \ | |
| libfreetype6-dev \ | |
| libxslt1.1 \ | |
| libmemcached11 \ | |
| tree | |
| - name: Show versions | |
| shell: bash | |
| run: | | |
| set -euxo pipefail | |
| php -v | |
| composer --version | |
| docker --version | |
| docker version | |
| echo "DOCKER_API_VERSION=${DOCKER_API_VERSION-}" | |
| echo "${DOCKER_HOST-}" | |
| docker context show | |
| - name: Wait for DB to be ready (inside the service container) | |
| shell: bash | |
| run: | | |
| set -euxo pipefail | |
| case "${DB_ENGINE}" in | |
| postgres) | |
| docker exec "${{ job.services.db.id }}" sh -lc 'for i in $(seq 1 60); do pg_isready -U "$POSTGRES_USER" -d "$POSTGRES_DB" && exit 0; sleep 1; done; exit 1' | |
| ;; | |
| mysql) | |
| docker exec "${{ job.services.db.id }}" sh -lc 'for i in $(seq 1 60); do mysqladmin ping -h 127.0.0.1 -uroot -p"$MYSQL_ROOT_PASSWORD" --silent && exit 0; sleep 1; done; exit 1' | |
| ;; | |
| mariadb) | |
| docker exec "${{ job.services.db.id }}" sh -lc 'for i in $(seq 1 60); do mariadb-admin ping -h 127.0.0.1 -uroot -p"$MARIADB_ROOT_PASSWORD" --silent && exit 0; sleep 1; done; exit 1' | |
| ;; | |
| *) | |
| echo "Unknown DB_ENGINE=${DB_ENGINE}" | |
| exit 1 | |
| ;; | |
| esac | |
| - name: Determine DB host/port for published ports (Option 1) | |
| shell: bash | |
| run: | | |
| set -euxo pipefail | |
| # If steps run inside a container, localhost is the *job container*. | |
| # Use the default gateway (Docker host) to reach published ports. | |
| if [ -f /.dockerenv ]; then | |
| DB_HOST="$(ip route | awk '/default/ {print $3; exit}')" | |
| else | |
| DB_HOST="127.0.0.1" | |
| fi | |
| DB_PORT="${{ matrix.db.port }}" | |
| echo "Using DB host=${DB_HOST} port=${DB_PORT} engine=${DB_ENGINE}" | |
| { | |
| echo "COMANAGE_REGISTRY_DATABASE_HOST=${DB_HOST}" | |
| echo "COMANAGE_REGISTRY_DATABASE_PORT=${DB_PORT}" | |
| } >> "$GITHUB_ENV" | |
| - name: Smoke test DB TCP connectivity (from the job environment) | |
| shell: bash | |
| run: | | |
| set -euxo pipefail | |
| php -r ' | |
| $h=getenv("COMANAGE_REGISTRY_DATABASE_HOST"); $p=(int)getenv("COMANAGE_REGISTRY_DATABASE_PORT"); | |
| $fp=@fsockopen($h,$p,$errno,$errstr,5); | |
| if(!$fp){fwrite(STDERR,"TCP connect failed to $h:$p: $errno $errstr\n"); exit(1);} | |
| fclose($fp); | |
| echo "TCP connect OK to $h:$p\n"; | |
| ' | |
| - name: Create local/config/database.php placeholder (optional) | |
| shell: bash | |
| run: | | |
| set -euxo pipefail | |
| cd "${COMANAGE_REGISTRY_DIR}/local/config" | |
| sudo mkdir -p . | |
| sudo tee database.php > /dev/null <<'PHP' | |
| <?php | |
| // Intentionally empty for CI: tests/bootstrap.php configures the 'test' datasource via env vars. | |
| return []; | |
| PHP | |
| sudo chown www-data:www-data database.php || true | |
| - name: Show working directory | |
| shell: bash | |
| run: | | |
| set -euxo pipefail | |
| tree -L 3 "${COMANAGE_REGISTRY_DIR}" | |
| - name: Run PHPUnit (DB_ENGINE=${{ matrix.db.engine }}) | |
| shell: bash | |
| working-directory: /srv/comanage-registry/app | |
| run: | | |
| set -euxo pipefail | |
| echo "DB_ENGINE=${DB_ENGINE}" | |
| echo "COMANAGE_REGISTRY_DATABASE_HOST=${COMANAGE_REGISTRY_DATABASE_HOST}" | |
| echo "COMANAGE_REGISTRY_DATABASE_PORT=${COMANAGE_REGISTRY_DATABASE_PORT}" | |
| vendor/bin/phpunit --testsuite app |