Skip to content

CFM-505_Github_actions_bootstraping_and_comanage_setup_testing #390

Open
wants to merge 4 commits into
base: develop
Choose a base branch
from
Open
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
255 changes: 255 additions & 0 deletions .github/workflows/registry-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,255 @@
name: COmanage Registry setup + PHPUnit (multi-PHP, multi-DB)

on:
workflow_dispatch:
push:
pull_request:

jobs:
setup-and-test:
name: setup-and-test (php=${{ matrix.php }}, db=${{ matrix.db.engine }})
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: 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
cat /etc/os-release || true
uname -a
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 (tree) working directory
working-directory: ${{ env.COMANAGE_REGISTRY_DIR }}
shell: bash
run: |
set -euxo pipefail
tree -L 3 "${COMANAGE_REGISTRY_DIR}"
- name: Composer update phpunit only
shell: bash
working-directory: ${{ env.COMANAGE_REGISTRY_DIR }}/app
run: |
set -euxo pipefail
composer update phpunit/phpunit --with-all-dependencies
- name: Run PHPUnit (DB_ENGINE=${{ matrix.db.engine }})
shell: bash
working-directory: ${{ env.COMANAGE_REGISTRY_DIR }}/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 --group registry-setup
vendor/bin/phpunit --exclude-group registry-setup
54 changes: 54 additions & 0 deletions app/phpunit.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
colors="true"
processIsolation="false"
stopOnFailure="false"
bootstrap="tests/bootstrap.php"
cacheDirectory=".phpunit.cache"
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/12.3/phpunit.xsd">
<php>
<ini name="memory_limit" value="-1"/>

<!-- Registry setup inputs -->
<env name="COMANAGE_REGISTRY_ADMIN_GIVEN_NAME" value="Admin"/>
<env name="COMANAGE_REGISTRY_ADMIN_FAMILY_NAME" value="User"/>
<env name="COMANAGE_REGISTRY_ADMIN_USERNAME" value="admin"/>
<env name="COMANAGE_REGISTRY_SECURITY_SALT" value="phpunit-security-salt"/>

<!-- Database inputs (used for container creation; host/port get overridden dynamically by tests/bootstrap.php) -->
<env name="COMANAGE_REGISTRY_DATABASE" value="registry_test"/>
<env name="COMANAGE_REGISTRY_DATABASE_HOST" value="127.0.0.1"/>
<env name="COMANAGE_REGISTRY_DATABASE_PERSISTENT" value="false"/>
<env name="COMANAGE_REGISTRY_DATABASE_PORT" value="0"/>
<env name="COMANAGE_REGISTRY_DATABASE_USER" value="test_user"/>
<env name="COMANAGE_REGISTRY_DATABASE_USER_PASSWORD" value="test_password"/>

<!-- Optional defaults for selecting engines/versions -->
<env name="DB_ENGINE" value="mysql"/>
<env name="MYSQL_VERSION" value="8.0"/>
</php>

<!-- Add any additional test suites you want to run here -->
<testsuites>
<testsuite name="app">
<directory>tests/TestCase/</directory>
</testsuite>
<!-- Add plugin test suites here. -->
</testsuites>

<!-- Load extension for fixtures -->
<extensions>
<bootstrap class="Cake\TestSuite\Fixture\Extension\PHPUnitExtension"/>
</extensions>

<!-- Ignore vendor tests in code coverage reports -->
<source>
<include>
<directory suffix=".php">src/</directory>
<directory suffix=".php">plugins/*/src/</directory>
</include>
<exclude>
<file>src/Console/Installer.php</file>
</exclude>
</source>
</phpunit>
Loading