Skip to content

Commit 2df5ea4

Browse files
committed
ci: add workflow to deploy container images
Before: Recently, the member of Docker Free Team organization can't trigger Automated builds from Web interface. It means that we can't ship newer image easily anymore. After: Change deployment procedure to GitHub Actions. With this change, additionally ship triple multi-architecture tags for amd64, arm64 and armhf. NOTE: * v1.17.1-x.y tag ships alpine,amd64,arm64 and armhf images * v1.17.1-debian-am64-1.2 tag ships only amd64 image and re-label multi-architecture tags. Signed-off-by: Kentaro Hayashi <[email protected]>
1 parent da7da3f commit 2df5ea4

File tree

2 files changed

+259
-2
lines changed

2 files changed

+259
-2
lines changed

.github/workflows/docker-build.yml

+256
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,256 @@
1+
name: Publish Docker Image
2+
3+
on:
4+
push:
5+
tags:
6+
- v1.*
7+
8+
concurrency:
9+
group: ${{ github.head_ref || github.sha }}-${{ github.workflow }}
10+
cancel-in-progress: true
11+
12+
env:
13+
REPOSITORY: ${{ secrets.DOCKER_HUB_ORGS }}/fluentd-docker-image
14+
jobs:
15+
define-matrix:
16+
runs-on: ubuntu-latest
17+
env:
18+
ALL_COMPONENTS: >
19+
[
20+
"alpine",
21+
"arm64",
22+
"armhf",
23+
"amd64",
24+
]
25+
outputs:
26+
components: >
27+
${{ steps.arrange-components.outputs.for_all == 'true' && env.ALL_COMPONENTS
28+
|| format('["{0}"]', steps.arrange-components.outputs.component) }}
29+
steps:
30+
- id: arrange-components
31+
run: |
32+
echo "for_all=true" >> "$GITHUB_OUTPUT"
33+
for component in ${{ join(fromJSON(env.ALL_COMPONENTS), ' ') }}; do
34+
if [[ ${{ github.ref_name }} == *"$component"* ]]; then
35+
echo "for_all=false" >> "$GITHUB_OUTPUT"
36+
echo "component=$component" >> "$GITHUB_OUTPUT"
37+
break
38+
fi
39+
done
40+
build:
41+
needs: define-matrix
42+
runs-on: ubuntu-latest
43+
strategy:
44+
fail-fast: false
45+
matrix:
46+
component: ${{ fromJSON(needs.define-matrix.outputs.components) }}
47+
steps:
48+
- uses: actions/checkout@v4
49+
- name: Set up Docker Buildx
50+
uses: docker/setup-buildx-action@v3
51+
with:
52+
platforms: linux/amd64,linux/arm64,linux/arm/v7 # armhf
53+
- uses: docker/login-action@v3
54+
with:
55+
username: ${{ secrets.DOCKER_HUB_USERNAME }}
56+
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
57+
- name: Setup tags
58+
run: |
59+
set -x
60+
component=${{ matrix.component }}
61+
for target in $(make echo-all-images); do
62+
case $target in
63+
*$component*)
64+
;;
65+
*)
66+
continue
67+
;;
68+
esac
69+
branch=$(echo $target | cut -d'/' -f1)
70+
tags=$(echo $target | cut -d':' -f2-)
71+
tag1=$(echo $tags | cut -d',' -f1)
72+
tag2=$(echo $tags | cut -d',' -f2)
73+
tag3=$(echo $tags | cut -d',' -f3)
74+
case $component in
75+
*alpine*)
76+
echo "CONTEXT=${branch}/${component}" >> ${GITHUB_ENV}
77+
echo "ALPINETAGS=${{ env.REPOSITORY }}:${tag1},${{ env.REPOSITORY }}:${tag2},${{ env.REPOSITORY }}:${tag3}" >> ${GITHUB_ENV}
78+
;;
79+
*arm64*)
80+
echo "CONTEXT=${branch}/${component}/debian" >> ${GITHUB_ENV}
81+
echo "ARM64TAGS=${{ env.REPOSITORY }}:${tag1},${{ env.REPOSITORY }}:${tag2},${{ env.REPOSITORY }}:${tag3}" >> ${GITHUB_ENV}
82+
;;
83+
*armhf*)
84+
echo "CONTEXT=${branch}/${component}/debian" >> ${GITHUB_ENV}
85+
echo "ARMHFTAGS=${{ env.REPOSITORY }}:${tag1},${{ env.REPOSITORY }}:${tag2},${{ env.REPOSITORY }}:${tag3}" >> ${GITHUB_ENV}
86+
;;
87+
*amd64*)
88+
echo "CONTEXT=${branch}/debian" >> ${GITHUB_ENV}
89+
echo "AMD64TAGS=${{ env.REPOSITORY }}:${tag1},${{ env.REPOSITORY }}:${tag2},${{ env.REPOSITORY }}:${tag3}" >> ${GITHUB_ENV}
90+
;;
91+
esac
92+
done
93+
- name: Build and push for alpine
94+
if: ${{ env.ALPINETAGS }}
95+
uses: docker/build-push-action@v6
96+
with:
97+
context: ${{ env.CONTEXT }}
98+
provenance: false
99+
push: true
100+
platforms: linux/amd64
101+
tags: ${{ env.ALPINETAGS }}
102+
# dare to use old mediatype (application/vnd.docker.distribution.manifest.v2+json)
103+
outputs: oci-mediatypes=false
104+
- name: Build and push for amd64
105+
if: ${{ env.AMD64TAGS }}
106+
uses: docker/build-push-action@v6
107+
with:
108+
context: ${{ env.CONTEXT }}
109+
provenance: false
110+
push: true
111+
platforms: linux/amd64
112+
tags: ${{ env.AMD64TAGS }}
113+
# dare to use old mediatype (application/vnd.docker.distribution.manifest.v2+json)
114+
outputs: oci-mediatypes=false
115+
- name: Build and push for arm64
116+
if: ${{ env.ARM64TAGS }}
117+
uses: docker/build-push-action@v6
118+
with:
119+
context: ${{ env.CONTEXT }}
120+
provenance: false
121+
push: true
122+
platforms: linux/arm64
123+
cache-from: type=gha
124+
cache-to: type=gha,mode=max
125+
tags: ${{ env.ARM64TAGS }}
126+
# dare to use old mediatype (application/vnd.docker.distribution.manifest.v2+json)
127+
outputs: oci-mediatypes=false
128+
- name: Build and push for armhf
129+
if: ${{ env.ARMHFTAGS }}
130+
uses: docker/build-push-action@v6
131+
with:
132+
context: ${{ env.CONTEXT }}
133+
provenance: false
134+
push: true
135+
platforms: linux/arm/v7
136+
cache-from: type=gha
137+
cache-to: type=gha,mode=max
138+
tags: ${{ env.ARMHFTAGS }}
139+
# dare to use old mediatype (application/vnd.docker.distribution.manifest.v2+json)
140+
outputs: oci-mediatypes=false
141+
manifest:
142+
needs: [define-matrix, build]
143+
runs-on: ubuntu-latest
144+
strategy:
145+
fail-fast: false
146+
matrix:
147+
component: ${{ fromJSON(needs.define-matrix.outputs.components) }}
148+
steps:
149+
- uses: actions/checkout@v4
150+
- uses: docker/login-action@v3
151+
with:
152+
username: ${{ secrets.DOCKER_HUB_USERNAME }}
153+
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
154+
- name: Create manifest
155+
if: ${{ matrix.component }} != "alpine"
156+
run: |
157+
component=${{ matrix.component }}
158+
for target in $(make echo-all-images); do
159+
tags=$(echo $target | cut -d':' -f2-)
160+
tag1=$(echo $tags | cut -d',' -f1)
161+
tag2=$(echo $tags | cut -d',' -f2)
162+
tag3=$(echo $tags | cut -d',' -f3)
163+
case $target in
164+
*amd64*)
165+
MULTIARCH_AMD64_TAG=${tag1/amd64-/}
166+
MULTIARCH_AMD64_SHORT_TAG=${tag2/amd64-/}
167+
AMD64TAG=${tag1}
168+
SHORT_AMD64TAG=${tag2}
169+
;;
170+
*arm64*)
171+
MULTIARCH_ARM64_TAG=${tag1/arm64-/}
172+
MULTIARCH_ARM64_SHORT_TAG=${tag2/arm64-/}
173+
ARM64TAG=${tag1}
174+
SHORT_ARM64TAG=${tag2}
175+
;;
176+
*armhf*)
177+
MULTIARCH_ARMHF_TAG=${tag1/armhf-/}
178+
MULTIARCH_ARMHF_SHORT_TAG=${tag2/armhf-/}
179+
ARMHFTAG=${tag1}
180+
SHORT_ARMHFTAG=${tag2}
181+
;;
182+
*alpine*)
183+
;;
184+
esac
185+
done
186+
# v1.xx.y-debian-n.m
187+
if [ ${MULTIARCH_AMD64_TAG} != ${MULTIARCH_ARM64_TAG} -o ${MULTIARCH_AMD64_TAG} != ${MULTIARCH_ARMHF_TAG} -o ${MULTIARCH_ARM64_TAG} != ${MULTIARCH_ARMHF_TAG} ]; then
188+
echo "Multiarch tag (v1.x.y-debian-(ARCH)-n.m) must be same for amd64, arm64 and armhf: ${MULTIARCH_AMD64_TAG}, ${MULTIARCH_ARM64_TAG}, ${MULTIARCH_ARMHF_TAG}"
189+
else
190+
docker buildx imagetools create -t ${{ env.REPOSITORY }}:${MULTIARCH_AMD64_TAG} \
191+
${{ env.REPOSITORY }}:${AMD64TAG} \
192+
${{ env.REPOSITORY }}:${ARM64TAG} \
193+
${{ env.REPOSITORY }}:${ARMHFTAG}
194+
fi
195+
# v1.xx-debian-n.m
196+
if [ ${MULTIARCH_AMD64_SHORT_TAG} != ${MULTIARCH_ARM64_SHORT_TAG} -o ${MULTIARCH_AMD64_SHORT_TAG} != ${MULTIARCH_ARMHF_SHORT_TAG} -o ${MULTIARCH_ARM64_SHORT_TAG} != ${MULTIARCH_ARMHF_SHORT_TAG} ]; then
197+
echo "Multiarch tag (v1.xx-debian-n.m must be same for amd64, arm64 and armhf: ${MULTIARCH_AMD64_SHORT_TAG}, ${MULTIARCH_ARM64_SHORT_TAG}, ${MULTIARCH_ARMHF_SHORT_TAG}"
198+
else
199+
docker buildx imagetools create -t ${{ env.REPOSITORY }}:${MULTIARCH_AMD64_SHORT_TAG} \
200+
${{ env.REPOSITORY }}:${SHORT_AMD64TAG} \
201+
${{ env.REPOSITORY }}:${SHORT_ARM64TAG} \
202+
${{ env.REPOSITORY }}:${SHORT_ARMHFTAG}
203+
fi
204+
# edge-debian
205+
docker buildx imagetools create -t ${{ env.REPOSITORY }}:edge-debian \
206+
${{ env.REPOSITORY }}:edge-debian-amd64 \
207+
${{ env.REPOSITORY }}:edge-debian-arm64 \
208+
${{ env.REPOSITORY }}:edge-debian-armhf
209+
echo "MULTIARCH_AMD64_TAG=${MULTIARCH_AMD64_TAG}" >> ${GITHUB_ENV}
210+
echo "MULTIARCH_AMD64_SHORT_TAG=${MULTIARCH_AMD64_SHORT_TAG}" >> ${GITHUB_ENV}
211+
echo "AMD64TAG=${AMD64TAG}" >> ${GITHUB_ENV}
212+
echo "SHORT_AMD64TAG=${SHORT_ARM64TAG}" >> ${GITHUB_ENV}
213+
echo "MULTIARCH_ARM64_TAG=${MULTIARCH_ARM64_TAG}" >> ${GITHUB_ENV}
214+
echo "MULTIARCH_ARM64_SHORT_TAG=${MULTIARCH_ARM64_SHORT_TAG}" >> ${GITHUB_ENV}
215+
echo "ARM64TAG=${ARM64TAG}" >> ${GITHUB_ENV}
216+
echo "SHORT_ARM64TAG=${SHORT_ARM64TAG}" >> ${GITHUB_ENV}
217+
echo "MULTIARCH_ARMHF_TAG=${MULTIARCH_ARMHF_TAG}" >> ${GITHUB_ENV}
218+
echo "MULTIARCH_ARMHF_SHORT_TAG=${MULTIARCH_ARMHF_SHORT_TAG}" >> ${GITHUB_ENV}
219+
echo "ARMHFTAG=${ARMHFTAG}" >> ${GITHUB_ENV}
220+
echo "SHORT_ARMHFTAG=${SHORT_ARMHFTAG}" >> ${GITHUB_ENV}
221+
- name: Inspect manifest ${{ env.AMD64TAG }}
222+
run: docker manifest inspect ${{ env.REPOSITORY }}:${{ env.AMD64TAG }}
223+
- name: Inspect manifest ${{ env.ARM64TAG }}
224+
run: docker manifest inspect ${{ env.REPOSITORY }}:${{ env.ARM64TAG }}
225+
- name: Inspect manifest ${{ env.ARMHFTAG }}
226+
run: docker manifest inspect ${{ env.REPOSITORY }}:${{ env.ARMHFTAG }}
227+
- name: Inspect manifest ${{ env.MULTIARCH_AMD64_TAG }}
228+
run: docker manifest inspect ${{ env.REPOSITORY }}:${{ env.MULTIARCH_AMD64_TAG }}
229+
- name: Inspect manifest ${{ env.MULTIARCH_ARM64_TAG }}
230+
run: docker manifest inspect ${{ env.REPOSITORY }}:${{ env.MULTIARCH_ARM64_TAG }}
231+
- name: Inspect manifest ${{ env.MULTIARCH_ARMHF_TAG }}
232+
run: docker manifest inspect ${{ env.REPOSITORY }}:${{ env.MULTIARCH_ARMHF_TAG }}
233+
- name: Inspect manifest ${{ env.MULTIARCH_AMD64_SHORT_TAG }}
234+
run: docker manifest inspect ${{ env.REPOSITORY }}:${{ env.MULTIARCH_AMD64_SHORT_TAG }}
235+
- name: Inspect manifest ${{ env.MULTIARCH_ARM64_SHORT_TAG }}
236+
run: docker manifest inspect ${{ env.REPOSITORY }}:${{ env.MULTIARCH_ARM64_SHORT_TAG }}
237+
- name: Inspect manifest ${{ env.MULTIARCH_ARMHF_SHORT_TAG }}
238+
run: docker manifest inspect ${{ env.REPOSITORY }}:${{ env.MULTIARCH_ARMHF_SHORT_TAG }}
239+
- name: Inspect ${{ env.AMD64TAG }} with buildx
240+
run: docker buildx imagetools inspect ${{ env.REPOSITORY }}:${{ env.AMD64TAG }}
241+
- name: Inspect ${{ env.ARM64TAG }} with buildx
242+
run: docker buildx imagetools inspect ${{ env.REPOSITORY }}:${{ env.ARM64TAG }}
243+
- name: Inspect ${{ env.ARMHFTAG }} with buildx
244+
run: docker buildx imagetools inspect ${{ env.REPOSITORY }}:${{ env.ARMHFTAG }}
245+
- name: Inspect ${{ env.MULTIARCH_AMD64_TAG }} with buildx
246+
run: docker buildx imagetools inspect ${{ env.REPOSITORY }}:${{ env.MULTIARCH_AMD64_TAG }}
247+
- name: Inspect ${{ env.MULTIARCH_ARM64_TAG }} with buildx
248+
run: docker buildx imagetools inspect ${{ env.REPOSITORY }}:${{ env.MULTIARCH_ARM64_TAG }}
249+
- name: Inspect ${{ env.MULTIARCH_ARMHF_TAG }} with buildx
250+
run: docker buildx imagetools inspect ${{ env.REPOSITORY }}:${{ env.MULTIARCH_ARMHF_TAG }}
251+
- name: Inspect ${{ env.MULTIARCH_AMD64_SHORT_TAG }} with buildx
252+
run: docker buildx imagetools inspect ${{ env.REPOSITORY }}:${{ env.MULTIARCH_AMD64_SHORT_TAG }}
253+
- name: Inspect ${{ env.MULTIARCH_ARM64_SHORT_TAG }} with buildx
254+
run: docker buildx imagetools inspect ${{ env.REPOSITORY }}:${{ env.MULTIARCH_ARM64_SHORT_TAG }}
255+
- name: Inspect ${{ env.MULTIARCH_ARMHF_SHORT_TAG }} with buildx
256+
run: docker buildx imagetools inspect ${{ env.REPOSITORY }}:${{ env.MULTIARCH_ARMHF_SHORT_TAG }}

Makefile

+3-2
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ TAGS ?= $(word 2,$(subst :, ,$(word 1,$(ALL_IMAGES))))
4444

4545
no-cache ?= no
4646

47-
47+
echo-all-images:
48+
@echo $(X86_IMAGES) $(ARM_IMAGES) $(ARM64_IMAGES)
4849

4950
comma := ,
5051
empty :=
@@ -139,7 +140,7 @@ sbom-all:
139140
# Usage:
140141
# make src [DOCKERFILE=] [VERSION=] [TAGS=t1,t2,...]
141142

142-
src: dockerfile fluent.conf entrypoint.sh post-push-hook post-checkout-hook
143+
src: dockerfile fluent.conf entrypoint.sh post-checkout-hook
143144

144145

145146

0 commit comments

Comments
 (0)