1
+ # https://docs.docker.com/build/ci/github-actions/multi-platform/#distribute-build-across-multiple-runners
1
2
name : Build and publish Docker image
2
3
3
4
on :
4
5
workflow_dispatch :
6
+ inputs :
7
+ tag :
8
+ description : Tag of the image
9
+ required : true
10
+ type : string
5
11
release :
6
12
types : [published]
7
13
8
14
env :
9
15
USERNAME : yyoung01
10
- REGISTRY_IMAGE : yyoung01/nazurin
16
+ DOCKERHUB_REPO : yyoung01/nazurin
17
+ GHCR_REPO : ghcr.io/${{ github.repository }}
11
18
12
19
jobs :
13
20
build :
@@ -22,104 +29,100 @@ jobs:
22
29
- linux/amd64
23
30
- linux/arm64
24
31
steps :
25
- -
26
- name : Checkout
32
+ - name : Prepare
33
+ run : |
34
+ platform=${{ matrix.platform }}
35
+ echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
36
+ - name : Checkout
27
37
uses : actions/checkout@v3
28
- -
29
- name : Docker meta
38
+ - name : Docker meta
30
39
id : meta
31
- uses : docker/metadata-action@v4
40
+ uses : docker/metadata-action@v5
32
41
with :
33
42
images : |
34
- ${{ env.REGISTRY_IMAGE }}
35
- ghcr.io/${{ github.repository }}
36
- -
37
- name : Set up QEMU
38
- uses : docker/setup-qemu-action@v2
39
- -
40
- name : Set up Docker Buildx
41
- uses : docker/setup-buildx-action@v2
42
- -
43
- name : Login to Docker Hub
44
- uses : docker/login-action@v2
43
+ ${{ env.DOCKERHUB_REPO }}
44
+ ${{ env.GHCR_REPO }}
45
+ - name : Set up QEMU
46
+ uses : docker/setup-qemu-action@v3
47
+ - name : Set up Docker Buildx
48
+ uses : docker/setup-buildx-action@v3
49
+ - name : Login to Docker Hub
50
+ uses : docker/login-action@v3
45
51
with :
46
52
username : ${{ env.USERNAME }}
47
53
password : ${{ secrets.DOCKER_PASSWORD }}
48
- -
49
- name : Log in to the Container registry
50
- uses : docker/login-action@v2
54
+ - name : Log in to the Container registry
55
+ uses : docker/login-action@v3
51
56
with :
52
57
registry : ghcr.io
53
58
username : ${{ github.actor }}
54
59
password : ${{ secrets.GITHUB_TOKEN }}
55
- -
56
- name : Build and push by digest
60
+ - name : Build and push by digest
57
61
id : build
58
- uses : docker/build-push-action@v4
62
+ uses : docker/build-push-action@v6
59
63
with :
60
- context : .
64
+ # Result in an empty layer in GHCR if set to true
61
65
provenance : false
62
66
platforms : ${{ matrix.platform }}
63
67
labels : ${{ steps.meta.outputs.labels }}
64
- outputs : type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true
68
+ outputs : type=image," name=${{ env.DOCKERHUB_REPO }},${{ env.GHCR_REPO }}" ,push-by-digest=true,name-canonical=true,push=true
65
69
file : ${{ (matrix.platform == 'linux/amd64') && 'Dockerfile' || 'Dockerfile.debian' }}
66
- -
67
- name : Export digest
70
+ - name : Export digest
68
71
run : |
69
- mkdir -p /tmp /digests
72
+ mkdir -p ${{ runner.temp }} /digests
70
73
digest="${{ steps.build.outputs.digest }}"
71
- touch "/tmp/digests/${digest#sha256:}"
72
- -
73
- name : Upload digest
74
- uses : actions/upload-artifact@v3
74
+ touch "${{ runner.temp }}/digests/${digest#sha256:}"
75
+ - name : Upload digest
76
+ uses : actions/upload-artifact@v4
75
77
with :
76
- name : digests
77
- path : /tmp /digests/*
78
+ name : digests-${{ env.PLATFORM_PAIR }}
79
+ path : ${{ runner.temp }} /digests/*
78
80
if-no-files-found : error
79
81
retention-days : 1
80
-
82
+
81
83
merge :
82
84
runs-on : ubuntu-latest
83
85
needs :
84
86
- build
85
87
steps :
86
- -
87
- name : Download digests
88
- uses : actions/download-artifact@v3
88
+ - name : Download digests
89
+ uses : actions/download-artifact@v4
89
90
with :
90
- name : digests
91
- path : /tmp/digests
92
- -
93
- name : Set up Docker Buildx
94
- uses : docker/setup-buildx-action@v2
95
- -
96
- name : Docker meta
91
+ path : ${{ runner.temp }}/digests
92
+ pattern : digests-*
93
+ merge-multiple : true
94
+ - name : Set up Docker Buildx
95
+ uses : docker/setup-buildx-action@v3
96
+ - name : Docker meta
97
97
id : meta
98
- uses : docker/metadata-action@v4
98
+ uses : docker/metadata-action@v5
99
99
with :
100
100
images : |
101
- ${{ env.REGISTRY_IMAGE }}
102
- ghcr.io/${{ github.repository }}
103
- -
104
- name : Login to Docker Hub
105
- uses : docker/login-action@v2
101
+ ${{ env.DOCKERHUB_REPO }}
102
+ ${{ env.GHCR_REPO }}
103
+ tags : |
104
+ type=semver,pattern={{raw}}
105
+ type=raw,value=${{ inputs.tag }},enable=${{ github.event_name == 'workflow_dispatch' }}
106
+ type=raw,value=latest,enable={{is_default_branch}}
107
+ - name : Login to Docker Hub
108
+ uses : docker/login-action@v3
106
109
with :
107
110
username : ${{ env.USERNAME }}
108
111
password : ${{ secrets.DOCKER_PASSWORD }}
109
- -
110
- name : Log in to the Container registry
111
- uses : docker/login-action@v2
112
+ - name : Log in to the Container registry
113
+ uses : docker/login-action@v3
112
114
with :
113
115
registry : ghcr.io
114
116
username : ${{ github.actor }}
115
117
password : ${{ secrets.GITHUB_TOKEN }}
116
- -
117
- name : Create manifest list and push
118
- working-directory : /tmp/digests
118
+ - name : Create manifest list and push
119
+ working-directory : ${{ runner.temp }}/digests
119
120
run : |
120
121
docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
121
- $(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *)
122
- -
123
- name : Inspect image
122
+ $(printf '${{ env.DOCKERHUB_REPO }}@sha256:%s ' *)
123
+ docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
124
+ $(printf '${{ env.GHCR_REPO }}@sha256:%s ' *)
125
+ - name : Inspect image
124
126
run : |
125
- docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }}
127
+ docker buildx imagetools inspect ${{ env.DOCKERHUB_REPO }}:${{ steps.meta.outputs.version }}
128
+ docker buildx imagetools inspect ${{ env.GHCR_REPO }}:${{ steps.meta.outputs.version }}
0 commit comments