9797 required : true
9898
9999jobs :
100- build-and-push-amd64 :
101- name : Build and Push AMD64
102- runs-on : ubuntu-latest # x86_64 runner
103- permissions :
104- packages : write
105- contents : read
100+ build-amd64 :
101+ name : Build AMD64 Image
102+ runs-on : ubuntu-latest
103+ outputs :
104+ image : ${{ steps.set-tags.outputs.amd64_image }}
106105 steps :
107106 - uses : actions/checkout@v4
108- with :
109- fetch-depth : 0
110107
111108 - uses : docker/setup-buildx-action@v3
112109
@@ -115,36 +112,31 @@ jobs:
115112 username : ${{ secrets.DOCKER_USERNAME }}
116113 password : ${{ secrets.DOCKER_PASSWORD }}
117114
118- - name : Set tags
115+ - name : Set image tag
119116 id : set-tags
120117 run : |
121118 REF_NAME=${GITHUB_REF#refs/tags/}
122- TAGS="${{ inputs.image_name }}:$REF_NAME"
123- if [[ "${{ inputs.add_latest }}" == "true" ]]; then
124- TAGS="$TAGS,${{ inputs.image_name }}:latest"
125- fi
126- echo "tags=$TAGS" >> $GITHUB_OUTPUT
119+ AMD64_IMAGE="${{ inputs.image_name }}:$REF_NAME-amd64"
120+ echo "amd64_image=$AMD64_IMAGE" >> $GITHUB_OUTPUT
127121
128- - name : Build and push AMD64 image
122+ - name : Build and push AMD64
129123 uses : docker/build-push-action@v6
130124 with :
131125 context : .
132126 file : ${{ inputs.dockerfile }}
133127 platforms : linux/amd64
134128 push : true
135- tags : ${{ steps.set-tags.outputs.tags }}
129+ tags : ${{ steps.set-tags.outputs.amd64_image }}
136130 target : ${{ inputs.target }}
137131
138- build-and-push- arm64 :
139- name : Build and Push ARM64
132+ build-arm64 :
133+ name : Build ARM64 Image
140134 runs-on : ubuntu-24.04-arm
141- permissions :
142- packages : write
143- contents : read
135+ needs : build-amd64
136+ outputs :
137+ image : ${{ steps.set-tags.outputs.arm64_image }}
144138 steps :
145139 - uses : actions/checkout@v4
146- with :
147- fetch-depth : 0
148140
149141 - uses : docker/setup-buildx-action@v3
150142
@@ -153,22 +145,46 @@ jobs:
153145 username : ${{ secrets.DOCKER_USERNAME }}
154146 password : ${{ secrets.DOCKER_PASSWORD }}
155147
156- - name : Set tags
148+ - name : Set image tag
157149 id : set-tags
158150 run : |
159151 REF_NAME=${GITHUB_REF#refs/tags/}
160- TAGS="${{ inputs.image_name }}:$REF_NAME"
161- if [[ "${{ inputs.add_latest }}" == "true" ]]; then
162- TAGS="$TAGS,${{ inputs.image_name }}:latest"
163- fi
164- echo "tags=$TAGS" >> $GITHUB_OUTPUT
152+ ARM64_IMAGE="${{ inputs.image_name }}:$REF_NAME-arm64"
153+ echo "arm64_image=$ARM64_IMAGE" >> $GITHUB_OUTPUT
165154
166- - name : Build and push ARM64 image
155+ - name : Build and push ARM64
167156 uses : docker/build-push-action@v6
168157 with :
169158 context : .
170159 file : ${{ inputs.dockerfile }}
171160 platforms : linux/arm64
172161 push : true
173- tags : ${{ steps.set-tags.outputs.tags }}
162+ tags : ${{ steps.set-tags.outputs.arm64_image }}
174163 target : ${{ inputs.target }}
164+
165+ create-manifest :
166+ name : Create Multi-Arch Manifest
167+ runs-on : ubuntu-latest
168+ needs :
169+ - build-amd64
170+ - build-arm64
171+ steps :
172+ - uses : docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a
173+ with :
174+ username : ${{ secrets.DOCKER_USERNAME }}
175+ password : ${{ secrets.DOCKER_PASSWORD }}
176+
177+ - name : Create Docker manifest
178+ run : |
179+ REF_NAME=${GITHUB_REF#refs/tags/}
180+ IMAGE="${{ inputs.image_name }}:$REF_NAME"
181+ AMD64_IMAGE="${{ needs.build-amd64.outputs.image }}"
182+ ARM64_IMAGE="${{ needs.build-arm64.outputs.image }}"
183+
184+ docker manifest create $IMAGE $AMD64_IMAGE $ARM64_IMAGE
185+ docker manifest push $IMAGE
186+
187+ if [ "${{ inputs.add_latest }}" = "true" ]; then
188+ docker manifest create ${{ inputs.image_name }}:latest $AMD64_IMAGE $ARM64_IMAGE
189+ docker manifest push ${{ inputs.image_name }}:latest
190+ fi
0 commit comments