From edb6afd9eb39645cd801e8509b32869bb09c17d1 Mon Sep 17 00:00:00 2001 From: "John L. Villalovos" Date: Sun, 8 Mar 2026 23:18:27 -0700 Subject: [PATCH] ci: add a basic smoke test check This runs the docker image and attempts to connect to it. --- .github/workflows/build_pull_request.yml | 96 +++++++++++++++++++++++- 1 file changed, 95 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build_pull_request.yml b/.github/workflows/build_pull_request.yml index f8b6aa0..476b572 100644 --- a/.github/workflows/build_pull_request.yml +++ b/.github/workflows/build_pull_request.yml @@ -19,6 +19,21 @@ jobs: check_build: runs-on: ubuntu-latest + services: + mysql: + image: mysql:8.0 + env: + MYSQL_ROOT_PASSWORD: root + MYSQL_DATABASE: librebooking + MYSQL_USER: librebooking + MYSQL_PASSWORD: librebooking + ports: + - 3306:3306 + options: >- + --health-cmd="mysqladmin ping -h 127.0.0.1 -proot" + --health-interval=10s + --health-timeout=5s + --health-retries=5 steps: - name: Checkout github repository @@ -46,5 +61,84 @@ jobs: VERSION_COMPOSER=lts APP_GH_REF=${{ steps.pr_meta.outputs.appGitRef }} APP_GH_ADD_SHA=${{ steps.pr_meta.outputs.appAddSha }} - load: false + tags: librebooking-pr:${{ github.sha }} + load: true push: false + - + name: Smoke test image + run: | + set -euo pipefail + image_tag="librebooking-pr:${GITHUB_SHA}" + mysql_service_id="${{ job.services.mysql.id }}" + + for attempt in $(seq 1 20); do + if docker exec "${mysql_service_id}" mysqladmin ping --host 127.0.0.1 --user root --password=root --silent; then + break + fi + + if [ "${attempt}" = "20" ]; then + echo "Smoke test failed: MySQL did not become ready" >&2 + docker logs "${mysql_service_id}" || true + exit 1 + fi + + sleep 2 + done + + docker create --name librebooking-smoke-src "${image_tag}" >/dev/null + docker cp librebooking-smoke-src:/var/www/html/database_schema /tmp/librebooking-database_schema + docker rm librebooking-smoke-src + + cat \ + /tmp/librebooking-database_schema/create-db.sql \ + /tmp/librebooking-database_schema/create-schema.sql \ + | docker exec --interactive "${mysql_service_id}" mysql --user root --password=root + + docker run --rm \ + --add-host host.docker.internal:host-gateway \ + "${image_tag}" \ + php /var/www/html/phing-tasks/UpgradeDbTask.php \ + librebooking \ + librebooking \ + host.docker.internal \ + librebooking \ + /var/www/html/database_schema + + docker run --detach \ + --name librebooking-smoke \ + --add-host host.docker.internal:host-gateway \ + --publish 18080:8080 \ + --env LB_DATABASE_HOSTSPEC=host.docker.internal \ + --env LB_DATABASE_NAME=librebooking \ + --env LB_DATABASE_USER=librebooking \ + --env LB_DATABASE_PASSWORD=librebooking \ + "${image_tag}" + + for attempt in $(seq 1 30); do + if curl --silent --show-error --fail --max-time 2 http://127.0.0.1:18080/Web/; then + echo "Connected to docker image successfully" + break + fi + + if [ "${attempt}" = "30" ]; then + echo "Smoke test failed: HTTP endpoint did not become ready" >&2 + docker logs librebooking-smoke || true + exit 1 + fi + + sleep 2 + done + + docker exec librebooking-smoke php -m | grep -E '^(gd|ldap|mysqli|timezonedb)$' + - + name: Dump smoke logs on failure + if: failure() + run: | + docker logs librebooking-smoke || true + docker logs "${{ job.services.mysql.id }}" || true + - + name: Cleanup smoke container + if: always() + run: | + docker rm --force librebooking-smoke >/dev/null 2>&1 || true + rm -rf /tmp/librebooking-database_schema