Commits

Tim Donohue authored fce5cdcc729
Refactor to simply use the reusable-docker-build.yml from DSpace/DSpace.
No tags

.github/workflows/docker.yml

Modified
1 1 # DSpace Docker image build for hub.docker.com
2 2 name: Docker images
3 3
4 4 # Run this Build for all pushes to 'main' or maintenance branches, or tagged releases.
5 5 # Also run for PRs to ensure PR doesn't break Docker build process
6 +# NOTE: uses "reusable-docker-build.yml" in DSpace/DSpace to actually build each of the Docker images
7 +# https://github.com/DSpace/DSpace/blob/main/.github/workflows/reusable-docker-build.yml
8 +#
6 9 on:
7 10 push:
8 11 branches:
9 12 - main
10 13 - 'dspace-**'
11 14 tags:
12 15 - 'dspace-**'
13 16 pull_request:
14 17
15 18 permissions:
16 19 contents: read # to fetch code (actions/checkout)
17 20
18 21
19 22 env:
20 - REGISTRY_IMAGE: dspace/dspace-angular
21 23 # Define tags to use for Docker images based on Git tags/branches (for docker/metadata-action)
22 24 # For a new commit on default branch (main), use the literal tag 'latest' on Docker image.
23 25 # For a new commit on other branches, use the branch name as the tag for Docker image.
24 26 # For a new tag, copy that tag name as the tag for Docker image.
25 27 IMAGE_TAGS: |
26 28 type=raw,value=latest,enable=${{ github.ref_name == github.event.repository.default_branch }}
27 29 type=ref,event=branch,enable=${{ github.ref_name != github.event.repository.default_branch }}
28 30 type=ref,event=tag
29 31 # Define default tag "flavor" for docker/metadata-action per
30 32 # https://github.com/docker/metadata-action#flavor-input
31 33 # We manage the 'latest' tag ourselves to the 'main' branch (see settings above)
32 34 TAGS_FLAVOR: |
33 35 latest=false
34 36
35 37 jobs:
36 38 #############################################################
37 - # Build/Push the '${{ env.REGISTRY_IMAGE }}' image
39 + # Build/Push the 'dspace/dspace-angular' image
38 40 #############################################################
39 41 dspace-angular:
40 42 # Ensure this job never runs on forked repos. It's only executed for 'dspace/dspace-angular'
41 43 if: github.repository == 'dspace/dspace-angular'
42 -
43 - strategy:
44 - matrix:
45 - # Architectures / Platforms for which we will build Docker images
46 - arch: ['linux/amd64', 'linux/arm64']
47 - os: [ubuntu-latest]
48 - isPr:
49 - - ${{ github.event_name == 'pull_request' }}
50 - # If this is a PR, we ONLY build for AMD64. For PRs we only do a sanity check test to ensure Docker builds work.
51 - # The below exclude therefore ensures we do NOT build ARM64 for PRs.
52 - exclude:
53 - - isPr: true
54 - os: ubuntu-latest
55 - arch: linux/arm64
56 -
57 - runs-on: ${{ matrix.os }}
58 - steps:
59 - # https://github.com/actions/checkout
60 - - name: Checkout codebase
61 - uses: actions/checkout@v4
62 -
63 - # https://github.com/docker/setup-buildx-action
64 - - name: Setup Docker Buildx
65 - uses: docker/setup-buildx-action@v3
66 -
67 - # https://github.com/docker/setup-qemu-action
68 - - name: Set up QEMU emulation to build for multiple architectures
69 - uses: docker/setup-qemu-action@v3
70 -
71 - # https://github.com/docker/login-action
72 - - name: Login to DockerHub
73 - # Only login if not a PR, as PRs only trigger a Docker build and not a push
74 - if: ${{ ! matrix.isPr }}
75 - uses: docker/login-action@v3
76 - with:
77 - username: ${{ secrets.DOCKER_USERNAME }}
78 - password: ${{ secrets.DOCKER_ACCESS_TOKEN }}
79 -
80 - # https://github.com/docker/metadata-action
81 - # Get Metadata for docker_build step below
82 - - name: Sync metadata (tags, labels) from GitHub to Docker for 'dspace-angular' image
83 - id: meta_build
84 - uses: docker/metadata-action@v5
85 - with:
86 - images: ${{ env.REGISTRY_IMAGE }}
87 - tags: ${{ env.IMAGE_TAGS }}
88 - flavor: ${{ env.TAGS_FLAVOR }}
89 -
90 - # https://github.com/docker/build-push-action
91 - - name: Build and push 'dspace-angular' image
92 - id: docker_build
93 - uses: docker/build-push-action@v5
94 - with:
95 - context: .
96 - file: ./Dockerfile
97 - platforms: ${{ matrix.arch }}
98 - # For pull requests, we run the Docker build (to ensure no PR changes break the build),
99 - # but we ONLY do an image push to DockerHub if it's NOT a PR
100 - push: ${{ ! matrix.isPr }}
101 - # Use tags / labels provided by 'docker/metadata-action' above
102 - tags: ${{ steps.meta_build.outputs.tags }}
103 - labels: ${{ steps.meta_build.outputs.labels }}
104 -
105 - # Export the digest of Docker build locally (for non PRs only)
106 - - name: Export digest
107 - if: ${{ ! matrix.isPr }}
108 - run: |
109 - mkdir -p /tmp/digests
110 - digest="${{ steps.docker_build.outputs.digest }}"
111 - touch "/tmp/digests/${digest#sha256:}"
112 -
113 - # Upload digest to an artifact, so that it can be used in manifest below
114 - - name: Upload digest
115 - if: ${{ ! matrix.isPr }}
116 - uses: actions/upload-artifact@v3
117 - with:
118 - name: digests
119 - path: /tmp/digests/*
120 - if-no-files-found: error
121 - retention-days: 1
122 -
123 - # Merge digests into a manifest.
124 - # This runs after all Docker builds complete above, and it tells hub.docker.com
125 - # that these builds should be all included in the manifest for this tag.
126 - # (e.g. AMD64 and ARM64 should be listed as options under the same tagged Docker image)
127 - # Borrowed from https://docs.docker.com/build/ci/github-actions/multi-platform/#distribute-build-across-multiple-runners
128 - dspace-angular_manifest:
129 - if: ${{ github.event_name != 'pull_request' }}
130 - runs-on: ubuntu-latest
131 - needs:
132 - - dspace-angular
133 - steps:
134 - - name: Download digests
135 - uses: actions/download-artifact@v3
136 - with:
137 - name: digests
138 - path: /tmp/digests
139 -
140 - - name: Set up Docker Buildx
141 - uses: docker/setup-buildx-action@v3
142 -
143 - - name: Add Docker metadata for image
144 - id: meta
145 - uses: docker/metadata-action@v5
146 - with:
147 - images: ${{ env.REGISTRY_IMAGE }}
148 - tags: ${{ env.IMAGE_TAGS }}
149 - flavor: ${{ env.TAGS_FLAVOR }}
150 -
151 - - name: Login to Docker Hub
152 - uses: docker/login-action@v3
153 - with:
154 - username: ${{ secrets.DOCKER_USERNAME }}
155 - password: ${{ secrets.DOCKER_ACCESS_TOKEN }}
156 -
157 - - name: Create manifest list from digests and push
158 - working-directory: /tmp/digests
159 - run: |
160 - docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
161 - $(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *)
162 -
163 - - name: Inspect image
164 - run: |
165 - docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }}
44 + # Use the reusable-docker-build.yml script from DSpace/DSpace repo to build our Docker image
45 + uses: DSpace/DSpace/.github/workflows/reusable-docker-build.yml@main
46 + with:
47 + build_id: dspace-angular
48 + image_name: dspace/dspace-angular
49 + dockerfile_path: ./Dockerfile
50 + secrets:
51 + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
52 + DOCKER_ACCESS_TOKEN: ${{ secrets.DOCKER_ACCESS_TOKEN }}
166 53
167 54 #############################################################
168 - # Build/Push the '${{ env.REGISTRY_IMAGE }}' image ('-dist' tag)
55 + # Build/Push the 'dspace/dspace-angular' image ('-dist' tag)
169 56 #############################################################
170 57 dspace-angular-dist:
171 58 # Ensure this job never runs on forked repos. It's only executed for 'dspace/dspace-angular'
172 59 if: github.repository == 'dspace/dspace-angular'
173 -
174 - strategy:
175 - matrix:
176 - # Architectures / Platforms for which we will build Docker images
177 - arch: ['linux/amd64', 'linux/arm64']
178 - os: [ubuntu-latest]
179 - isPr:
180 - - ${{ github.event_name == 'pull_request' }}
181 - # If this is a PR, we ONLY build for AMD64. For PRs we only do a sanity check test to ensure Docker builds work.
182 - # The below exclude therefore ensures we do NOT build ARM64 for PRs.
183 - exclude:
184 - - isPr: true
185 - os: ubuntu-latest
186 - arch: linux/arm64
187 -
188 - runs-on: ${{ matrix.os }}
189 - steps:
190 - # https://github.com/actions/checkout
191 - - name: Checkout codebase
192 - uses: actions/checkout@v4
193 -
194 - # https://github.com/docker/setup-buildx-action
195 - - name: Setup Docker Buildx
196 - uses: docker/setup-buildx-action@v3
197 -
198 - # https://github.com/docker/setup-qemu-action
199 - - name: Set up QEMU emulation to build for multiple architectures
200 - uses: docker/setup-qemu-action@v3
201 -
202 - # https://github.com/docker/login-action
203 - - name: Login to DockerHub
204 - # Only login if not a PR, as PRs only trigger a Docker build and not a push
205 - if: ${{ ! matrix.isPr }}
206 - uses: docker/login-action@v3
207 - with:
208 - username: ${{ secrets.DOCKER_USERNAME }}
209 - password: ${{ secrets.DOCKER_ACCESS_TOKEN }}
210 -
211 - # https://github.com/docker/metadata-action
212 - # Get Metadata for docker_build_dist step below
213 - - name: Sync metadata (tags, labels) from GitHub to Docker for 'dspace-angular-dist' image
214 - id: meta_build_dist
215 - uses: docker/metadata-action@v5
216 - with:
217 - images: ${{ env.REGISTRY_IMAGE }}
218 - tags: ${{ env.IMAGE_TAGS }}
219 - # As this is a "dist" image, its tags are all suffixed with "-dist". Otherwise, it uses the same
220 - # tagging logic as the primary '${{ env.REGISTRY_IMAGE }}' image above.
221 - flavor: ${{ env.TAGS_FLAVOR }}
222 - suffix=-dist
223 -
224 - - name: Build and push 'dspace-angular-dist' image
225 - id: docker_build_dist
226 - uses: docker/build-push-action@v5
227 - with:
228 - context: .
229 - file: ./Dockerfile.dist
230 - platforms: ${{ matrix.arch }}
231 - # For pull requests, we run the Docker build (to ensure no PR changes break the build),
232 - # but we ONLY do an image push to DockerHub if it's NOT a PR
233 - push: ${{ ! matrix.isPr }}
234 - # Use tags / labels provided by 'docker/metadata-action' above
235 - tags: ${{ steps.meta_build_dist.outputs.tags }}
236 - labels: ${{ steps.meta_build_dist.outputs.labels }}
237 -
238 - # Export the digest of Docker build locally (for non PRs only)
239 - - name: Export digest
240 - if: ${{ ! matrix.isPr }}
241 - run: |
242 - mkdir -p /tmp/digests
243 - digest="${{ steps.docker_build_dist.outputs.digest }}"
244 - touch "/tmp/digests/${digest#sha256:}"
245 -
246 - # Upload Digest to an artifact, so that it can be used in manifest below
247 - - name: Upload digest
248 - if: ${{ ! matrix.isPr }}
249 - uses: actions/upload-artifact@v3
250 - with:
251 - # NOTE: It's important that this artifact has a unique name so that two
252 - # image builds don't upload digests to the same artifact.
253 - name: digests-dist
254 - path: /tmp/digests/*
255 - if-no-files-found: error
256 - retention-days: 1
257 -
258 - # If the 'linux/amd64' -dist image was just updated for the 'main' branch,
259 - # Then redeploy https://sandbox.dspace.org using that updated image.
260 - - name: Redeploy sandbox.dspace.org (based on main branch)
261 - if: ${{ ! matrix.isPr && matrix.arch == 'linux/amd64' && github.ref_name == github.event.repository.default_branch }}
262 - run: |
263 - curl -X POST $REDEPLOY_SANDBOX_URL
264 - env:
265 - REDEPLOY_SANDBOX_URL: ${{ secrets.REDEPLOY_SANDBOX_URL }}
266 -
267 - # If the 'linux/amd64' -dist image was just updated for the maintenance branch,
268 - # Then redeploy https://demo.dspace.org using that updated image.
269 - - name: Redeploy demo.dspace.org (based on maintenace branch)
270 - if: ${{ ! matrix.isPr && matrix.arch == 'linux/amd64' && github.ref_name == 'dspace-7_x' }}
271 - run: |
272 - curl -X POST $REDEPLOY_DEMO_URL
273 - env:
274 - REDEPLOY_DEMO_URL: ${{ secrets.REDEPLOY_DEMO_URL }}
275 -
276 - # Merge *-dist digests into a manifest.
277 - # This runs after all Docker builds complete above, and it tells hub.docker.com
278 - # that these builds should be all included in the manifest for this tag.
279 - # (e.g. AMD64 and ARM64 should be listed as options under the same tagged Docker image)
280 - dspace-angular-dist_manifest:
281 - if: ${{ github.event_name != 'pull_request' }}
282 - runs-on: ubuntu-latest
283 - needs:
284 - - dspace-angular-dist
285 - steps:
286 - - name: Download digests for -dist builds
287 - uses: actions/download-artifact@v3
288 - with:
289 - name: digests-dist
290 - path: /tmp/digests
291 -
292 - - name: Set up Docker Buildx
293 - uses: docker/setup-buildx-action@v3
294 -
295 - - name: Add Docker metadata for image
296 - id: meta_dist
297 - uses: docker/metadata-action@v5
298 - with:
299 - images: ${{ env.REGISTRY_IMAGE }}
300 - tags: ${{ env.IMAGE_TAGS }}
301 - # As this is a "dist" image, its tags are all suffixed with "-dist". Otherwise, it uses the same
302 - # tagging logic as the primary '${{ env.REGISTRY_IMAGE }}' image above.
303 - flavor: ${{ env.TAGS_FLAVOR }}
304 - suffix=-dist
305 -
306 - - name: Login to Docker Hub
307 - uses: docker/login-action@v3
308 - with:
309 - username: ${{ secrets.DOCKER_USERNAME }}
310 - password: ${{ secrets.DOCKER_ACCESS_TOKEN }}
311 -
312 - - name: Create manifest list from digests and push
313 - working-directory: /tmp/digests
314 - run: |
315 - docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
316 - $(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *)
317 -
318 - - name: Inspect image
319 - run: |
320 - docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta_dist.outputs.version }}
60 + # Use the reusable-docker-build.yml script from DSpace/DSpace repo to build our Docker image
61 + uses: DSpace/DSpace/.github/workflows/reusable-docker-build.yml@main
62 + with:
63 + build_id: dspace-angular-dist
64 + image_name: dspace/dspace-angular
65 + dockerfile_path: ./Dockerfile.dist
66 + # As this is a "dist" image, its tags are all suffixed with "-dist". Otherwise, it uses the same
67 + # tagging logic as the primary 'dspace/dspace-angular' image above.
68 + tags_flavor: suffix=-dist
69 + secrets:
70 + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
71 + DOCKER_ACCESS_TOKEN: ${{ secrets.DOCKER_ACCESS_TOKEN }}
72 + # Enable redeploy of sandbox & demo if the branch for this image matches the deployment branch of
73 + # these sites as specified in reusable-docker-build.xml
74 + REDEPLOY_SANDBOX_URL: ${{ secrets.REDEPLOY_SANDBOX_URL }}
75 + REDEPLOY_DEMO_URL: ${{ secrets.REDEPLOY_DEMO_URL }}

Everything looks good. We'll let you know here if there's anything you should know about.

Add shortcut