-
Notifications
You must be signed in to change notification settings - Fork 2k
243 lines (220 loc) · 8.5 KB
/
reusable-phpunit-test.yml
File metadata and controls
243 lines (220 loc) · 8.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
name: Reusable PHPUnit Test
on:
workflow_call:
inputs:
job-name:
description: Name of the job to appear in GitHub UI
type: string
required: true
php-version:
description: The PHP version the workflow should run
type: string
required: true
job-id:
description: Job ID to be used as part of cache key and artifact name
type: string
required: false
db-platform:
description: The database platform to be tested
type: string
required: false
mysql-version:
description: Version of the mysql Docker image
type: string
required: false
group-name:
description: The @group to test
type: string
required: false
enable-artifact-upload:
description: Whether artifact uploading of coverage results should be enabled
type: boolean
required: false
enable-coverage:
description: Whether coverage should be enabled
type: boolean
required: false
enable-profiling:
description: Whether slow tests should be profiled
type: boolean
required: false
extra-extensions:
description: Additional PHP extensions that are needed to be enabled
type: string
required: false
extra-ini-options:
description: Additional PHP configuration directives that should be appended to the php.ini
type: string
required: false
extra-composer-options:
description: Additional Composer options that should be appended to the `composer update` call
type: string
required: false
extra-phpunit-options:
description: Additional PHPUnit options that should be appended to the `vendor/bin/phpunit` call
type: string
required: false
env:
NLS_LANG: 'AMERICAN_AMERICA.UTF8'
NLS_DATE_FORMAT: 'YYYY-MM-DD HH24:MI:SS'
NLS_TIMESTAMP_FORMAT: 'YYYY-MM-DD HH24:MI:SS'
NLS_TIMESTAMP_TZ_FORMAT: 'YYYY-MM-DD HH24:MI:SS'
jobs:
tests:
name: ${{ inputs.job-name }}
runs-on: ubuntu-24.04
# Service containers cannot be extracted to caller workflows yet
services:
mysql:
image: mysql:${{ inputs.mysql-version || '8.0' }}
env:
MYSQL_ALLOW_EMPTY_PASSWORD: yes
MYSQL_DATABASE: test
ports:
- 3306:3306
options: >-
--health-cmd="mysqladmin ping"
--health-interval=10s
--health-timeout=5s
--health-retries=3
postgres:
image: postgres
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: test
ports:
- 5432:5432
options: >-
--health-cmd=pg_isready
--health-interval=10s
--health-timeout=5s
--health-retries=3
mssql:
image: mcr.microsoft.com/mssql/server:2025-CU2-ubuntu-24.04
env:
MSSQL_SA_PASSWORD: 1Secure*Password1
ACCEPT_EULA: Y
MSSQL_PID: Developer
ports:
- 1433:1433
options: >-
--health-cmd="/opt/mssql-tools18/bin/sqlcmd -C -S 127.0.0.1 -U sa -P 1Secure*Password1 -Q 'SELECT @@VERSION'"
--health-interval=10s
--health-timeout=5s
--health-retries=3
oracle:
image: gvenzl/oracle-xe:21
env:
ORACLE_RANDOM_PASSWORD: true
APP_USER: ORACLE
APP_USER_PASSWORD: ORACLE
ports:
- 1521:1521
options: >-
--health-cmd healthcheck.sh
--health-interval 20s
--health-timeout 10s
--health-retries 10
redis:
image: redis
ports:
- 6379:6379
options: >-
--health-cmd "redis-cli ping"
--health-interval=10s
--health-timeout=5s
--health-retries=3
memcached:
image: memcached:1.6-alpine
ports:
- 11211:11211
steps:
- name: Install mssql-tools on runner
if: ${{ inputs.db-platform == 'SQLSRV' }}
run: |
# Detect Ubuntu version used by the runner (fallback to 24.04)
DISTRO=$(lsb_release -rs 2>/dev/null || echo '24.04')
curl -sSL https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
curl -sSL https://packages.microsoft.com/config/ubuntu/${DISTRO}/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list
sudo apt-get update
sudo ACCEPT_EULA=Y apt-get install -y msodbcsql18 mssql-tools18 unixodbc-dev
# Make sqlcmd available to subsequent steps
echo "/opt/mssql-tools18/bin" >> $GITHUB_PATH
- name: Create database for MSSQL Server
if: ${{ inputs.db-platform == 'SQLSRV' }}
run: |
sqlcmd -S 127.0.0.1 \
-U sa -P 1Secure*Password1 \
-N -C \
-Q "CREATE DATABASE test COLLATE Latin1_General_100_CS_AS_SC_UTF8"
- name: Install latest ImageMagick
if: ${{ contains(inputs.extra-extensions, 'imagick') }}
run: |
sudo apt-get update
sudo apt-get install -y imagemagick libmagickwand-dev ghostscript poppler-data libjbig2dec0:amd64 libopenjp2-7:amd64
- name: Checkout base branch for PR
if: github.event_name == 'pull_request'
uses: actions/checkout@v6
with:
ref: ${{ github.base_ref }}
- name: Checkout
uses: actions/checkout@v6
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ inputs.php-version }}
tools: composer
extensions: gd, ${{ inputs.extra-extensions }}
ini-values: ${{ inputs.extra-ini-options }}
coverage: ${{ env.COVERAGE_DRIVER }}
env:
COVERAGE_DRIVER: ${{ inputs.enable-coverage && 'xdebug' || 'none' }}
- name: Setup global environment variables
id: setup-env
run: |
echo "COMPOSER_CACHE_FILES_DIR=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
echo "ARTIFACT_NAME=${{ inputs.job-id || github.job }}-php-${{ inputs.php-version }}-db-${{ inputs.db-platform || 'none' }}${{ inputs.mysql-version || '' }}" >> $GITHUB_OUTPUT
- name: Cache dependencies
uses: actions/cache@v5
with:
path: ${{ steps.setup-env.outputs.COMPOSER_CACHE_FILES_DIR }}
key: ${{ inputs.job-id || github.job }}-php-${{ inputs.php-version }}-db-${{ inputs.db-platform || 'none' }}-${{ hashFiles('**/composer.*') }}
restore-keys: |
${{ inputs.job-id || github.job }}-php-${{ inputs.php-version }}-db-${{ inputs.db-platform || 'none' }}-
${{ inputs.job-id || github.job }}-php-${{ inputs.php-version }}-
${{ inputs.job-id || github.job }}-
- name: Cache PHPUnit's static analysis cache
if: ${{ inputs.enable-artifact-upload }}
uses: actions/cache@v5
with:
path: build/.phpunit.cache/code-coverage
key: phpunit-code-coverage-${{ hashFiles('**/phpunit.*') }}
restore-keys: |
phpunit-code-coverage-
- name: Install dependencies
run: |
composer config --global github-oauth.github.com ${{ secrets.GITHUB_TOKEN }}
composer update --ansi ${{ inputs.extra-composer-options }}
- name: Compute additional PHPUnit options
id: phpunit-options
run: |
echo "EXTRA_PHPUNIT_OPTIONS=${{ format('{0} {1} {2}', env.GROUP_OPTION, env.COVERAGE_OPTION, inputs.extra-phpunit-options) }}" >> $GITHUB_OUTPUT
env:
COVERAGE_OPTION: ${{ inputs.enable-coverage && format('--coverage-php build/cov/coverage-{0}.cov', steps.setup-env.outputs.ARTIFACT_NAME) || '--no-coverage' }}
GROUP_OPTION: ${{ inputs.group-name && format('--group {0}', inputs.group-name) || '' }}
- name: Run tests
run: script -e -c "vendor/bin/phpunit --color=always ${{ steps.phpunit-options.outputs.EXTRA_PHPUNIT_OPTIONS }}"
env:
DB: ${{ inputs.db-platform }}
TACHYCARDIA_MONITOR_GA: ${{ inputs.enable-profiling && 'enabled' || '' }}
TERM: xterm-256color
continue-on-error: ${{ inputs.php-version == '8.5' }}
- name: Upload coverage results as artifact
if: ${{ inputs.enable-artifact-upload }}
uses: actions/upload-artifact@v7
with:
name: ${{ steps.setup-env.outputs.ARTIFACT_NAME }}
path: build/cov/coverage-${{ steps.setup-env.outputs.ARTIFACT_NAME }}.cov
if-no-files-found: error
retention-days: 1