Skip to content

Commit 074b956

Browse files
committed
Create build with multi arch splitted
1 parent ac028ad commit 074b956

32 files changed

+270
-189
lines changed

.github/workflows/legacy-v5.yml

Lines changed: 96 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,55 @@ on:
44
workflow_dispatch:
55

66
jobs:
7-
test-and-publish:
7+
build:
8+
strategy:
9+
fail-fast: false
10+
matrix:
11+
php_version: ['8.1', '8.0', '7.4']
12+
variant: ['apache','cli','fpm']
13+
builder: [ {arch: "amd64", os: "ubuntu-24.04"}, {arch: "arm64", os: "ubuntu-24.04-arm"}]
14+
runs-on: ${{ matrix.builder.os }}
15+
name: Build ${{ matrix.php_version }}-${{ matrix.variant }} ${{ matrix.builder.arch }}
16+
steps:
17+
- name: Checkout
18+
uses: actions/checkout@v4
19+
- name: Set up Docker
20+
uses: docker-practice/actions-setup-docker@master
21+
- name: Login to GHCR
22+
uses: docker/login-action@v3
23+
with:
24+
registry: ghcr.io
25+
username: ${{ github.actor }}
26+
password: ${{ secrets.GITHUB_TOKEN }}
27+
- name: Set up Docker Buildx
28+
uses: docker/setup-buildx-action@v3
29+
- name: Build
30+
run: |
31+
PHP_VERSION="${{ matrix.php_version }}"
32+
# Get last cached successful builds
33+
TARGETS=$(REPO="ghcr.io/${{ github.repository_owner }}/php" TAG_PREFIX="" docker buildx bake php${PHP_VERSION//.}-${{ matrix.variant }}-all --progress=quiet --print | jq -r '.target[].tags[]')
34+
for TARGET in $TARGETS; do
35+
docker --quiet pull ${TARGET} || echo ""
36+
done;
37+
# Build the current builds
38+
REPO="ghcr.io/${{ github.repository_owner }}/php" \
39+
ARCH_SUFFIX="-${{ matrix.builder.arch }}" \
40+
TAG_PREFIX="rc${GITHUB_RUN_ID}-" \
41+
docker buildx bake \
42+
--set "*.platform=linux/${{ matrix.builder.arch }}" \
43+
--set "*.output=type=registry" \
44+
--progress=quiet \
45+
--load \
46+
php${PHP_VERSION//.}-${{ matrix.variant }}-all
47+
- name: Display tags built
48+
run: |
49+
docker image ls --filter="reference=ghcr.io/${{ github.repository_owner }}/php" --format "{{.CreatedAt}}\t{{.Size}}\t{{.Repository}}:{{.Tag}}"
50+
51+
merge-and-publish:
52+
needs:
53+
- build
854
runs-on: ubuntu-latest
9-
name: Publish ${{ matrix.php_version }}-${{ matrix.variant }} multi-arch to dockerhub
55+
name: Merge and publish ${{ matrix.php_version }}-${{ matrix.variant }}
1056
strategy:
1157
fail-fast: false
1258
matrix:
@@ -15,49 +61,67 @@ jobs:
1561
steps:
1662
- name: Checkout
1763
uses: actions/checkout@v4
18-
- name: Set up QEMU
19-
uses: docker/setup-qemu-action@v3
2064
- name: Set up Docker Buildx
2165
uses: docker/setup-buildx-action@v3
66+
- name: Login to GHCR
67+
uses: docker/login-action@v3
68+
with:
69+
registry: ghcr.io
70+
username: ${{ github.actor }}
71+
password: ${{ secrets.GITHUB_TOKEN }}
2272
- name: Login to DockerHub
2373
uses: docker/login-action@v3
74+
if: ${{ github.repository_owner == 'thecodingmachine' }}
2475
with:
2576
username: ${{ secrets.DOCKERHUB_USERNAME }}
2677
password: ${{ secrets.DOCKERHUB_TOKEN }}
78+
- name: Install regctl
79+
uses: regclient/actions/regctl-installer@main
80+
with:
81+
release: 'v0.8.1'
2782
- name: Fetch minor version of php
2883
run: |
29-
# Build slim one
30-
PHP_VERSION="${{ matrix.php_version }}"
31-
TAG_PREFIX="rc${GITHUB_RUN_ID}-" \
32-
docker buildx bake \
33-
--set "*.platform=linux/amd64" \
34-
--set "*.output=type=docker" \
35-
--load \
36-
php${PHP_VERSION//.}-slim-${{ matrix.variant }}
84+
# Pull amd64 slim image to get PHP version
85+
docker pull --quiet ghcr.io/${{ github.repository_owner }}/php:rc${GITHUB_RUN_ID}-${{ matrix.php_version }}-v5-slim-${{ matrix.variant }}-amd64
3786
# Retrieve minor
38-
PHP_PATCH_MINOR=`docker run --rm thecodingmachine/php:rc${GITHUB_RUN_ID}-${{ matrix.php_version }}-v5-slim-${{ matrix.variant }} php -v | head -n1 | grep -P '\d+\.\d+\.\d+' -o | head -n1`
87+
PHP_PATCH_MINOR=`docker run --rm ghcr.io/${{ github.repository_owner }}/php:rc${GITHUB_RUN_ID}-${{ matrix.php_version }}-v5-slim-${{ matrix.variant }}-amd64 php -v | head -n1 | grep -P '\d+\.\d+\.\d+' -o | head -n1`
88+
echo "PHP_PATCH_MINOR=${PHP_PATCH_MINOR}"
3989
echo "PHP_PATCH_MINOR=${PHP_PATCH_MINOR}" >> $GITHUB_ENV
40-
- name: Display tags to build
90+
- name: Get list of images for this variant
91+
id: get-images
4192
run: |
4293
PHP_VERSION="${{ matrix.php_version }}"
43-
PHP_PATCH_MINOR="${{ env.PHP_PATCH_MINOR }}" \
94+
REPO="ghcr.io/${{ github.repository_owner }}/php" \
4495
TAG_PREFIX="rc${GITHUB_RUN_ID}-" \
45-
IS_RELEASE="1" \
46-
docker buildx bake php${PHP_VERSION//.}-${{ matrix.variant }}-all --print --progress plain | jq ".target[].tags | join(\" \")" -r > "/tmp/tags.log"
47-
cat "/tmp/tags.log"
48-
- name: Build and push ${{ matrix.php_version }}-${{ matrix.variant }}
96+
docker buildx bake \
97+
--print --progress=quiet \
98+
php${PHP_VERSION//.}-${{ matrix.variant }}-all | jq '.target[].tags[]'
99+
- name: Create multiarch manifests
49100
run: |
50101
PHP_VERSION="${{ matrix.php_version }}"
51-
PHP_PATCH_MINOR="${{ env.PHP_PATCH_MINOR }}" \
52-
TAG_PREFIX="rc${GITHUB_RUN_ID}-" \
53-
IS_RELEASE="1" \
54-
docker buildx bake \
55-
--set "*.platform=linux/amd64,linux/arm64" \
56-
--set "*.output=type=registry" \
57-
php${PHP_VERSION//.}-${{ matrix.variant }}-all
58-
- name: Push artifacts
59-
uses: actions/upload-artifact@v4
60-
with:
61-
name: ${{ matrix.php_version }}-${{ matrix.variant }}
62-
path: /tmp/tags.log
63-
retention-days: 60
102+
103+
# Get all targets from the bake group
104+
TARGETS=$(docker buildx bake php${PHP_VERSION//.}-${{ matrix.variant }}-all --progress=quiet --print | jq -r ".group[\"php${PHP_VERSION//.}-${{ matrix.variant }}-all\"].targets[]")
105+
106+
for TARGET in $TARGETS; do
107+
TAG_ORI=$(REPO="ghcr.io/${{ github.repository_owner }}/php" TAG_PREFIX="rc${GITHUB_RUN_ID}-" docker buildx bake ${TARGET} --progress=quiet --print | jq -r ".target | to_entries[] | select(.key == \"${TARGET}\") | .value.tags[0]")
108+
TAG_PATH=$(REPO="php" PHP_PATCH_MINOR="${{ env.PHP_PATCH_MINOR }}" docker buildx bake ${TARGET} --progress=quiet --print | jq -r ".target | to_entries[] | select(.key == \"${TARGET}\") | .value.tags[0]")
109+
TAG_MINOR=$(REPO="php" docker buildx bake ${TARGET} --progress=quiet --print | jq -r ".target | to_entries[] | select(.key == \"${TARGET}\") | .value.tags[0]")
110+
111+
# Create manifest for rc tag (always)
112+
echo "Creating manifest: ${TARGET} - ${TAG_ORI}"
113+
docker buildx imagetools create --progress=plain -t "${TAG_ORI}" "${TAG_ORI}-amd64" "${TAG_ORI}-arm64"
114+
115+
# Create manifest for PHP_PATCH
116+
regctl image copy "${TAG_ORI}" "ghcr.io/${{ github.repository_owner }}/${TAG_PATH}"
117+
# Create manifest for PHP_MINOR
118+
regctl image copy "${TAG_ORI}" "ghcr.io/${{ github.repository_owner }}/${TAG_MINOR}"
119+
120+
# SAME FOR DOCKERHUB (for the official repository)
121+
if [ "${{ github.repository_owner }}" == "thecodingmachine" ]; then
122+
# Create manifest for PHP_PATCH_MINOR
123+
regctl image copy "${TAG_ORI}" "thecodingmachine/${TAG_PATH}"
124+
# Create manifest for PHP_VERSION
125+
regctl image copy "${TAG_ORI}" "thecodingmachine/${TAG_MINOR}"
126+
fi
127+
done

.github/workflows/legacy.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@ jobs:
1010
matrix:
1111
php_version: ['8.4', '8.3','8.2','8.1','8.0','7.4']
1212
variant: ['apache','cli','fpm']
13-
# builder: [ {arch: "amd64", os: "ubuntu-latest"}, {arch: "arm64", os: "macos-latest"}]
14-
builder: [ {arch: "amd64", os: "ubuntu-latest"}, {arch: "arm64", os: "ubuntu-latest"}]
13+
builder: [ {arch: "amd64", os: "ubuntu-24.04"}, {arch: "arm64", os: "ubuntu-24.04-arm"}]
1514
runs-on: ${{ matrix.builder.os }}
1615
name: Test ${{ matrix.php_version }}-${{ matrix.variant }} ${{ matrix.builder.arch }} only
1716
steps:

.github/workflows/workflow.yml

Lines changed: 90 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -7,112 +7,155 @@ on:
77
push:
88
branches:
99
- 'v5'
10+
- 'feat/split-multi-arch-build' # FIXME test
1011
schedule:
1112
- cron: '42 3 * * 0'
1213
workflow_dispatch:
1314

1415
jobs:
15-
test:
16+
build:
1617
strategy:
1718
fail-fast: false
1819
matrix:
19-
php_version: ['8.5', '8.4', '8.3','8.2','8.1']
20+
# php_version: ['8.5', '8.4', '8.3','8.2','8.1']
21+
php_version: ['8.5']
2022
variant: ['apache','cli','fpm']
21-
# builder: [ {arch: "amd64", os: "ubuntu-latest"}, {arch: "arm64", os: "macos-latest"}]
22-
builder: [ {arch: "amd64", os: "ubuntu-24.04"}, {arch: "arm64", os: "ubuntu-24.04"}]
23+
builder: [ {arch: "amd64", os: "ubuntu-24.04"}, {arch: "arm64", os: "ubuntu-24.04-arm"}]
2324
runs-on: ${{ matrix.builder.os }}
24-
name: Test ${{ matrix.php_version }}-${{ matrix.variant }} ${{ matrix.builder.arch }} only
25+
name: Build&test ${{ matrix.php_version }}-${{ matrix.variant }} ${{ matrix.builder.arch }}
2526
steps:
2627
- name: Checkout
2728
uses: actions/checkout@v4
2829
- name: Set up Docker
29-
# /!\ this action is marked as experimental
30-
# It's required only for macos
31-
if: ${{ matrix.builder.os == 'macos-latest' }}
3230
uses: docker-practice/actions-setup-docker@master
33-
- name: Set up QEMU
34-
uses: docker/setup-qemu-action@v3
31+
- name: Login to GHCR
32+
uses: docker/login-action@v3
33+
with:
34+
registry: ghcr.io
35+
username: ${{ github.actor }}
36+
password: ${{ secrets.GITHUB_TOKEN }}
3537
- name: Set up Docker Buildx
3638
uses: docker/setup-buildx-action@v3
3739
- name: Build
3840
run: |
3941
PHP_VERSION="${{ matrix.php_version }}"
42+
# Get last cached successful builds
43+
TAGS=$(REPO="ghcr.io/${{ github.repository_owner }}/php" TAG_PREFIX="" docker buildx bake php${PHP_VERSION//.}-${{ matrix.variant }}-all --progress=quiet --print | jq -r '.target[].tags[]')
44+
for TAG in $TAGS; do
45+
docker pull --quiet ${TAG} || echo ""
46+
done;
47+
# Build the current builds
48+
REPO="ghcr.io/${{ github.repository_owner }}/php" \
49+
ARCH_SUFFIX="-${{ matrix.builder.arch }}" \
4050
TAG_PREFIX="rc${GITHUB_RUN_ID}-" \
4151
docker buildx bake \
4252
--set "*.platform=linux/${{ matrix.builder.arch }}" \
4353
--set "*.output=type=docker" \
44-
--load \
54+
--load --progress=quiet \
4555
php${PHP_VERSION//.}-${{ matrix.variant }}-all
4656
- name: Display tags built
4757
run: |
48-
docker image ls --filter="reference=thecodingmachine/php" --format "{{.CreatedAt}}\t{{.Size}}\t{{.Repository}}:{{.Tag}}"
58+
docker image ls --filter="reference=ghcr.io/${{ github.repository_owner }}/php" --format "{{.CreatedAt}}\t{{.Size}}\t{{.Repository}}:{{.Tag}}"
4959
- name: Test
5060
run: |
61+
REPO="ghcr.io/${{ github.repository_owner }}/php" \
5162
TAG_PREFIX="rc${GITHUB_RUN_ID}-" \
5263
PHP_VERSION="${{ matrix.php_version }}" \
64+
ARCH_SUFFIX="-${{ matrix.builder.arch }}" \
5365
BRANCH="v5" \
5466
VARIANT="${{ matrix.variant }}" \
5567
PLATFORM="linux/${{ matrix.builder.arch }}" \
5668
./tests-suite/bash_unit -f tap ./tests-suite/*.sh
69+
- name: Publish specific arch version
70+
if: > # Only from the main repo
71+
github.event_name == 'push' || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' ||
72+
(github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository)
73+
run: |
74+
PHP_VERSION="${{ matrix.php_version }}"
75+
TAGS=$(REPO="ghcr.io/${{ github.repository_owner }}/php" \
76+
ARCH_SUFFIX="-${{ matrix.builder.arch }}" \
77+
TAG_PREFIX="rc${GITHUB_RUN_ID}-" \
78+
docker buildx bake \
79+
--print --progress=quiet \
80+
php${PHP_VERSION//.}-${{ matrix.variant }}-all | jq -r '.target[].tags[]');
81+
for TAG in $TAGS; do docker push --quiet ${TAG}; done;
5782
58-
publish:
59-
# push ~ schedule
83+
merge-and-publish:
6084
if: ${{ github.event_name == 'push' || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' }}
6185
needs:
62-
- test
86+
- build
6387
runs-on: ubuntu-latest
64-
name: Publish ${{ matrix.php_version }}-${{ matrix.variant }} multi-arch to dockerhub
88+
name: Merge and publish ${{ matrix.php_version }}-${{ matrix.variant }}
6589
strategy:
6690
fail-fast: false
6791
matrix:
68-
php_version: ['8.5', '8.4', '8.3','8.2','8.1']
92+
# php_version: ['8.5', '8.4', '8.3','8.2','8.1']
93+
php_version: ['8.5']
6994
variant: ['apache','cli','fpm']
7095
steps:
7196
- name: Checkout
7297
uses: actions/checkout@v4
73-
- name: Set up QEMU
74-
uses: docker/setup-qemu-action@v3
7598
- name: Set up Docker Buildx
7699
uses: docker/setup-buildx-action@v3
100+
- name: Login to GHCR
101+
uses: docker/login-action@v3
102+
with:
103+
registry: ghcr.io
104+
username: ${{ github.actor }}
105+
password: ${{ secrets.GITHUB_TOKEN }}
77106
- name: Login to DockerHub
78107
uses: docker/login-action@v3
108+
if: ${{ github.repository_owner == 'thecodingmachine' }}
79109
with:
80110
username: ${{ secrets.DOCKERHUB_USERNAME }}
81111
password: ${{ secrets.DOCKERHUB_TOKEN }}
112+
- name: Install regctl
113+
uses: regclient/actions/regctl-installer@main
114+
with:
115+
release: 'v0.8.1'
82116
- name: Fetch minor version of php
83117
run: |
84-
# Build slim one
85-
PHP_VERSION="${{ matrix.php_version }}"
86-
TAG_PREFIX="rc${GITHUB_RUN_ID}-" \
87-
docker buildx bake \
88-
--set "*.platform=linux/amd64" \
89-
--set "*.output=type=docker" \
90-
--load \
91-
php${PHP_VERSION//.}-slim-${{ matrix.variant }}
118+
# Pull amd64 slim image to get PHP version
119+
docker pull --quiet ghcr.io/${{ github.repository_owner }}/php:rc${GITHUB_RUN_ID}-${{ matrix.php_version }}-v5-slim-${{ matrix.variant }}-amd64
92120
# Retrieve minor
93-
PHP_PATCH_MINOR=`docker run --rm thecodingmachine/php:rc${GITHUB_RUN_ID}-${{ matrix.php_version }}-v5-slim-${{ matrix.variant }} php -v | head -n1 | grep -P '\d+\.\d+\.\d+' -o | head -n1`
121+
PHP_PATCH_MINOR=`docker run --rm ghcr.io/${{ github.repository_owner }}/php:rc${GITHUB_RUN_ID}-${{ matrix.php_version }}-v5-slim-${{ matrix.variant }}-amd64 php -v | head -n1 | grep -P '\d+\.\d+\.\d+' -o | head -n1`
122+
echo "PHP_PATCH_MINOR=${PHP_PATCH_MINOR}"
94123
echo "PHP_PATCH_MINOR=${PHP_PATCH_MINOR}" >> $GITHUB_ENV
95-
- name: Display tags to build
124+
- name: Get list of images for this variant
125+
id: get-images
96126
run: |
97127
PHP_VERSION="${{ matrix.php_version }}"
98-
PHP_PATCH_MINOR="${{ env.PHP_PATCH_MINOR }}" \
128+
REPO="ghcr.io/${{ github.repository_owner }}/php" \
99129
TAG_PREFIX="rc${GITHUB_RUN_ID}-" \
100-
IS_RELEASE="1" \
101-
docker buildx bake php${PHP_VERSION//.}-${{ matrix.variant }}-all --print --progress plain | jq ".target[].tags | join(\" \")" -r > "/tmp/tags.log"
102-
cat "/tmp/tags.log"
103-
- name: Build and push ${{ matrix.php_version }}-${{ matrix.variant }}
130+
docker buildx bake \
131+
--print --progress=quiet \
132+
php${PHP_VERSION//.}-${{ matrix.variant }}-all | jq '.target[].tags[]'
133+
- name: Create multiarch manifests
104134
run: |
105135
PHP_VERSION="${{ matrix.php_version }}"
106-
PHP_PATCH_MINOR="${{ env.PHP_PATCH_MINOR }}" \
107-
TAG_PREFIX="rc${GITHUB_RUN_ID}-" \
108-
IS_RELEASE="1" \
109-
docker buildx bake \
110-
--set "*.platform=linux/amd64,linux/arm64" \
111-
--set "*.output=type=registry" \
112-
php${PHP_VERSION//.}-${{ matrix.variant }}-all
113-
- name: Push artifacts
114-
uses: actions/upload-artifact@v4
115-
with:
116-
name: ${{ matrix.php_version }}-${{ matrix.variant }}
117-
path: /tmp/tags.log
118-
retention-days: 60
136+
137+
# Get all targets from the bake group
138+
TARGETS=$(docker buildx bake php${PHP_VERSION//.}-${{ matrix.variant }}-all --progress=quiet --print | jq -r ".group[\"php${PHP_VERSION//.}-${{ matrix.variant }}-all\"].targets[]")
139+
140+
for TARGET in $TARGETS; do
141+
TAG_ORI=$(REPO="ghcr.io/${{ github.repository_owner }}/php" TAG_PREFIX="rc${GITHUB_RUN_ID}-" docker buildx bake ${TARGET} --progress=quiet --print | jq -r ".target | to_entries[] | select(.key == \"${TARGET}\") | .value.tags[0]")
142+
TAG_PATH=$(REPO="php" PHP_PATCH_MINOR="${{ env.PHP_PATCH_MINOR }}" docker buildx bake ${TARGET} --progress=quiet --print | jq -r ".target | to_entries[] | select(.key == \"${TARGET}\") | .value.tags[0]")
143+
TAG_MINOR=$(REPO="php" docker buildx bake ${TARGET} --progress=quiet --print | jq -r ".target | to_entries[] | select(.key == \"${TARGET}\") | .value.tags[0]")
144+
145+
# Create manifest for rc tag (always)
146+
echo "Creating manifest: ${TARGET} - ${TAG_ORI}"
147+
docker buildx imagetools create --progress=plain -t "${TAG_ORI}" "${TAG_ORI}-amd64" "${TAG_ORI}-arm64"
148+
149+
# Create manifest for PHP_PATCH
150+
regctl image copy "${TAG_ORI}" "ghcr.io/${{ github.repository_owner }}/${TAG_PATH}"
151+
# Create manifest for PHP_MINOR
152+
regctl image copy "${TAG_ORI}" "ghcr.io/${{ github.repository_owner }}/${TAG_MINOR}"
153+
154+
# SAME FOR DOCKERHUB (for the official repository)
155+
if [ "${{ github.repository_owner }}" == "thecodingmachine" ]; then
156+
# Create manifest for PHP_PATCH_MINOR
157+
regctl image copy "${TAG_ORI}" "thecodingmachine/${TAG_PATH}"
158+
# Create manifest for PHP_VERSION
159+
regctl image copy "${TAG_ORI}" "thecodingmachine/${TAG_MINOR}"
160+
fi
161+
done

Dockerfile.apache.node

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,15 @@ ENV BLACKFIRE_VERSION=${BLACKFIRE_VERSION}
2121
RUN apt update && \
2222
apt install -y --no-install-recommends gnupg && \
2323
if [[ "${NODE_VERSION}" -lt "16" ]]; then \
24-
curl -sL https://deb.nodesource.com/setup_${NODE_VERSION}.x | sudo bash -; \
24+
curl -sL --retry 5 --retry-delay 2 https://deb.nodesource.com/setup_${NODE_VERSION}.x | sudo bash -; \
2525
else \
2626
sudo mkdir -p /etc/apt/keyrings && \
27-
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \
27+
curl -fsSL --retry 5 --retry-delay 2 https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \
2828
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_VERSION.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list; \
2929
fi && \
3030
apt update && \
3131
apt install -y --no-install-recommends nodejs && \
32-
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
32+
curl -sS --retry 5 --retry-delay 2 https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
3333
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
3434
apt update && \
3535
apt install -y --no-install-recommends yarn && \

0 commit comments

Comments
 (0)