@@ -13,135 +13,120 @@ on:
1313
1414permissions :
1515 contents : read
16+ packages : read
1617
1718jobs :
1819 test :
19- runs-on : ubuntu-22.04
20-
20+ runs-on : ubuntu-24.04
2121 steps :
2222 - uses : actions/checkout@v6
2323
24- - name : Install system dependencies
24+ - uses : docker/setup-buildx-action@v4
25+
26+ - uses : docker/login-action@v4
27+ with :
28+ registry : ghcr.io
29+ username : ${{ github.actor }}
30+ password : ${{ secrets.GITHUB_TOKEN }}
31+
32+ - name : Compute GHCR cache ref
33+ id : meta
34+ run : echo "ref=ghcr.io/${GITHUB_REPOSITORY,,}/build:latest" >> "$GITHUB_OUTPUT"
35+
36+ - name : Build CI base image
37+ uses : docker/build-push-action@v7
38+ with :
39+ context : .
40+ file : dist/docker/Dockerfile
41+ target : base
42+ tags : nictool-ci:latest
43+ load : true
44+ cache-from : |
45+ type=registry,ref=${{ steps.meta.outputs.ref }}
46+ type=gha,scope=ci
47+ cache-to : type=gha,mode=max,scope=ci
48+
49+ - name : Generate test credentials
50+ run : |
51+ echo "DB_PW=$(openssl rand -base64 24)" >> "$GITHUB_ENV"
52+ echo "ROOT_PW=$(openssl rand -base64 24)" >> "$GITHUB_ENV"
53+
54+ - name : Create test network and start MySQL
55+ run : |
56+ docker network create ci
57+ docker run -d --name mysql --network ci \
58+ -e MYSQL_ROOT_PASSWORD=root \
59+ -e MYSQL_DATABASE=nictool \
60+ --health-cmd="mysqladmin ping -h 127.0.0.1" \
61+ --health-interval=5s \
62+ --health-timeout=3s \
63+ --health-retries=10 \
64+ mysql:8
65+
66+ - name : Start CI container
2567 run : |
26- sudo apt-get update
27- sudo DEBIAN_FRONTEND=noninteractive apt-get install -y \
28- expat \
29- cpanminus \
30- libdbix-simple-perl \
31- libdbd-mysql-perl \
32- apache2 \
33- libapache2-mod-perl2 \
34- libapache2-mod-perl2-dev \
35- libapache-dbi-perl \
36- gettext \
37- libxml2 \
38- libnet-ip-perl \
39- libxml-libxml-perl \
40- libxml-parser-perl \
41- libdigest-hmac-perl \
42- libjson-perl \
43- librpc-xml-perl \
44- libsoap-lite-perl \
45- libmodule-build-perl \
46- libmime-base32-perl \
47- libmime-base64-perl \
48- libbind-confparser-perl \
49- libssl-dev \
50- libcrypt-openssl-rsa-perl \
51- libcrypt-openssl-dsa-perl \
52- libnet-dns-perl \
53- libyaml-perl \
54- bind9utils \
55- libwww-perl \
56- liburi-perl \
57- libmime-tools-perl \
58- libmailtools-perl \
59- libfile-sharedir-perl \
60- libperl-prereqscanner-perl \
61- libdbi-perl \
62- libcgi-pm-perl \
63- libtest-pod-perl \
64- libtest-output-perl \
65- libtest-simple-perl \
66- default-mysql-client
67-
68- - name : Wait for MySQL service
68+ docker run -d --name ci --network ci \
69+ -v "$GITHUB_WORKSPACE:/workspace" \
70+ -w /workspace \
71+ -e NICTOOL_DB_USER_PASSWORD="$DB_PW" \
72+ -e DB_ROOT_PASSWORD=root \
73+ -e NICTOOL_DB_USER=nictool \
74+ -e NICTOOL_DB_NAME=nictool \
75+ -e DB_ENGINE=mysql \
76+ -e DB_HOSTNAME=mysql \
77+ -e ROOT_USER_EMAIL=ci@nictool.test \
78+ -e ROOT_USER_PASSWORD="$ROOT_PW" \
79+ -e NICTOOL_CLIENT_DIR=/workspace/client \
80+ nictool-ci:latest sleep infinity
81+
82+ - name : Wait for MySQL
6983 run : |
70- sudo /etc/init.d/mysql start
71- for attempt in $(seq 1 10); do
72- if mysqladmin ping -h 127.0.0.1 --silent; then
84+ for i in $(seq 1 60); do
85+ if docker inspect --format='{{.State.Health.Status}}' mysql 2>/dev/null | grep -q healthy; then
86+ echo "MySQL is healthy"
7387 exit 0
7488 fi
7589 sleep 2
7690 done
77- exit 1
91+ echo "MySQL failed to become healthy" && exit 1
7892
79- - name : Generate test credentials
93+ - name : Install NicTool client and server
8094 run : |
81- DB_PW=$(openssl rand -base64 24)
82- ROOT_PW=$(openssl rand -base64 24)
83- echo "NICTOOL_DB_USER_PASSWORD=$DB_PW" >> "$GITHUB_ENV"
84- echo "DB_ROOT_PASSWORD=root" >> "$GITHUB_ENV"
85- echo "NICTOOL_DB_USER=nictool" >> "$GITHUB_ENV"
86- echo "NICTOOL_DB_NAME=nictool" >> "$GITHUB_ENV"
87- echo "DB_ENGINE=mysql" >> "$GITHUB_ENV"
88- echo "DB_HOSTNAME=localhost" >> "$GITHUB_ENV"
89- echo "ROOT_USER_EMAIL=ci@nictool.test" >> "$GITHUB_ENV"
90- echo "ROOT_USER_PASSWORD=$ROOT_PW" >> "$GITHUB_ENV"
91- echo "NICTOOL_CLIENT_DIR=$GITHUB_WORKSPACE/client" >> "$GITHUB_ENV"
92- echo "DB_SSL=1" >> "$GITHUB_ENV"
95+ docker exec ci bash -c '
96+ cd /workspace/client && perl Makefile.PL && cpanm -n .
97+ cd /workspace/server && perl Makefile.PL && cpanm -n .
98+ '
9399
94100 - name : Allow Apache to traverse workspace path
95101 run : |
96- # Ubuntu 21.04+ defaults home dirs to 750; www-data needs o+x to traverse
97- dir="$GITHUB_WORKSPACE"
98- while [ "$dir" != "/" ]; do
99- sudo chmod o+x "$dir"
100- dir="$(dirname "$dir")"
101- done
102+ docker exec ci bash -c '
103+ dir="/workspace"
104+ while [ "$dir" != "/" ]; do
105+ chmod o+x "$dir"
106+ dir="$(dirname "$dir")"
107+ done
108+ '
102109
103110 - name : Set up NicTool configs, Apache, and TLS
104- run : sudo -E dist/setup/install-nictool.sh --nt-dir="$GITHUB_WORKSPACE"
105-
106- - name : Install Perl modules for Apache/mod_perl
107- run : |
108- sudo cpanm --notest \
109- CryptX Crypt::Mac::HMAC Crypt::KeyDerivation \
110- Test::HTML::Lint Time::TAI64 DBD::MariaDB
111-
112- - name : Install NicTool client and server
113- run : |
114- cd "$GITHUB_WORKSPACE/client"
115- perl Makefile.PL
116- sudo cpanm -n .
111+ run : docker exec ci dist/setup/install-nictool.sh --nt-dir=/workspace
117112
118- cd "$GITHUB_WORKSPACE/server"
119- perl Makefile.PL
120- sudo cpanm -n .
121-
122- - name : Restart Apache
123- run : sudo service apache2 restart || sudo cat /var/log/apache2/error.log
113+ - name : Start Apache
114+ run : docker exec ci apachectl start
124115
125116 - name : Create NicTool test database
126- run : |
127- cd "$GITHUB_WORKSPACE/server/sql"
128- echo "" | perl create_tables.pl --environment
117+ run : docker exec ci bash -c 'cd /workspace/server/sql && echo "" | perl create_tables.pl --environment'
129118
130119 - name : Create test user and test.cfg
131- run : perl dist/setup/setup-test-env.pl
120+ run : docker exec ci perl dist/setup/setup-test-env.pl
132121
133122 - name : Run client tests
134- run : make -C "$GITHUB_WORKSPACE/ client" test
123+ run : docker exec ci make -C /workspace/ client test
135124
136125 - name : Run server tests
137- run : make -C "$GITHUB_WORKSPACE/ server" test
126+ run : docker exec ci make -C /workspace/ server test
138127
139128 - name : Failure diagnostics
140129 if : failure()
141130 run : |
142- pwd
143- mysql --version
144- apache2 -version
145- sudo cat /var/log/apache2/error.log || true
146- cat /etc/apache2/apache2.conf || true
147- ls /usr/lib/apache2/modules/ || true
131+ docker exec ci cat /var/log/apache2/error.log 2>/dev/null || true
132+ docker logs mysql 2>&1 | tail -50 || true
0 commit comments