11---
2- name : Build Docker images
2+ name : Build Docker Images
33concurrency :
44 cancel-in-progress : true
55 group : ${{ github.workflow }}-${{ github.ref }}
@@ -50,54 +50,19 @@ jobs:
5050 php85_version : ${{ steps.check.outputs.php85_version }}
5151 skip : ${{ steps.check.outputs.skip }}
5252 ref : ${{ steps.check.outputs.ref || (github.event_name == 'workflow_dispatch' && inputs.version) || '' }}
53+ base_fingerprint : ${{ steps.check.outputs.base_fingerprint }}
5354 steps :
54- - name : Check PHP versions
55- id : check
56- env :
57- GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
58- run : |
59- PHP_82_LATEST=$(skopeo inspect docker://docker.io/library/php:8.2 --override-os linux --override-arch amd64 | jq -r '.Env[] | select(test("^PHP_VERSION=")) | sub("^PHP_VERSION="; "")')
60- PHP_83_LATEST=$(skopeo inspect docker://docker.io/library/php:8.3 --override-os linux --override-arch amd64 | jq -r '.Env[] | select(test("^PHP_VERSION=")) | sub("^PHP_VERSION="; "")')
61- PHP_84_LATEST=$(skopeo inspect docker://docker.io/library/php:8.4 --override-os linux --override-arch amd64 | jq -r '.Env[] | select(test("^PHP_VERSION=")) | sub("^PHP_VERSION="; "")')
62- PHP_85_LATEST=$(skopeo inspect docker://docker.io/library/php:8.5 --override-os linux --override-arch amd64 | jq -r '.Env[] | select(test("^PHP_VERSION=")) | sub("^PHP_VERSION="; "")')
63- {
64- echo php_version="${PHP_82_LATEST},${PHP_83_LATEST},${PHP_84_LATEST},${PHP_85_LATEST}"
65- echo php82_version="${PHP_82_LATEST//./-}"
66- echo php83_version="${PHP_83_LATEST//./-}"
67- echo php84_version="${PHP_84_LATEST//./-}"
68- echo php85_version="${PHP_85_LATEST//./-}"
69- } >> "${GITHUB_OUTPUT}"
70-
71- # Check if the Docker images must be rebuilt
72- if [[ "${GITHUB_EVENT_NAME}" != "schedule" ]]; then
73- echo skip=false >> "${GITHUB_OUTPUT}"
74- exit 0
75- fi
76-
77- FRANKENPHP_LATEST_TAG=$(gh release view --repo php/frankenphp --json tagName --jq '.tagName')
78- FRANKENPHP_LATEST_TAG_NO_PREFIX="${FRANKENPHP_LATEST_TAG#v}"
79- FRANKENPHP_82_LATEST=$(skopeo inspect docker://docker.io/dunglas/frankenphp:"${FRANKENPHP_LATEST_TAG_NO_PREFIX}"-php8.2 --override-os linux --override-arch amd64 | jq -r '.Env[] | select(test("^PHP_VERSION=")) | sub("^PHP_VERSION="; "")')
80- FRANKENPHP_83_LATEST=$(skopeo inspect docker://docker.io/dunglas/frankenphp:"${FRANKENPHP_LATEST_TAG_NO_PREFIX}"-php8.3 --override-os linux --override-arch amd64 | jq -r '.Env[] | select(test("^PHP_VERSION=")) | sub("^PHP_VERSION="; "")')
81- FRANKENPHP_84_LATEST=$(skopeo inspect docker://docker.io/dunglas/frankenphp:"${FRANKENPHP_LATEST_TAG_NO_PREFIX}"-php8.4 --override-os linux --override-arch amd64 | jq -r '.Env[] | select(test("^PHP_VERSION=")) | sub("^PHP_VERSION="; "")')
82- FRANKENPHP_85_LATEST=$(skopeo inspect docker://docker.io/dunglas/frankenphp:"${FRANKENPHP_LATEST_TAG_NO_PREFIX}"-php8.5 --override-os linux --override-arch amd64 | jq -r '.Env[] | select(test("^PHP_VERSION=")) | sub("^PHP_VERSION="; "")')
83-
84- if [[ "${FRANKENPHP_82_LATEST}" == "${PHP_82_LATEST}" ]] && [[ "${FRANKENPHP_83_LATEST}" == "${PHP_83_LATEST}" ]] && [[ "${FRANKENPHP_84_LATEST}" == "${PHP_84_LATEST}" ]] && [[ "${FRANKENPHP_85_LATEST}" == "${PHP_85_LATEST}" ]]; then
85- echo skip=true >> "${GITHUB_OUTPUT}"
86- exit 0
87- fi
88-
89- {
90- echo ref="${FRANKENPHP_LATEST_TAG}"
91- echo skip=false
92- } >> "${GITHUB_OUTPUT}"
9355 - uses : actions/checkout@v6
94- if : ${{ !fromJson(steps.check.outputs.skip) }}
9556 with :
96- ref : ${{ steps.check.outputs.ref }}
57+ fetch-depth : 0
9758 persist-credentials : false
9859 - name : Set up Docker Buildx
99- if : ${{ !fromJson(steps.check.outputs.skip) }}
10060 uses : docker/setup-buildx-action@v3
61+ - name : Check PHP versions and base image fingerprint
62+ id : check
63+ env :
64+ GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
65+ run : ./.github/scripts/docker-compute-fingerprints.sh
10166 - name : Create variants matrix
10267 if : ${{ !fromJson(steps.check.outputs.skip) }}
10368 id : matrix
@@ -181,17 +146,18 @@ jobs:
181146 ${{ (github.event_name == 'pull_request') && '*.args.NO_COMPRESS=1' || '' }}
182147 *.tags=
183148 *.platform=${{ matrix.platform }}
184- builder- ${{ matrix.variant }} .cache-from=type=gha,scope=builder-${{ matrix.variant }}-${{ needs.prepare.outputs.ref || github.ref }}-${{ matrix.platform }}
185- builder- ${{ matrix.variant }} .cache-from=type=gha,scope=refs/heads/main-builder-${{ matrix.variant }}-${{ matrix.platform }}
186- builder- ${{ matrix.variant }} .cache-to=type=gha,scope=builder-${{ matrix.variant }}-${{ needs.prepare.outputs.ref || github.ref }}-${{ matrix.platform }},ignore-error=true
187- runner- ${{ matrix.variant }} .cache-from=type=gha,scope=runner-${{ matrix.variant }}-${{ needs.prepare.outputs.ref || github.ref }}-${{ matrix.platform }}
188- runner- ${{ matrix.variant }} .cache-from=type=gha,scope=refs/heads/main-runner-${{ matrix.variant }}-${{ matrix.platform }}
189- runner- ${{ matrix.variant }} .cache-to=type=gha,scope=runner-${{ matrix.variant }}-${{ needs.prepare.outputs.ref || github.ref }}-${{ matrix.platform }},ignore-error=true
149+ ${{ fromJson(needs.prepare.outputs.push) && '' || format('builder-{0} .cache-from=type=gha,scope=builder-{0}-{1}-{2}', matrix.variant, needs.prepare.outputs.ref || github.ref, matrix.platform) }}
150+ ${{ fromJson(needs.prepare.outputs.push) && '' || format('builder-{0} .cache-from=type=gha,scope=refs/heads/main-builder-{0}-{1}', matrix.variant, matrix.platform) }}
151+ ${{ fromJson(needs.prepare.outputs.push) && '' || format('builder-{0} .cache-to=type=gha,scope=builder-{0}-{1}-{2},ignore-error=true', matrix.variant, needs.prepare.outputs.ref || github.ref, matrix.platform) }}
152+ ${{ fromJson(needs.prepare.outputs.push) && '' || format('runner-{0} .cache-from=type=gha,scope=runner-{0}-{1}-{2}', matrix.variant, needs.prepare.outputs.ref || github.ref, matrix.platform) }}
153+ ${{ fromJson(needs.prepare.outputs.push) && '' || format('runner-{0} .cache-from=type=gha,scope=refs/heads/main-runner-{0}-{1}', matrix.variant, matrix.platform) }}
154+ ${{ fromJson(needs.prepare.outputs.push) && '' || format('runner-{0} .cache-to=type=gha,scope=runner-{0}-{1}-{2},ignore-error=true', matrix.variant, needs.prepare.outputs.ref || github.ref, matrix.platform) }}
190155 ${{ fromJson(needs.prepare.outputs.push) && format('*.output=type=image,name={0},push-by-digest=true,name-canonical=true,push=true', env.IMAGE_NAME) || '' }}
191156 env :
192157 SHA : ${{ github.sha }}
193158 VERSION : ${{ (github.ref_type == 'tag' && github.ref_name) || needs.prepare.outputs.ref || 'dev' }}
194159 PHP_VERSION : ${{ needs.prepare.outputs.php_version }}
160+ BASE_FINGERPRINT : ${{ needs.prepare.outputs.base_fingerprint }}
195161 - # Workaround for https://github.com/actions/runner/pull/2477#issuecomment-1501003600
196162 name : Export metadata
197163 if : fromJson(needs.prepare.outputs.push)
@@ -208,15 +174,15 @@ jobs:
208174 VARIANT : ${{ matrix.variant }}
209175 - name : Upload builder metadata
210176 if : fromJson(needs.prepare.outputs.push)
211- uses : actions/upload-artifact@v5
177+ uses : actions/upload-artifact@v7
212178 with :
213179 name : metadata-builder-${{ matrix.variant }}-${{ steps.prepare.outputs.sanitized_platform }}
214180 path : /tmp/metadata/builder/*
215181 if-no-files-found : error
216182 retention-days : 1
217183 - name : Upload runner metadata
218184 if : fromJson(needs.prepare.outputs.push)
219- uses : actions/upload-artifact@v5
185+ uses : actions/upload-artifact@v7
220186 with :
221187 name : metadata-runner-${{ matrix.variant }}-${{ steps.prepare.outputs.sanitized_platform }}
222188 path : /tmp/metadata/runner/*
@@ -225,8 +191,10 @@ jobs:
225191 - name : Run tests
226192 if : ${{ !fromJson(needs.prepare.outputs.push) }}
227193 run : |
194+ # TODO: remove "containerimage.config.digest" fallback once all runners use buildx v0.18+
195+ # which replaced it with "containerimage.digest" and "containerimage.descriptor"
228196 docker run --platform="${PLATFORM}" --rm \
229- "$(jq -r ".\"builder-${VARIANT}\".\"containerimage.config.digest\"" <<< "${METADATA}")" \
197+ "$(jq -r ".\"builder-${VARIANT}\" | .\"containerimage.config.digest\" // .\"containerimage .digest\"" <<< "${METADATA}")" \
230198 sh -c "./go.sh test ${RACE} -v $(./go.sh list ./... | grep -v github.com/dunglas/frankenphp/internal/testext | grep -v github.com/dunglas/frankenphp/internal/extgen | tr '\n' ' ') && cd caddy && ../go.sh test ${RACE} -v ./..."
231199 env :
232200 METADATA : ${{ steps.build.outputs.metadata }}
@@ -248,7 +216,7 @@ jobs:
248216 target : ["builder", "runner"]
249217 steps :
250218 - name : Download metadata
251- uses : actions/download-artifact@v6
219+ uses : actions/download-artifact@v8
252220 with :
253221 pattern : metadata-${{ matrix.target }}-${{ matrix.variant }}-*
254222 path : /tmp/metadata
0 commit comments