Skip to content

Commit 879eb73

Browse files
committed
fix: build the runtime stage, not whatever comes last
The php-fpm build carried no `target:`, which means Docker builds the last stage in the Dockerfile. Adding the web stage after runtime therefore turned that build into the nginx one, and phpmyadmin-php-fpm:latest was published as nginx. The smoke test on main caught it - app-assets died on `exec: "/bin/bash": no such file`. It could not be caught earlier: the smoke test is a separate job and the pull-request build never leaves its runner, so the job only runs on main, which is after publishing. So the identity of each image is now asserted in the job that builds it, where a missing target actually goes wrong. Both conditions were checked against both images locally: each accepts its own and rejects the other, so they would have failed this change before it merged. Signed-off-by: Sebastian Mendel <github@sebastianmendel.de>
1 parent 62923f0 commit 879eb73

1 file changed

Lines changed: 30 additions & 0 deletions

File tree

.github/workflows/build.yml

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,11 @@ jobs:
9494
uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0
9595
with:
9696
context: .
97+
# Named explicitly. Without it Docker builds the LAST stage in the
98+
# Dockerfile, and adding the web stage after runtime silently turned
99+
# this build into the nginx one - php-fpm:latest was published as
100+
# nginx until the smoke test on main caught it on /bin/bash.
101+
target: runtime
97102
# A pull request builds one architecture and keeps it local: `--load`
98103
# cannot import a manifest list, so asking for both there fails with
99104
# "docker exporter does not currently support exporting manifest
@@ -117,6 +122,21 @@ jobs:
117122
sbom: ${{ github.event_name != 'pull_request' }}
118123
provenance: ${{ github.event_name != 'pull_request' && 'mode=max' || 'false' }}
119124

125+
# The smoke test would have caught a swapped image, but it is a separate
126+
# job and the pull-request build never leaves this runner, so it only
127+
# runs on main - which is where the wrong image had already been
128+
# published. This asserts the identity of what was just built, in the
129+
# job that builds it, where a missing `target:` actually goes wrong.
130+
- name: The image is php-fpm, not the web stage
131+
if: github.event_name == 'pull_request'
132+
env:
133+
TAGS: ${{ steps.meta.outputs.tags }}
134+
run: |
135+
set -euo pipefail
136+
tag="$(printf '%s\n' "$TAGS" | head -n1)"
137+
docker run --rm --entrypoint sh "$tag" -c \
138+
'command -v php-fpm >/dev/null && test -x /bin/bash && ! command -v nginx >/dev/null'
139+
120140
- name: Attest the build
121141
if: github.event_name != 'pull_request'
122142
uses: actions/attest-build-provenance@4d101475d8b20a2381f78447822ac1eab6504dd8 # v4.2.2
@@ -166,6 +186,16 @@ jobs:
166186
sbom: ${{ github.event_name != 'pull_request' }}
167187
provenance: ${{ github.event_name != 'pull_request' && 'mode=max' || 'false' }}
168188

189+
- name: The web image is nginx, not the runtime stage
190+
if: github.event_name == 'pull_request'
191+
env:
192+
TAGS: ${{ steps.meta-web.outputs.tags }}
193+
run: |
194+
set -euo pipefail
195+
tag="$(printf '%s\n' "$TAGS" | head -n1)"
196+
docker run --rm --entrypoint sh "$tag" -c \
197+
'command -v nginx >/dev/null && ! command -v php-fpm >/dev/null'
198+
169199
- name: Attest the build (web)
170200
if: github.event_name != 'pull_request'
171201
uses: actions/attest-build-provenance@4d101475d8b20a2381f78447822ac1eab6504dd8 # v4.2.2

0 commit comments

Comments
 (0)