Skip to content

Commit d9cd9a4

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

32 files changed

Lines changed: 268 additions & 186 deletions

.github/workflows/legacy-v5.yml

Lines changed: 97 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,54 @@ 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 --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+
--load \
45+
php${PHP_VERSION//.}-${{ matrix.variant }}-all
46+
- name: Display tags built
47+
run: |
48+
docker image ls --filter="reference=ghcr.io/${{ github.repository_owner }}/php" --format "{{.CreatedAt}}\t{{.Size}}\t{{.Repository}}:{{.Tag}}"
49+
50+
merge-and-publish:
51+
needs:
52+
- build
853
runs-on: ubuntu-latest
9-
name: Publish ${{ matrix.php_version }}-${{ matrix.variant }} multi-arch to dockerhub
54+
name: Merge and publish ${{ matrix.php_version }}-${{ matrix.variant }}
1055
strategy:
1156
fail-fast: false
1257
matrix:
@@ -15,49 +60,69 @@ jobs:
1560
steps:
1661
- name: Checkout
1762
uses: actions/checkout@v4
18-
- name: Set up QEMU
19-
uses: docker/setup-qemu-action@v3
2063
- name: Set up Docker Buildx
2164
uses: docker/setup-buildx-action@v3
65+
- name: Login to GHCR
66+
uses: docker/login-action@v3
67+
with:
68+
registry: ghcr.io
69+
username: ${{ github.actor }}
70+
password: ${{ secrets.GITHUB_TOKEN }}
2271
- name: Login to DockerHub
2372
uses: docker/login-action@v3
73+
if: ${{ github.repository_owner == 'thecodingmachine' }}
2474
with:
2575
username: ${{ secrets.DOCKERHUB_USERNAME }}
2676
password: ${{ secrets.DOCKERHUB_TOKEN }}
77+
- name: Install regctl
78+
uses: regclient/actions/regctl-installer@main
79+
with:
80+
release: 'v0.8.1'
2781
- name: Fetch minor version of php
2882
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 }}
83+
# Pull amd64 slim image to get PHP version
84+
docker pull ghcr.io/${{ github.repository_owner }}/php:rc${GITHUB_RUN_ID}-${{ matrix.php_version }}-v5-slim-${{ matrix.variant }}-amd64
3785
# 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`
86+
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`
3987
echo "PHP_PATCH_MINOR=${PHP_PATCH_MINOR}" >> $GITHUB_ENV
40-
- name: Display tags to build
88+
- name: Get list of images for this variant
89+
id: get-images
4190
run: |
4291
PHP_VERSION="${{ matrix.php_version }}"
43-
PHP_PATCH_MINOR="${{ env.PHP_PATCH_MINOR }}" \
92+
REPO="ghcr.io/${{ github.repository_owner }}/php" \
4493
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 }}
94+
docker buildx bake \
95+
--print \
96+
php${PHP_VERSION//.}-${{ matrix.variant }}-all | jq '.target[].tags[]'
97+
- name: Create multiarch manifests
4998
run: |
5099
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
100+
101+
# Get all targets from the bake group
102+
TARGETS=$(docker buildx bake php${PHP_VERSION//.}-${{ matrix.variant }}-all --print | jq -r '.group["php${PHP_VERSION//.}-${{ matrix.variant }}-all"].targets[]')
103+
104+
for TARGET in $TARGETS; do
105+
TAG_ORI=$(REPO="ghcr.io/${{ github.repository_owner }}/php" TAG_PREFIX="rc${GITHUB_RUN_ID}-" docker buildx bake ${TARGET} --print | jq -r '.target[].tags[]')
106+
TAG_PATH=$(REPO="php" PHP_PATCH_MINOR="${{ env.PHP_PATCH_MINOR }}" docker buildx bake ${TARGET} --print | jq -r '.target[].tags[]')
107+
TAG_MINOR=$(REPO="php" docker buildx bake ${TARGET} --print | jq -r '.target[].tags[]')
108+
echo "Processing target: $TARGET"
109+
# Extract the tag suffix from generated tag (e.g., php:8.5-v5-slim-apache -> v5-slim-apache)
110+
TAG_SUFFIX=$(echo $TARGET | sed "s/^.*${PHP_VERSION}-v5-/v5-/")
111+
112+
# Create manifest for rc tag (always)
113+
echo "Creating manifest: ${TARGET}"
114+
docker buildx imagetools create -t ${TAG_ORI} ${TAG_ORI}-amd64 ${TAG_ORI}-arm64
115+
116+
# Create manifest for PHP_PATCH
117+
regctl image copy ${TAG_ORI} ghcr.io/${{ github.repository_owner }}/${TAG_PATH}
118+
# Create manifest for PHP_MINOR
119+
regctl image copy ${TAG_ORI} ghcr.io/${{ github.repository_owner }}/${TAG_MINOR}
120+
121+
# SAME FOR DOCKERHUB (for the official repository)
122+
if [ "${{ github.repository_owner }}" == "thecodingmachine" ]; then
123+
# Create manifest for PHP_PATCH_MINOR
124+
regctl image copy ${TAG_ORI} thecodingmachine/${TAG_PATH}
125+
# Create manifest for PHP_VERSION
126+
regctl image copy ${TAG_ORI} thecodingmachine/${TAG_MINOR}
127+
fi
128+
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: 87 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -7,36 +7,45 @@ 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:
1920
php_version: ['8.5', '8.4', '8.3','8.2','8.1']
2021
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"}]
22+
builder: [ {arch: "amd64", os: "ubuntu-24.04"}, {arch: "arm64", os: "ubuntu-24.04-arm"}]
2323
runs-on: ${{ matrix.builder.os }}
24-
name: Test ${{ matrix.php_version }}-${{ matrix.variant }} ${{ matrix.builder.arch }} only
24+
name: Build&test ${{ matrix.php_version }}-${{ matrix.variant }} ${{ matrix.builder.arch }}
2525
steps:
2626
- name: Checkout
2727
uses: actions/checkout@v4
2828
- 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' }}
3229
uses: docker-practice/actions-setup-docker@master
33-
- name: Set up QEMU
34-
uses: docker/setup-qemu-action@v3
30+
- name: Login to GHCR
31+
uses: docker/login-action@v3
32+
with:
33+
registry: ghcr.io
34+
username: ${{ github.actor }}
35+
password: ${{ secrets.GITHUB_TOKEN }}
3536
- name: Set up Docker Buildx
3637
uses: docker/setup-buildx-action@v3
3738
- name: Build
3839
run: |
3940
PHP_VERSION="${{ matrix.php_version }}"
41+
# Get last cached successful builds
42+
TARGETS=$(REPO="ghcr.io/${{ github.repository_owner }}/php" TAG_PREFIX="" docker buildx bake php${PHP_VERSION//.}-${{ matrix.variant }}-all --print | jq -r '.target[].tags[]')
43+
for TARGET in $TARGETS; do
44+
docker pull --quiet ${TARGET} || echo ""
45+
done;
46+
# Build the current builds
47+
REPO="ghcr.io/${{ github.repository_owner }}/php" \
48+
ARCH_SUFFIX="-${{ matrix.builder.arch }}" \
4049
TAG_PREFIX="rc${GITHUB_RUN_ID}-" \
4150
docker buildx bake \
4251
--set "*.platform=linux/${{ matrix.builder.arch }}" \
@@ -45,23 +54,37 @@ jobs:
4554
php${PHP_VERSION//.}-${{ matrix.variant }}-all
4655
- name: Display tags built
4756
run: |
48-
docker image ls --filter="reference=thecodingmachine/php" --format "{{.CreatedAt}}\t{{.Size}}\t{{.Repository}}:{{.Tag}}"
57+
docker image ls --filter="reference=ghcr.io/${{ github.repository_owner }}/php" --format "{{.CreatedAt}}\t{{.Size}}\t{{.Repository}}:{{.Tag}}"
4958
- name: Test
5059
run: |
60+
REPO="ghcr.io/${{ github.repository_owner }}/php" \
5161
TAG_PREFIX="rc${GITHUB_RUN_ID}-" \
5262
PHP_VERSION="${{ matrix.php_version }}" \
63+
ARCH_SUFFIX="-${{ matrix.builder.arch }}" \
5364
BRANCH="v5" \
5465
VARIANT="${{ matrix.variant }}" \
5566
PLATFORM="linux/${{ matrix.builder.arch }}" \
5667
./tests-suite/bash_unit -f tap ./tests-suite/*.sh
68+
- name: Publish specific arch version
69+
if: > # Only from the main repo
70+
github.event_name == 'push' || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' ||
71+
(github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository)
72+
run: |
73+
PHP_VERSION="${{ matrix.php_version }}"
74+
TAGS=$(REPO="ghcr.io/${{ github.repository_owner }}/php" \
75+
ARCH_SUFFIX="-${{ matrix.builder.arch }}" \
76+
TAG_PREFIX="rc${GITHUB_RUN_ID}-" \
77+
docker buildx bake \
78+
--print \
79+
php${PHP_VERSION//.}-${{ matrix.variant }}-all | jq -r '.target[].tags[]');
80+
for TAG in $TAGS; do docker push --quiet ${TAG}; done;
5781
58-
publish:
59-
# push ~ schedule
82+
merge-and-publish:
6083
if: ${{ github.event_name == 'push' || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' }}
6184
needs:
62-
- test
85+
- build
6386
runs-on: ubuntu-latest
64-
name: Publish ${{ matrix.php_version }}-${{ matrix.variant }} multi-arch to dockerhub
87+
name: Merge and publish ${{ matrix.php_version }}-${{ matrix.variant }}
6588
strategy:
6689
fail-fast: false
6790
matrix:
@@ -70,49 +93,69 @@ jobs:
7093
steps:
7194
- name: Checkout
7295
uses: actions/checkout@v4
73-
- name: Set up QEMU
74-
uses: docker/setup-qemu-action@v3
7596
- name: Set up Docker Buildx
7697
uses: docker/setup-buildx-action@v3
98+
- name: Login to GHCR
99+
uses: docker/login-action@v3
100+
with:
101+
registry: ghcr.io
102+
username: ${{ github.actor }}
103+
password: ${{ secrets.GITHUB_TOKEN }}
77104
- name: Login to DockerHub
78105
uses: docker/login-action@v3
106+
if: ${{ github.repository_owner == 'thecodingmachine' }}
79107
with:
80108
username: ${{ secrets.DOCKERHUB_USERNAME }}
81109
password: ${{ secrets.DOCKERHUB_TOKEN }}
110+
- name: Install regctl
111+
uses: regclient/actions/regctl-installer@main
112+
with:
113+
release: 'v0.8.1'
82114
- name: Fetch minor version of php
83115
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 }}
116+
# Pull amd64 slim image to get PHP version
117+
docker pull ghcr.io/${{ github.repository_owner }}/php:rc${GITHUB_RUN_ID}-${{ matrix.php_version }}-v5-slim-${{ matrix.variant }}-amd64
92118
# 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`
119+
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`
94120
echo "PHP_PATCH_MINOR=${PHP_PATCH_MINOR}" >> $GITHUB_ENV
95-
- name: Display tags to build
121+
- name: Get list of images for this variant
122+
id: get-images
96123
run: |
97124
PHP_VERSION="${{ matrix.php_version }}"
98-
PHP_PATCH_MINOR="${{ env.PHP_PATCH_MINOR }}" \
125+
REPO="ghcr.io/${{ github.repository_owner }}/php" \
99126
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 }}
127+
docker buildx bake \
128+
--print \
129+
php${PHP_VERSION//.}-${{ matrix.variant }}-all | jq '.target[].tags[]'
130+
- name: Create multiarch manifests
104131
run: |
105132
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
133+
134+
# Get all targets from the bake group
135+
TARGETS=$(docker buildx bake php${PHP_VERSION//.}-${{ matrix.variant }}-all --print | jq -r '.group["php${PHP_VERSION//.}-${{ matrix.variant }}-all"].targets[]')
136+
137+
for TARGET in $TARGETS; do
138+
TAG_ORI=$(REPO="ghcr.io/${{ github.repository_owner }}/php" TAG_PREFIX="rc${GITHUB_RUN_ID}-" docker buildx bake ${TARGET} --print | jq -r '.target[].tags[]')
139+
TAG_PATH=$(REPO="php" PHP_PATCH_MINOR="${{ env.PHP_PATCH_MINOR }}" docker buildx bake ${TARGET} --print | jq -r '.target[].tags[]')
140+
TAG_MINOR=$(REPO="php" docker buildx bake ${TARGET} --print | jq -r '.target[].tags[]')
141+
echo "Processing target: $TARGET"
142+
# Extract the tag suffix from generated tag (e.g., php:8.5-v5-slim-apache -> v5-slim-apache)
143+
TAG_SUFFIX=$(echo $TARGET | sed "s/^.*${PHP_VERSION}-v5-/v5-/")
144+
145+
# Create manifest for rc tag (always)
146+
echo "Creating manifest: ${TARGET}"
147+
docker buildx imagetools create -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)