|
19 | 19 |
|
20 | 20 | check_build: |
21 | 21 | runs-on: ubuntu-latest |
| 22 | + services: |
| 23 | + mysql: |
| 24 | + image: mysql:8.0 |
| 25 | + env: |
| 26 | + MYSQL_ROOT_PASSWORD: root |
| 27 | + MYSQL_DATABASE: librebooking |
| 28 | + MYSQL_USER: librebooking |
| 29 | + MYSQL_PASSWORD: librebooking |
| 30 | + ports: |
| 31 | + - 3306:3306 |
| 32 | + options: >- |
| 33 | + --health-cmd="mysqladmin ping -h 127.0.0.1 -proot" |
| 34 | + --health-interval=10s |
| 35 | + --health-timeout=5s |
| 36 | + --health-retries=5 |
22 | 37 | steps: |
23 | 38 | - |
24 | 39 | name: Checkout github repository |
|
46 | 61 | VERSION_COMPOSER=lts |
47 | 62 | APP_GH_REF=${{ steps.pr_meta.outputs.appGitRef }} |
48 | 63 | APP_GH_ADD_SHA=${{ steps.pr_meta.outputs.appAddSha }} |
49 | | - load: false |
| 64 | + tags: librebooking-pr:${{ github.sha }} |
| 65 | + load: true |
50 | 66 | push: false |
| 67 | + - |
| 68 | + name: Smoke test image |
| 69 | + run: | |
| 70 | + set -euo pipefail |
| 71 | + image_tag="librebooking-pr:${GITHUB_SHA}" |
| 72 | + mysql_service_id="${{ job.services.mysql.id }}" |
| 73 | +
|
| 74 | + for attempt in $(seq 1 20); do |
| 75 | + if docker exec "${mysql_service_id}" mysqladmin ping --host 127.0.0.1 --user root --password=root --silent; then |
| 76 | + break |
| 77 | + fi |
| 78 | +
|
| 79 | + if [ "${attempt}" = "20" ]; then |
| 80 | + echo "Smoke test failed: MySQL did not become ready" >&2 |
| 81 | + docker logs "${mysql_service_id}" || true |
| 82 | + exit 1 |
| 83 | + fi |
| 84 | +
|
| 85 | + sleep 2 |
| 86 | + done |
| 87 | +
|
| 88 | + docker create --name librebooking-smoke-src "${image_tag}" >/dev/null |
| 89 | + docker cp librebooking-smoke-src:/var/www/html/database_schema /tmp/librebooking-database_schema |
| 90 | + docker rm librebooking-smoke-src |
| 91 | +
|
| 92 | + cat \ |
| 93 | + /tmp/librebooking-database_schema/create-db.sql \ |
| 94 | + /tmp/librebooking-database_schema/create-schema.sql \ |
| 95 | + | docker exec --interactive "${mysql_service_id}" mysql --user root --password=root |
| 96 | +
|
| 97 | + docker run --rm \ |
| 98 | + --add-host host.docker.internal:host-gateway \ |
| 99 | + "${image_tag}" \ |
| 100 | + php /var/www/html/phing-tasks/UpgradeDbTask.php \ |
| 101 | + librebooking \ |
| 102 | + librebooking \ |
| 103 | + host.docker.internal \ |
| 104 | + librebooking \ |
| 105 | + /var/www/html/database_schema |
| 106 | +
|
| 107 | + docker run --detach \ |
| 108 | + --name librebooking-smoke \ |
| 109 | + --add-host host.docker.internal:host-gateway \ |
| 110 | + --publish 18080:8080 \ |
| 111 | + --env LB_DATABASE_HOSTSPEC=host.docker.internal \ |
| 112 | + --env LB_DATABASE_NAME=librebooking \ |
| 113 | + --env LB_DATABASE_USER=librebooking \ |
| 114 | + --env LB_DATABASE_PASSWORD=librebooking \ |
| 115 | + "${image_tag}" |
| 116 | +
|
| 117 | + for attempt in $(seq 1 30); do |
| 118 | + if curl --silent --show-error --fail --max-time 2 http://127.0.0.1:18080/Web/ >/dev/null; then |
| 119 | + echo "Connected to docker image successfully" |
| 120 | + break |
| 121 | + fi |
| 122 | +
|
| 123 | + if [ "${attempt}" = "30" ]; then |
| 124 | + echo "Smoke test failed: HTTP endpoint did not become ready" >&2 |
| 125 | + docker logs librebooking-smoke || true |
| 126 | + exit 1 |
| 127 | + fi |
| 128 | +
|
| 129 | + sleep 2 |
| 130 | + done |
| 131 | +
|
| 132 | + docker exec librebooking-smoke php -m | grep -E '^(gd|ldap|mysqli|timezonedb)$' |
| 133 | + - |
| 134 | + name: Dump smoke logs on failure |
| 135 | + if: failure() |
| 136 | + run: | |
| 137 | + docker logs librebooking-smoke || true |
| 138 | + docker logs "${{ job.services.mysql.id }}" || true |
| 139 | + - |
| 140 | + name: Cleanup smoke container |
| 141 | + if: always() |
| 142 | + run: | |
| 143 | + docker rm --force librebooking-smoke >/dev/null 2>&1 || true |
| 144 | + rm -rf /tmp/librebooking-database_schema |
0 commit comments