Skip to content

Commit 49ed359

Browse files
ci: add a basic smoke test check
This runs the docker image and attempts to connect to it.
1 parent bca960e commit 49ed359

1 file changed

Lines changed: 95 additions & 1 deletion

File tree

.github/workflows/build_pull_request.yml

Lines changed: 95 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,21 @@ jobs:
1919

2020
check_build:
2121
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
2237
steps:
2338
-
2439
name: Checkout github repository
@@ -46,5 +61,84 @@ jobs:
4661
VERSION_COMPOSER=lts
4762
APP_GH_REF=${{ steps.pr_meta.outputs.appGitRef }}
4863
APP_GH_ADD_SHA=${{ steps.pr_meta.outputs.appAddSha }}
49-
load: false
64+
tags: librebooking-pr:${{ github.sha }}
65+
load: true
5066
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

Comments
 (0)