Skip to content

Commit 42ad54a

Browse files
committed
ci: add build action
1 parent d3bc887 commit 42ad54a

File tree

1 file changed

+202
-0
lines changed

1 file changed

+202
-0
lines changed

.github/workflows/build.yml

Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,202 @@
1+
---
2+
3+
concurrency:
4+
group: "${{ github.workflow }}-${{ github.ref }}"
5+
cancel-in-progress: true
6+
7+
on: # yamllint disable-line rule:truthy
8+
workflow_dispatch:
9+
push:
10+
branches:
11+
- master
12+
release:
13+
types:
14+
- released
15+
16+
env:
17+
DOCKER_NAMESPACE: wayofdev/php-dev
18+
GHCR_NAMESPACE: ghcr.io/wayofdev/docker-php-dev
19+
20+
name: 🚀 Build docker images with latest tag
21+
22+
jobs:
23+
build:
24+
strategy:
25+
fail-fast: false
26+
matrix:
27+
os_name: ["alpine"]
28+
php_version: ["8.1", "8.2", "8.3"]
29+
php_type: ["fpm", "cli", "supervisord"]
30+
builder: [{arch: "amd64", os: "ubuntu-latest"}, {arch: "arm64", os: "ubuntu-latest"}]
31+
runs-on: ${{ matrix.builder.os }}
32+
steps:
33+
34+
- name: 🌎 Set environment variables
35+
run: |
36+
php_version="${{ matrix.php_version }}"
37+
tag="${{ matrix.php_version }}-${{ matrix.php_type }}-${{ matrix.os_name }}-${{ matrix.builder.arch }}"
38+
php_version_slug="${php_version//./}"
39+
target="php-${php_version_slug}-${{ matrix.php_type }}-${{ matrix.os_name }}"
40+
echo "TARGET=${target}" >> $GITHUB_ENV
41+
echo "PLATFORM_CACHE_TAG=${tag}" >> $GITHUB_ENV
42+
43+
- name: 📦 Check out the codebase
44+
uses: actions/checkout@v4
45+
46+
- name: 🤖 Generate dist files
47+
run: ansible-playbook src/playbook.yml -l ${{ matrix.php_version }}-${{ matrix.php_type }}-${{ matrix.os_name }}
48+
49+
- name: 🖥️ Setup docker QEMU
50+
uses: docker/setup-qemu-action@v3
51+
with:
52+
platforms: linux/${{ matrix.builder.arch }}
53+
54+
- name: 🛠️ Set up Docker Buildx
55+
uses: docker/setup-buildx-action@v3
56+
with:
57+
platforms: linux/${{ matrix.builder.arch }}
58+
buildkitd-flags: "--debug"
59+
60+
- name: 🐳 Extract docker meta data
61+
id: meta
62+
uses: docker/metadata-action@v5
63+
with:
64+
images: |
65+
${{ env.DOCKER_NAMESPACE }}
66+
${{ env.GHCR_NAMESPACE }}
67+
tags: |
68+
type=raw,event=branch,value=latest
69+
type=ref,event=tag
70+
type=semver,pattern={{version}}
71+
type=semver,pattern={{major}}.{{minor}}
72+
flavor: |
73+
latest=false
74+
prefix=${{ matrix.php_version }}-${{ matrix.php_type }}-${{ matrix.os_name }}-
75+
76+
- name: ⚙️ Rename meta bake definition file
77+
run: |
78+
mv "${{ steps.meta.outputs.bake-file }}" "/tmp/bake-meta-${{ env.PLATFORM_CACHE_TAG }}.json"
79+
80+
- name: 📤 Upload meta bake definition
81+
uses: actions/upload-artifact@v4
82+
with:
83+
name: bake-meta-${{ env.PLATFORM_CACHE_TAG }}.json
84+
path: /tmp/bake-meta-*.json
85+
if-no-files-found: error
86+
retention-days: 1
87+
88+
- name: 🔑 Login to docker-hub
89+
uses: docker/login-action@v3
90+
with:
91+
username: ${{ secrets.DOCKER_USERNAME }}
92+
password: ${{ secrets.DOCKER_TOKEN }}
93+
94+
- name: 🔑 Login to GHCR
95+
uses: docker/login-action@v3
96+
with:
97+
registry: ghcr.io
98+
username: ${{ github.repository_owner }}
99+
password: ${{ secrets.GITHUB_TOKEN }}
100+
101+
- name: 🚀 Bake image and push to docker-hub and GHCR
102+
id: bake
103+
uses: docker/bake-action@v4
104+
with:
105+
targets: ${{ env.TARGET }}
106+
files: |
107+
./docker-bake.hcl
108+
/tmp/bake-meta-${{ env.PLATFORM_CACHE_TAG }}.json
109+
set: |
110+
*.tags=
111+
*.platform=linux/${{ matrix.builder.arch }}
112+
*.cache-from=type=gha,scope=build-${{ env.PLATFORM_CACHE_TAG }}
113+
*.cache-to=type=gha,scope=build-${{ env.PLATFORM_CACHE_TAG }}
114+
*.output=type=image,"name=${{ env.DOCKER_NAMESPACE }},${{ env.GHCR_NAMESPACE }}",push-by-digest=true,name-canonical=true,push=true
115+
116+
- name: 📥 Export digest
117+
run: |
118+
mkdir -p /tmp/digests
119+
echo "Bake Metadata: ${{ steps.bake.outputs.metadata }}"
120+
digest=$(echo '${{ steps.bake.outputs.metadata }}' | jq -r '.["${{ env.TARGET }}"]["containerimage.digest"]')
121+
if [[ -z "$digest" || "$digest" == "null" ]]; then
122+
echo "Digest not found."
123+
exit 1
124+
fi
125+
echo "Digest: $digest"
126+
touch "/tmp/digests/${digest#sha256:}"
127+
128+
- name: 📤 Upload digest
129+
uses: actions/upload-artifact@v4
130+
with:
131+
name: digests-${{ env.PLATFORM_CACHE_TAG }}
132+
path: /tmp/digests/*
133+
if-no-files-found: error
134+
retention-days: 1
135+
136+
merge:
137+
needs: build
138+
runs-on: ubuntu-latest
139+
steps:
140+
141+
- name: 📥 Download meta bake definitions
142+
uses: actions/download-artifact@v4
143+
with:
144+
pattern: bake-meta-*
145+
path: /tmp
146+
merge-multiple: true
147+
148+
- name: 📥 Download meta bake definitions
149+
uses: actions/download-artifact@v4
150+
with:
151+
pattern: digests-*
152+
path: /tmp/digests
153+
154+
- name: 🔑 Login to docker-hub
155+
uses: docker/login-action@v3
156+
with:
157+
username: ${{ secrets.DOCKER_USERNAME }}
158+
password: ${{ secrets.DOCKER_TOKEN }}
159+
160+
- name: 🔑 Login to GHCR
161+
uses: docker/login-action@v3
162+
with:
163+
registry: ghcr.io
164+
username: ${{ github.repository_owner }}
165+
password: ${{ secrets.GITHUB_TOKEN }}
166+
167+
- name: 🖥️ Setup docker QEMU
168+
uses: docker/setup-qemu-action@v3
169+
with:
170+
platforms: linux/amd64,linux/arm64
171+
172+
- name: 🛠️ Set up Docker Buildx
173+
uses: docker/setup-buildx-action@v3
174+
with:
175+
platforms: linux/amd64,linux/arm64
176+
buildkitd-flags: "--debug"
177+
178+
- name: 🚀 Create manifest list and push
179+
working-directory: /tmp
180+
run: |
181+
variants=($(ls bake-meta-*.json | sed -E 's/bake-meta-//; s/-amd64.json|-arm64.json//g' | sort -u))
182+
for variant in "${variants[@]}"; do
183+
184+
# Fetch digests for amd64 and arm64 architectures
185+
DIGEST_AMD64=$(basename $(ls /tmp/digests/digests-${variant}-amd64/*))
186+
DIGEST_ARM64=$(basename $(ls /tmp/digests/digests-${variant}-arm64/*))
187+
echo "Digest AMD64: $DIGEST_AMD64"
188+
echo "Digest ARM64: $DIGEST_ARM64"
189+
190+
# Create the manifest list for Docker Hub
191+
docker buildx imagetools create $(jq -cr ".target.\"docker-metadata-action\".tags | map(select(startswith(\"${DOCKER_NAMESPACE}\")) | \"-t \" + .) | join(\" \")" /tmp/bake-meta-${variant}-amd64.json) \
192+
"${DOCKER_NAMESPACE}@sha256:${DIGEST_AMD64}" \
193+
"${DOCKER_NAMESPACE}@sha256:${DIGEST_ARM64}"
194+
195+
# Create the manifest list for GHCR
196+
docker buildx imagetools create $(jq -cr ".target.\"docker-metadata-action\".tags | map(select(startswith(\"${GHCR_NAMESPACE}\")) | \"-t \" + .) | join(\" \")" /tmp/bake-meta-${variant}-amd64.json) \
197+
"${GHCR_NAMESPACE}@sha256:${DIGEST_AMD64}" \
198+
"${GHCR_NAMESPACE}@sha256:${DIGEST_ARM64}"
199+
200+
done
201+
202+
...

0 commit comments

Comments
 (0)