Rework Docker CI to build each platform in it's own runner. (#17088)
* Rework Docker CI to build each platform in it's own runner. * Remove bogus conditional in publish step.
Austin S. Hemmelgarn committed
Mar 5, 2024 at 08:49 UTC
cac652e384f04a4ceda611a6ec187d6c8ef49ab9
4 files changed
+175
-240
.github/scripts/gen-docker-build-output.py
new
+11
@@ -0,0 +1,11 @@
1
+#!/usr/bin/env python3
2
+
3
+import sys
4
+
5
+event = sys.argv[1]
6
+
7
+match event:
8
+ case 'workflow_dispatch':
9
+ print('type=image,push=true,push-by-digest=true,name-canonical=true')
10
+ case _:
11
+ print('type=docker')
.github/scripts/gen-docker-imagetool-args.py
new
+27
@@ -0,0 +1,27 @@
1
+#!/usr/bin/env python3
2
+
3
+import sys
4
+
5
+from pathlib import Path
6
+
7
+DIGEST_PATH = Path(sys.argv[1])
8
+TAG_PREFIX = sys.argv[2]
9
+TAGS = sys.argv[3]
10
+
11
+if TAG_PREFIX:
12
+ PUSH_TAGS = tuple([
13
+ t for t in TAGS.split(',') if t.startswith(TAG_PREFIX)
14
+ ])
15
+else:
16
+ PUSH_TAGS = tuple([
17
+ t for t in TAGS.split(',') if t.startswith('netdata/')
18
+ ])
19
+
20
+IMAGE_NAME = PUSH_TAGS[0].split(':')[0]
21
+
22
+images = []
23
+
24
+for f in DIGEST_PATH.glob('*'):
25
+ images.append(f'{IMAGE_NAME}@sha256:{f.name}')
26
+
27
+print(f'-t {" -t ".join(PUSH_TAGS)} {" ".join(images)}')
.github/scripts/gen-docker-tags.py
+25
-10
@@ -2,18 +2,33 @@
2
3
import sys
4
5
-version = sys.argv[1].split('.')
6
-suffix = sys.argv[2]
5
+github_event = sys.argv[1]
6
+version = sys.argv[2]
7
8
-REPO = f'netdata/netdata{suffix}'
9
-GHCR = f'ghcr.io/{REPO}'
10
-QUAY = f'quay.io/{REPO}'
8
+REPO = 'netdata/netdata-ci-test'
9
12
-tags = []
10
+REPOS = (
11
+ REPO,
12
+ # f'ghcr.io/{REPO}',
13
+ f'quay.io/{REPO}',
14
+)
15
14
-for repo in [REPO, GHCR, QUAY]:
15
- tags.append(':'.join([repo, version[0]]))
16
- tags.append(':'.join([repo, '.'.join(version[0:2])]))
17
- tags.append(':'.join([repo, '.'.join(version[0:3])]))
16
+match version:
17
+ case '':
18
+ tags = (f'{REPO}:test',)
19
+ case 'nightly':
20
+ tags = tuple([
21
+ f'{r}:{t}' for r in REPOS for t in ('edge', 'latest')
22
+ ])
23
+ case _:
24
+ v = f'v{version}'.split('.')
25
+
26
+ tags = tuple([
27
+ f'{r}:{t}' for r in REPOS for t in (
28
+ v[0],
29
+ '.'.join(v[0:2]),
30
+ '.'.join(v[0:3]),
31
+ )
32
+ ])
33
34
print(','.join(tags))
.github/workflows/docker.yml
+112
-230
@@ -47,6 +47,9 @@ jobs:
47
netdata-installer.sh
48
.github/workflows/docker.yml
49
.github/scripts/docker-test.sh
50
+ .github/scripts/gen-docker-tags.py
51
+ .github/scripts/gen-docker-build-info.py
52
+ .github/scripts/gen-docker-imagetool-args.py
53
packaging/cmake/
54
packaging/docker/
55
packaging/installer/
@@ -77,76 +80,38 @@ jobs:
80
echo 'run=false' >> "${GITHUB_OUTPUT}"
81
fi
82
80
- docker-test:
81
- name: Docker Runtime Test
82
- needs:
83
- - file-check
83
+ gen-tags:
84
+ name: Generate Docker Tags
85
runs-on: ubuntu-latest
86
+ outputs:
87
+ tags: ${{ steps.tag.outputs.tags }}
88
steps:
86
- - name: Skip Check
87
- id: skip
88
- if: needs.file-check.outputs.run != 'true'
89
- run: echo "SKIPPED"
90
- - name: Checkout
91
- id: checkout
92
- if: needs.file-check.outputs.run == 'true'
93
- uses: actions/checkout@v4
94
- with:
95
- submodules: recursive
96
- - name: Setup Buildx
97
- id: prepare
98
- if: needs.file-check.outputs.run == 'true'
99
- uses: docker/setup-buildx-action@v3
100
- - name: Test Build
101
- id: build
102
- if: needs.file-check.outputs.run == 'true'
103
- uses: docker/build-push-action@v5
104
- with:
105
- load: true
106
- push: false
107
- tags: netdata/netdata:test
108
- - name: Test Image
109
- id: test
110
- if: needs.file-check.outputs.run == 'true'
111
- run: .github/scripts/docker-test.sh
112
- - name: Failure Notification
113
- uses: rtCamp/action-slack-notify@v2
114
- env:
115
- SLACK_COLOR: 'danger'
116
- SLACK_FOOTER: ''
117
- SLACK_ICON_EMOJI: ':github-actions:'
118
- SLACK_TITLE: 'Docker runtime testing failed:'
119
- SLACK_USERNAME: 'GitHub Actions'
120
- SLACK_MESSAGE: |-
121
- ${{ github.repository }}: Building or testing Docker image for linux/amd64 failed.
122
- CHeckout: ${{ steps.checkout.outcome }}
123
- Setup buildx: ${{ steps.prepare.outcome }}
124
- Build image: ${{ steps.build.outcome }}
125
- Test image: ${{ steps.test.outcome }}
126
- SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
127
- if: >-
128
- ${{
129
- failure()
130
- && github.event_name != 'pull_request'
131
- && startsWith(github.ref, 'refs/heads/master')
132
- && github.repository == 'netdata/netdata'
133
- && needs.file-check.outputs.run == 'true'
134
- }}
89
+ - name: Generate Tags
90
+ id: tag
91
+ run: |
92
+ if [ ${{ github.event_name }} = 'workflow_dispatch' ]; then
93
+ echo "tags=$(.github/scripts/gen-docker-tags.py ${{ github.event_name }} ${{ github.event.inputs.version }})" >> "${GITHUB_OUTPUT}"
94
+ else
95
+ echo "tags=$(.github/scripts/gen-docker-tags.py ${{ github.event_name }} '')" >> "${GITHUB_OUTPUT}"
96
+ fi
97
136
- docker-ci:
137
- if: github.event_name != 'workflow_dispatch'
138
- name: Docker Alt Arch Builds
98
+ build-images:
99
+ name: Build Docker Images
100
needs:
140
- - docker-test
101
- file-check
102
+ - gen-tags
103
runs-on: ubuntu-latest
104
strategy:
105
matrix:
145
- platforms:
106
+ platform:
107
+ - linux/amd64
108
- linux/i386
109
- linux/arm/v7
110
- linux/arm64
111
- linux/ppc64le
112
+ # Fail fast on releases so that we minimize the number of ‘dead’
113
+ # images we push, but run everything to completion on other triggers.
114
+ fail-fast: ${{ github.event_name == 'workflow_dispatch' }}
115
steps:
116
- name: Skip Check
117
id: skip
@@ -157,213 +122,128 @@ jobs:
122
if: needs.file-check.outputs.run == 'true'
123
uses: actions/checkout@v4
124
with:
125
+ fetch-depth: 0
126
submodules: recursive
161
- - name: Setup QEMU
162
- id: qemu
163
- if: matrix.platforms != 'linux/i386' && needs.file-check.outputs.run == 'true'
164
- uses: docker/setup-qemu-action@v3
165
- - name: Setup Buildx
166
- id: buildx
167
- if: needs.file-check.outputs.run == 'true'
168
- uses: docker/setup-buildx-action@v3
169
- - name: Build
170
- id: build
171
- if: needs.file-check.outputs.run == 'true'
172
- uses: docker/build-push-action@v5
173
- with:
174
- platforms: ${{ matrix.platforms }}
175
- load: false
176
- push: false
177
- tags: netdata/netdata:test
178
- - name: Failure Notification
179
- uses: rtCamp/action-slack-notify@v2
180
- env:
181
- SLACK_COLOR: 'danger'
182
- SLACK_FOOTER: ''
183
- SLACK_ICON_EMOJI: ':github-actions:'
184
- SLACK_TITLE: 'Docker build testing failed:'
185
- SLACK_USERNAME: 'GitHub Actions'
186
- SLACK_MESSAGE: |-
187
- ${{ github.repository }}: Building Docker image for ${{ matrix.platforms }} failed.
188
- CHeckout: ${{ steps.checkout.outcome }}
189
- Setup QEMU: ${{ steps.qemu.outcome }}
190
- Setup buildx: ${{ steps.buildx.outcome }}
191
- Build image: ${{ steps.build.outcome }}
192
- SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
193
- if: >-
194
- ${{
195
- failure()
196
- && github.event_name != 'pull_request'
197
- && startsWith(github.ref, 'refs/heads/master')
198
- && github.repository == 'netdata/netdata'
199
- && needs.file-check.outputs.run == 'true'
200
- }}
201
-
202
- normalize-tag: # Fix the release tag if needed
203
- name: Normalize Release Tag
204
- runs-on: ubuntu-latest
205
- if: github.event_name == 'workflow_dispatch'
206
- outputs:
207
- tag: ${{ steps.tag.outputs.tag }}
208
- steps:
209
- - name: Normalize Tag
210
- id: tag
211
- run: |
212
- if echo ${{ github.event.inputs.version }} | grep -qE '^[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+$'; then
213
- echo "tag=v${{ github.event.inputs.version }}" >> "${GITHUB_OUTPUT}"
214
- else
215
- echo "tag=${{ github.event.inputs.version }}" >> "${GITHUB_OUTPUT}"
216
- fi
217
-
218
- docker-publish:
219
- if: github.event_name == 'workflow_dispatch'
220
- name: Docker Build and Publish
221
- needs:
222
- - docker-test
223
- - normalize-tag
224
- runs-on: ubuntu-latest
225
- steps:
226
- - name: Checkout
227
- id: checkout
228
- uses: actions/checkout@v4
229
- with:
230
- submodules: recursive
231
- - name: Determine which tags to use
232
- id: release-tags
233
- if: github.event.inputs.version != 'nightly'
234
- run: |
235
- echo "tags=netdata/netdata:latest,netdata/netdata:stable,ghcr.io/netdata/netdata:latest,ghcr.io/netdata/netdata:stable,quay.io/netdata/netdata:latest,quay.io/netdata/netdata:stable,$(.github/scripts/gen-docker-tags.py ${{ needs.normalize-tag.outputs.tag }} '')" \
236
- >> "${GITHUB_ENV}"
237
- - name: Determine which tags to use
238
- id: nightly-tags
239
- if: github.event.inputs.version == 'nightly'
240
- run: |
241
- echo "tags=netdata/netdata:latest,netdata/netdata:edge,ghcr.io/netdata/netdata:latest,ghcr.io/netdata/netdata:edge,quay.io/netdata/netdata:latest,quay.io/netdata/netdata:edge" >> "${GITHUB_ENV}"
127
- name: Mark image as official
128
id: env
244
- if: github.repository == 'netdata/netdata'
129
+ if: github.repository == 'netdata/netdata' && needs.file-check.outputs.run == 'true' && github.event_name == 'workflow_dispatch'
130
run: echo "OFFICIAL_IMAGE=true" >> "${GITHUB_ENV}"
131
+ - name: Generate Build Output Config
132
+ id: gen-config
133
+ if: needs.file-check.outputs.run == 'true'
134
+ run: echo "output-config=$(.github/scripts/gen-docker-build-output.py ${{ github.event_name }})" >> "${GITHUB_OUTPUT}"
135
- name: Setup QEMU
136
id: qemu
137
+ if: matrix.platform != 'linux/i386' && matrix.platform != 'linux/amd64' && needs.file-check.outputs.run == 'true'
138
uses: docker/setup-qemu-action@v3
139
- name: Setup Buildx
250
- id: buildx
140
+ id: prepare
141
+ if: needs.file-check.outputs.run == 'true'
142
uses: docker/setup-buildx-action@v3
143
- name: Docker Hub Login
144
id: docker-hub-login
254
- if: github.repository == 'netdata/netdata'
145
+ if: github.repository == 'netdata/netdata' && needs.file-check.outputs.run == 'true' && github.event_name == 'workflow_dispatch'
146
uses: docker/login-action@v3
147
with:
148
username: ${{ secrets.DOCKER_HUB_USERNAME }}
149
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
259
- - name: GitHub Container Registry Login
260
- id: ghcr-login
261
- if: github.repository == 'netdata/netdata'
262
- uses: docker/login-action@v3
263
- with:
264
- registry: ghcr.io
265
- username: ${{ github.repository_owner }}
266
- password: ${{ secrets.GITHUB_TOKEN }}
150
+# - name: GitHub Container Registry Login
151
+# id: ghcr-login
152
+# if: github.repository == 'netdata/netdata' && needs.file-check.outputs.run == 'true' && github.event_name == 'workflow_dispatch'
153
+# uses: docker/login-action@v3
154
+# with:
155
+# registry: ghcr.io
156
+# username: ${{ github.repository_owner }}
157
+# password: ${{ secrets.GITHUB_TOKEN }}
158
- name: Quay.io Login
159
id: quay-login
269
- if: github.repository == 'netdata/netdata'
160
+ if: github.repository == 'netdata/netdata' && needs.file-check.outputs.run == 'true' && github.event_name == 'workflow_dispatch'
161
uses: docker/login-action@v3
162
with:
163
registry: quay.io
164
username: ${{ secrets.NETDATABOT_QUAY_USERNAME }}
165
password: ${{ secrets.NETDATABOT_QUAY_TOKEN }}
275
- - name: Docker Build
166
+ - name: Build Image
167
id: build
168
+ if: needs.file-check.outputs.run == 'true'
169
uses: docker/build-push-action@v5
170
with:
279
- platforms: linux/amd64,linux/i386,linux/arm/v7,linux/arm64,linux/ppc64le
280
- push: ${{ github.repository == 'netdata/netdata' }}
281
- tags: ${{ env.tags }}
171
+ platforms: ${{ matrix.platform }}
172
+ tags: ${{ needs.gen-tags.outputs.tags }}
173
build-args: OFFICIAL_IMAGE=${{ env.OFFICIAL_IMAGE }}
174
+ outputs: ${{ steps.gen-config.outputs.output-config }}
175
+ - name: Test Image
176
+ id: test
177
+ if: needs.file-check.outputs.run == 'true' && matrix.platform == 'linux/amd64'
178
+ run: .github/scripts/docker-test.sh
179
+ - name: Export Digest
180
+ id: export-digest
181
+ if: github.repository == 'netdata/netdata' && needs.file-check.outputs.run == 'true' && github.event_name == 'workflow_dispatch'
182
+ run: |
183
+ mkdir -p /tmp/digests
184
+ digest="${{ steps.build.outputs.digest }}"
185
+ touch "/tmp/digests/${digest#sha256:}"
186
+ - name: Upload digest
187
+ id: upload-digest
188
+ if: github.repository == 'netdata/netdata' && needs.file-check.outputs.run == 'true' && github.event_name == 'workflow_dispatch'
189
+ uses: actions/upload-artifact@v4
190
+ with:
191
+ name: digests-${{ env.PLATFORM_PAIR }}
192
+ path: /tmp/digests/*
193
+ if-no-files-found: error
194
+ retention-days: 1
195
- name: Failure Notification
196
uses: rtCamp/action-slack-notify@v2
197
env:
198
SLACK_COLOR: 'danger'
199
SLACK_FOOTER: ''
200
SLACK_ICON_EMOJI: ':github-actions:'
289
- SLACK_TITLE: 'Docker Build failed:'
201
+ SLACK_TITLE: 'Docker build failed:'
202
SLACK_USERNAME: 'GitHub Actions'
203
SLACK_MESSAGE: |-
292
- ${{ github.repository }}: Failed to build or publish Docker images.
293
- CHeckout: ${{ steps.checkout.outcome }}
294
- Generate release tags: ${{ steps.release-tags.outcome }}
295
- Generate nightly tags: ${{ steps.nightly-tags.outcome }}
204
+ ${{ github.repository }}: Building or testing Docker image for ${{ matrix.platform }} failed.
205
+ Checkout: ${{ steps.checkout.outcome }}
206
Setup environment: ${{ steps.env.outcome }}
207
+ Generate Build Output Config: ${{ steps.gen-config.outcome }}
208
Setup QEMU: ${{ steps.qemu.outcome }}
298
- Setup buildx: ${{ steps.buildx.outcome }}
209
+ Setup buildx: ${{ steps.prepare.outcome }}
210
Login to DockerHub: ${{ steps.docker-hub-login.outcome }}
300
- Login to GHCR: ${{ steps.ghcr-login.outcome }}
211
Login to Quay: ${{ steps.quay-login.outcome }}
302
- Build and publish images: ${{ steps.build.outcome }}
212
+ Build image: ${{ steps.build.outcome }}
213
+ Test image: ${{ steps.test.outcome }}
214
+ Export digest: ${{ steps.export-digest.outcome }}
215
+ Upload digest: ${{ steps.upload-digest.outcome }}
216
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
217
if: >-
218
${{
219
failure()
220
&& github.event_name != 'pull_request'
308
- && startsWith(github.ref, 'refs/heads/master')
221
&& github.repository == 'netdata/netdata'
222
+ && needs.file-check.outputs.run == 'true'
223
}}
311
- - name: Trigger Helmchart PR
312
- if: github.event_name == 'workflow_dispatch' && github.event.inputs.version != 'nightly' && github.repository == 'netdata/netdata'
313
- uses: benc-uk/workflow-dispatch@v1
314
- with:
315
- token: ${{ secrets.NETDATABOT_GITHUB_TOKEN }}
316
- repo: netdata/helmchart
317
- workflow: Agent Version PR
318
- ref: refs/heads/master
319
- inputs: '{"agent_version": "${{ needs.normalize-tag.outputs.tag }}"}'
320
- - name: Trigger MSI build
321
- if: github.event_name == 'workflow_dispatch' && github.event.inputs.version != 'nightly' && github.repository == 'netdata/netdata'
322
- uses: benc-uk/workflow-dispatch@v1
323
- with:
324
- token: ${{ secrets.NETDATABOT_GITHUB_TOKEN }}
325
- repo: netdata/msi-installer
326
- workflow: Build
327
- ref: refs/heads/master
328
- inputs: '{"tag": "${{ needs.normalize-tag.outputs.tag }}", "pwd": "${{ secrets.MSI_CODE_SIGNING_PASSWORD }}"}'
224
330
- docker-dbg-publish:
225
+ publish:
226
+ name: Consolidate and tag images
227
if: github.event_name == 'workflow_dispatch'
332
- name: Docker Build and Publish (Debugging Image)
228
needs:
334
- - docker-test
335
- - normalize-tag
229
+ - build-images
230
+ - gen-tags
231
runs-on: ubuntu-latest
232
steps:
338
- - name: Checkout
339
- id: checkout
340
- uses: actions/checkout@v4
233
+ - name: Download digests
234
+ id: fetch-digests
235
+ uses: actions/download-artifact@v4
236
with:
342
- submodules: recursive
343
- - name: Determine which tags to use
344
- id: release-tags
345
- if: github.event.inputs.version != 'nightly'
346
- run: |
347
- echo "tags=netdata/netdata-debug:latest,netdata/netdata-debug:stable,ghcr.io/netdata/netdata-debug:latest,ghcr.io/netdata/netdata-debug:stable,quay.io/netdata/netdata-debug:latest,quay.io/netdata/netdata-debug:stable,$(.github/scripts/gen-docker-tags.py ${{ needs.normalize-tag.outputs.tag }} '-debug')" \
348
- >> "${GITHUB_ENV}"
349
- - name: Determine which tags to use
350
- id: nightly-tags
351
- if: github.event.inputs.version == 'nightly'
352
- run: |
353
- echo "tags=netdata/netdata-debug:latest,netdata/netdata-debug:edge,ghcr.io/netdata/netdata-debug:latest,ghcr.io/netdata/netdata-debug:edge,quay.io/netdata/netdata-debug:latest,quay.io/netdata/netdata-debug:edge" >> "${GITHUB_ENV}"
354
- - name: Mark image as official
355
- id: env
356
- if: github.repository == 'netdata/netdata'
357
- run: echo "OFFICIAL_IMAGE=true" >> "${GITHUB_ENV}"
358
- - name: Setup QEMU
359
- id: qemu
360
- uses: docker/setup-qemu-action@v3
237
+ path: /tmp/digests
238
+ pattern: digests-*
239
+ merge-multiple: true
240
- name: Setup Buildx
362
- id: buildx
241
+ id: prepare
242
uses: docker/setup-buildx-action@v3
243
- name: Docker Hub Login
244
id: docker-hub-login
245
if: github.repository == 'netdata/netdata'
246
+ continue-on-error: true
247
uses: docker/login-action@v3
248
with:
249
username: ${{ secrets.DOCKER_HUB_USERNAME }}
@@ -371,6 +251,7 @@ jobs:
251
- name: GitHub Container Registry Login
252
id: ghcr-login
253
if: github.repository == 'netdata/netdata'
254
+ continue-on-error: true
255
uses: docker/login-action@v3
256
with:
257
registry: ghcr.io
@@ -379,46 +260,47 @@ jobs:
260
- name: Quay.io Login
261
id: quay-login
262
if: github.repository == 'netdata/netdata'
263
+ continue-on-error: true
264
uses: docker/login-action@v3
265
with:
266
registry: quay.io
267
username: ${{ secrets.NETDATABOT_QUAY_USERNAME }}
268
password: ${{ secrets.NETDATABOT_QUAY_TOKEN }}
387
- - name: Docker Build
388
- id: build
389
- uses: docker/build-push-action@v5
390
- with:
391
- platforms: linux/amd64,linux/i386,linux/arm/v7,linux/arm64,linux/ppc64le
392
- push: ${{ github.repository == 'netdata/netdata' }}
393
- tags: ${{ env.tags }}
394
- build-args: |
395
- OFFICIAL_IMAGE=${{ env.OFFICIAL_IMAGE }}
396
- DEBUG_BUILD=1
269
+ - name: Create and Push Manifest for Docker Hub
270
+ id: docker-hub-push
271
+ if: github.repository == 'netdata/netdata' && steps.docker-hub-login.outcome == 'success'
272
+ continue-on-error: true
273
+ run: docker buildx imagetool create $(.github/scripts/gen-docker-imagetool-args.py /tmp/digests '' ${{ needs.gen-tags.outputs.tags }})
274
+# - name: Create and Push Manifest for GitHub Container Registry
275
+# id: ghcr-push
276
+# if: github.repository == 'netdata/netdata' && steps.ghcr-login.outcome == 'success'
277
+# continue-on-error: true
278
+# run: docker buildx imagetool create $(.github/scripts/gen-docker-imagetool-args.py /tmp/digests 'ghcr.io' ${{ needs.gen-tags.outputs.tags }})
279
+ - name: Create and Push Manifest for Quay.io
280
+ id: quay-push
281
+ if: github.repository == 'netdata/netdata' && steps.quay-login.outcome == 'success'
282
+ continue-on-error: true
283
+ run: docker buildx imagetool create $(.github/scripts/gen-docker-imagetool-args.py /tmp/digests 'quay.io' ${{ needs.gen-tags.outputs.tags }})
284
- name: Failure Notification
285
uses: rtCamp/action-slack-notify@v2
286
env:
287
SLACK_COLOR: 'danger'
288
SLACK_FOOTER: ''
289
SLACK_ICON_EMOJI: ':github-actions:'
403
- SLACK_TITLE: 'Docker Debug Build failed:'
290
+ SLACK_TITLE: 'Publishing Docker images failed:'
291
SLACK_USERNAME: 'GitHub Actions'
292
SLACK_MESSAGE: |-
406
- ${{ github.repository }}: Failed to build or publish Docker debug images.
407
- Checkout: ${{ steps.checkout.outcome }}
408
- Generate release tags: ${{ steps.release-tags.outcome }}
409
- Generate nightly tags: ${{ steps.nightly-tags.outcome }}
410
- Setup environment: ${{ steps.env.outcome }}
411
- Setup QEMU: ${{ steps.qemu.outcome }}
412
- Setup buildx: ${{ steps.buildx.outcome }}
293
+ ${{ github.repository }}: Publishing Docker images failed.
294
+ Download digests: ${{ steps.fetch-digests.outcome }}
295
+ Setup buildx: ${{ steps.prepare.outcome }}
296
Login to DockerHub: ${{ steps.docker-hub-login.outcome }}
297
Login to GHCR: ${{ steps.ghcr-login.outcome }}
298
Login to Quay: ${{ steps.quay-login.outcome }}
416
- Build and publish images: ${{ steps.build.outcome }}
299
+ Publish DockerHub: ${{ steps.docker-hub-push.outcome }}
300
+ Publish Quay: ${{ steps.quay-push.outcome }}
301
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
302
if: >-
303
${{
304
failure()
421
- && github.event_name != 'pull_request'
422
- && startsWith(github.ref, 'refs/heads/master')
305
&& github.repository == 'netdata/netdata'
306
}}