@cryptotaxi247 / netdata-1 / commits / cac652e38

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 }}