43
43
IMAGE_NAME : " ${{ vars.DOCKERHUB_ORG }}/label-studio"
44
44
45
45
jobs :
46
- docker_build_and_push :
47
- name : " Docker image"
46
+ docker_build :
47
+ name : " Docker image (${{ matrix.platform }}) "
48
48
timeout-minutes : 90
49
- runs-on : ubuntu-latest
49
+ runs-on : ${{ matrix.runner }}
50
+ strategy :
51
+ fail-fast : false
52
+ matrix :
53
+ include :
54
+ - platform : linux/amd64
55
+ runner : ubuntu-latest
56
+ - platform : linux/arm64
57
+ runner : ubuntu-24.04-arm
50
58
steps :
51
59
52
60
53
- - name : Check user's membership
54
- uses : actions/github-script@v7
55
- id : actor-membership
56
- env :
57
- ACTOR : ${{ github.actor }}
58
- with :
59
- github-token : ${{ secrets.GIT_PAT }}
60
- script : |
61
- const { repo, owner } = context.repo;
62
- const actor = process.env.ACTOR;
63
- const { data: membership } = await github.rest.orgs.getMembershipForUser({
64
- org: owner,
65
- username: actor,
66
- });
67
- core.setOutput("state", membership.state);
68
- core.setOutput("active", membership.state == "active");
61
+ - name : Prepare
62
+ run : |
63
+ platform=${{ matrix.platform }}
64
+ echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
69
65
70
66
- name : Checkout
71
67
id : checkout
75
71
ref : ${{ inputs.ref }}
76
72
fetch-depth : 0
77
73
78
- - name : Calculate Docker tags
79
- id : calculate-docker-tags
80
- uses : actions/github-script@v7
81
- with :
82
- script : |
83
- core.setOutput('docker-tags', `${{ inputs.tags }}`.split(",").join("\n"))
84
-
85
74
- name : Edit Dockerfile
86
75
env :
87
76
BASE_DOCKER_IMAGE_VERSION : ${{ inputs.base_docker_image_version }}
90
79
sed -i "s#^FROM .*#FROM ${IMAGE_NAME}:${BASE_DOCKER_IMAGE_VERSION}#g" "${DOCKERFILE_PATH}"
91
80
cat "${DOCKERFILE_PATH}"
92
81
93
- - name : Set up QEMU
94
- uses : docker/setup-qemu-action@v3
95
-
96
82
- name : Set up Docker Buildx
97
83
98
84
@@ -102,27 +88,83 @@ jobs:
102
88
username : ${{ vars.DOCKERHUB_USERNAME }}
103
89
password : ${{ secrets.DOCKERHUB_TOKEN }}
104
90
105
- - name : Extract Docker metadata
91
+ - name : Docker meta
106
92
id : meta
107
93
uses : docker/metadata-action@v5
108
94
with :
109
95
images : ${{ env.IMAGE_NAME }}
110
- labels : |
111
- org.opencontainers.image.revision=${{ steps.checkout.outputs.commit }}
112
- tags : |
113
- ${{ steps.calculate-docker-tags.outputs.docker-tags }}
114
96
115
- - name : Push Docker image
97
+ - name : Push Docker image (${{ matrix.platform }})
116
98
117
99
id : docker_build_and_push
118
100
with :
119
101
context : .
120
102
file : ${{ inputs.dockerfile_path }}
121
- platforms : linux/amd64,linux/arm64
122
- push : ${{ steps.actor-membership.outputs.active }}
103
+ platforms : ${{ matrix.platform }}
123
104
sbom : true
124
105
provenance : true
125
- tags : ${{ steps.meta.outputs.tags }}
106
+ tags : ${{ env.IMAGE_NAME }}
126
107
labels : ${{ steps.meta.outputs.labels }}
127
108
cache-from : type=gha
128
- cache-to : type=gha,mode=max
109
+ cache-to : type=gha,mode=min
110
+ outputs : type=image,push-by-digest=true,name-canonical=true,push=true
111
+
112
+ - name : Export digest
113
+ run : |
114
+ mkdir -p ${{ runner.temp }}/digests
115
+ digest="${{ steps.docker_build_and_push.outputs.digest }}"
116
+ touch "${{ runner.temp }}/digests/${digest#sha256:}"
117
+
118
+ - name : Upload digest
119
+ uses : actions/upload-artifact@v4
120
+ with :
121
+ name : digests-${{ env.PLATFORM_PAIR }}
122
+ path : ${{ runner.temp }}/digests/*
123
+ if-no-files-found : error
124
+ retention-days : 1
125
+
126
+ merge_docker_manifest :
127
+ runs-on : ubuntu-latest
128
+ needs :
129
+ - docker_build
130
+ steps :
131
+ - name : Download digests
132
+ uses : actions/download-artifact@v4
133
+ with :
134
+ path : ${{ runner.temp }}/digests
135
+ pattern : digests-*
136
+ merge-multiple : true
137
+
138
+ - name : Login to Docker Hub
139
+ uses : docker/login-action@v3
140
+ with :
141
+ username : ${{ vars.DOCKERHUB_USERNAME }}
142
+ password : ${{ secrets.DOCKERHUB_TOKEN }}
143
+
144
+ - name : Set up Docker Buildx
145
+ uses : docker/setup-buildx-action@v3
146
+
147
+ - name : Calculate Docker tags
148
+ id : calculate-docker-tags
149
+ uses : actions/github-script@v7
150
+ with :
151
+ script : |
152
+ core.setOutput('docker-tags', `${{ inputs.tags }}`.split(",").join("\n"))
153
+
154
+ - name : Extract Docker metadata
155
+ id : meta
156
+ uses : docker/metadata-action@v5
157
+ with :
158
+ images : ${{ env.IMAGE_NAME }}
159
+ tags : |
160
+ ${{ steps.calculate-docker-tags.outputs.docker-tags }}
161
+
162
+ - name : Create manifest list and push
163
+ working-directory : ${{ runner.temp }}/digests
164
+ run : |
165
+ docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
166
+ $(printf '${{ env.IMAGE_NAME }}@sha256:%s ' *)
167
+
168
+ - name : Inspect image
169
+ run : |
170
+ docker buildx imagetools inspect ${{ env.IMAGE_NAME }}:${{ steps.meta.outputs.version }}
0 commit comments