master
yml 1,219 lines 46.3 KB
Raw
1 ---
2 # CI code for building release artifacts.
3 name: Build
4 on:
5 push: # Master branch checks only validate the build and generate artifacts for testing.
6 branches:
7 - master
8 pull_request: null # PR checks only validate the build and generate artifacts for testing.
9 workflow_dispatch: # Dispatch runs build and does limited validation, then pushes to the appropriate storage location.
10 inputs:
11 type:
12 description: Build Type
13 default: nightly
14 required: true
15 version:
16 description: Version Tag
17 default: nightly
18 required: true
19 concurrency: # This keeps multiple instances of the job from running concurrently for the same ref and event type.
20 group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }}
21 cancel-in-progress: true
22 env:
23 DISABLE_TELEMETRY: 1 # Disable telemetry reporting from the agent in our CI.
24 jobs:
25 file-check: # Check what files changed if we’re being run in a PR or on a push.
26 name: Check Modified Files
27 runs-on: ubuntu-latest
28 outputs:
29 run: ${{ steps.check-run.outputs.run }}
30 skip-go: ${{ steps.check-go.outputs.skip-go }}
31 static-native: ${{ steps.check-static.outputs.static-native }}
32 steps:
33 - name: Checkout
34 id: checkout
35 uses: actions/checkout@v6
36 with:
37 fetch-depth: 0
38 submodules: recursive
39 - name: Check source files
40 id: check-source-files
41 uses: step-security/changed-files@v45
42 with:
43 since_last_remote_commit: ${{ github.event_name != 'pull_request' }}
44 files: |
45 **/*.c
46 **/*.cc
47 **/*.h
48 **/*.hh
49 **/*.in
50 **/*.patch
51 src/crates/
52 src/aclk/aclk-schemas/
53 src/ml/dlib/
54 files_ignore: |
55 netdata.spec.in
56 src/go/otel-collector/release-config.yaml.in
57 **/*.md
58 - name: Check build files
59 id: check-build-files
60 uses: step-security/changed-files@v45
61 with:
62 since_last_remote_commit: ${{ github.event_name != 'pull_request' }}
63 files: |
64 **/*.cmake
65 CMakeLists.txt
66 netdata-installer.sh
67 .github/data/distros.yml
68 .github/workflows/build.yml
69 .github/scripts/build-static.sh
70 .github/scripts/get-static-cache-key.sh
71 .github/scripts/gen-matrix-static.py
72 .github/scripts/gen-matrix-build.py
73 .github/scripts/run-updater-check.sh
74 packaging/cmake/
75 packaging/makeself/
76 packaging/installer/
77 packaging/windows/
78 packaging/*.sh
79 packaging/*.version
80 packaging/*.checksums
81 files_ignore: |
82 **/*.md
83 packaging/repoconfig/
84 - name: Check static build files
85 id: check-static-build-files
86 uses: step-security/changed-files@v45
87 with:
88 since_last_remote_commit: ${{ github.event_name != 'pull_request' }}
89 files: |
90 .github/data/distros.yml
91 .github/workflows/build.yml
92 .github/scripts/build-static.sh
93 .github/scripts/get-static-cache-key.sh
94 .github/scripts/gen-matrix-static.py
95 packaging/makeself/
96 files_ignore: |
97 **/*.md
98 packaging/repoconfig/
99 - name: List all changed files in pattern
100 continue-on-error: true
101 if: github.event_name != 'workflow_dispatch'
102 env:
103 CHANGED_SOURCE_FILES: ${{ steps.check-source-files.outputs.all_changed_files }}
104 CHANGED_BUILD_FILES: ${{ steps.check-build-files.outputs.all_changed_files }}
105 run: |
106 for file in ${CHANGED_SOURCE_FILES} ${CHANGED_BUILD_FILES} ; do
107 echo "$file was changed"
108 done
109 - name: Check Run
110 id: check-run
111 run: |
112 if [ "${{ steps.check-source-files.outputs.any_modified }}" == "true" ] || [ "${{ steps.check-build-files.outputs.any_modified }}" == "true" ] || [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
113 echo 'run=true' >> "${GITHUB_OUTPUT}"
114 else
115 echo 'run=false' >> "${GITHUB_OUTPUT}"
116 fi
117 - name: Check Go
118 id: check-go
119 run: |
120 if [ '${{ github.event_name }}' == 'pull_request' ]; then
121 if echo "${{ steps.check-source-files.outputs.other_changed_files }}" | grep -q '.*/(.*\.go|go\.mod|go\.sum)$' || [ "${{ steps.check-build-files.outputs.any_modified }}" == "true" ]; then
122 echo 'skip-go=' >> "${GITHUB_OUTPUT}"
123 else
124 echo 'skip-go=--disable-go' >> "${GITHUB_OUTPUT}"
125 fi
126 else
127 echo 'skip-go=' >> "${GITHUB_OUTPUT}"
128 fi
129 - name: Check Static
130 id: check-static
131 run: |
132 if [ '${{ github.event_name }}' == 'pull_request' ]; then
133 if [ "${{ steps.check-static-build-files.outputs.any_modified }}" == "true" ] || [ "${{ !contains(github.event.pull_request.labels.*.name, 'run-ci/non-native') }}" = "true" ] || [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
134 echo 'static-native=1' >> "${GITHUB_OUTPUT}"
135 else
136 echo 'static-native=0' >> "${GITHUB_OUTPUT}"
137 fi
138 else
139 echo 'static-native=0' >> "${GITHUB_OUTPUT}"
140 fi
141
142 build-dist: # Build the distribution tarball and store it as an artifact.
143 name: Build Distribution Tarball
144 runs-on: ubuntu-latest
145 needs:
146 - file-check
147 outputs:
148 distfile: ${{ steps.build.outputs.distfile }}
149 steps:
150 - name: Skip Check
151 id: skip
152 if: needs.file-check.outputs.run != 'true'
153 run: echo "SKIPPED"
154 - name: Checkout
155 id: checkout
156 if: needs.file-check.outputs.run == 'true'
157 uses: actions/checkout@v6
158 with:
159 fetch-depth: 0
160 submodules: recursive
161 - name: Fix tags
162 id: fix-tags
163 if: github.event_name != 'push' && needs.file-check.outputs.run == 'true'
164 run: |
165 git fetch --tags --force
166 - name: Mark Stable
167 id: channel
168 if: github.event_name == 'workflow_dispatch' && github.event.inputs.type != 'nightly' && needs.file-check.outputs.run == 'true'
169 run: |
170 sed -i 's/^RELEASE_CHANNEL="nightly"/RELEASE_CHANNEL="stable"/' netdata-installer.sh
171 - name: Build
172 id: build
173 if: needs.file-check.outputs.run == 'true'
174 run: |
175 mkdir -p artifacts/
176 tar --create --file "artifacts/netdata-$(git describe).tar.gz" \
177 --sort=name --posix --auto-compress --exclude=artifacts --exclude=.git \
178 --exclude=.gitignore --exclude=.gitattributes --exclude=.gitmodules \
179 --transform "s/^\\.\\//netdata-$(git describe)\\//" --verbose .
180 cd artifacts/
181 echo "distfile=$(find . -name 'netdata-*.tar.gz')" >> "${GITHUB_OUTPUT}"
182 - name: Store
183 id: store
184 if: needs.file-check.outputs.run == 'true'
185 uses: actions/upload-artifact@v7.0.1
186 with:
187 name: dist-tarball
188 path: artifacts/*.tar.gz
189 compression-level: 0
190 retention-days: 30
191 - name: Failure Notification
192 uses: rtCamp/action-slack-notify@v2
193 env:
194 SLACK_COLOR: 'danger'
195 SLACK_FOOTER: ''
196 SLACK_ICON_EMOJI: ':github-actions:'
197 SLACK_TITLE: 'Distribution tarball creation failed:'
198 SLACK_USERNAME: 'GitHub Actions'
199 SLACK_MESSAGE: |-
200 ${{ github.repository }}: Failed to create source tarball for distribution.
201 Checkout: ${{ steps.checkout.outcome }}
202 Fix Tags: ${{ steps.fix-tags.outcome }}
203 Mark stable: ${{ steps.channel.outcome }}
204 Build: ${{ steps.build.outcome }}
205 Store: ${{ steps.store.outcome }}
206 SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
207 if: >-
208 ${{
209 failure()
210 && startsWith(github.ref, 'refs/heads/master')
211 && github.event_name != 'pull_request'
212 && github.repository == 'netdata/netdata'
213 && needs.file-check.outputs.run == 'true'
214 }}
215
216 static-matrix: # Generate the static build matrix.
217 name: Prepare Build Matrix
218 runs-on: ubuntu-latest
219 needs:
220 - file-check
221 outputs:
222 matrix: ${{ steps.set-matrix.outputs.matrix }}
223 steps:
224 - name: Checkout
225 id: checkout
226 uses: actions/checkout@v6
227 - name: Prepare tools
228 id: prepare
229 run: |
230 sudo apt-get update || true
231 sudo apt-get install -y python3-ruamel.yaml
232 - name: Read build matrix
233 id: set-matrix
234 run: |
235 matrix="$(.github/scripts/gen-matrix-static.py "${{ needs.file-check.outputs.static-native }}")"
236 echo "Generated matrix: ${matrix}"
237 echo "matrix=${matrix}" >> "${GITHUB_OUTPUT}"
238 - name: Failure Notification
239 uses: rtCamp/action-slack-notify@v2
240 env:
241 SLACK_COLOR: 'danger'
242 SLACK_FOOTER: ''
243 SLACK_ICON_EMOJI: ':github-actions:'
244 SLACK_TITLE: 'Static build matrix preparation failed:'
245 SLACK_USERNAME: 'GitHub Actions'
246 SLACK_MESSAGE: |-
247 ${{ github.repository }}: Failed to prepare build matrix for build checks.
248 Checkout: ${{ steps.checkout.outcome }}
249 Prepare tools: ${{ steps.prepare.outcome }}
250 Read build matrix: ${{ steps.set-matrix.outcome }}
251 SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
252 if: >-
253 ${{
254 failure()
255 && startsWith(github.ref, 'refs/heads/master')
256 && github.event_name != 'pull_request'
257 && github.repository == 'netdata/netdata'
258 }}
259
260 build-static: # Build the static binary archives, and store them as artifacts.
261 name: Build Static
262 needs:
263 - file-check
264 - static-matrix
265 strategy:
266 fail-fast: false
267 matrix: ${{ fromJson(needs.static-matrix.outputs.matrix) }}
268 runs-on: ${{ matrix.runner }}
269 steps:
270 - name: Skip Check
271 id: skip
272 if: needs.file-check.outputs.run != 'true'
273 run: echo "SKIPPED"
274 - name: Checkout
275 id: checkout
276 if: needs.file-check.outputs.run == 'true'
277 uses: actions/checkout@v6
278 with:
279 fetch-depth: 0
280 submodules: recursive
281 - name: Fix tags
282 id: fix-tags
283 if: github.event_name != 'push' && needs.file-check.outputs.run == 'true'
284 run: |
285 git fetch --tags --force
286 - name: Mark Stable
287 id: channel
288 if: github.event_name == 'workflow_dispatch' && github.event.inputs.type != 'nightly' && needs.file-check.outputs.run == 'true'
289 run: |
290 sed -i 's/^RELEASE_CHANNEL="nightly"/RELEASE_CHANNEL="stable"/' netdata-installer.sh packaging/makeself/install-or-update.sh
291 - name: Get Cache Key
292 if: (github.event_name != 'pull_request' || ! contains(github.event.pull_request.labels.*.name, 'run-ci/no-cache')) && needs.file-check.outputs.run == 'true'
293 id: cache-key
294 run: .github/scripts/get-static-cache-key.sh ${{ matrix.arch }} "${{ contains(github.event.pull_request.labels.*.name, 'run-ci/no-cache') }}"
295 - name: Cache
296 if: (github.event_name != 'pull_request' || ! contains(github.event.pull_request.labels.*.name, 'run-ci/no-cache')) && needs.file-check.outputs.run == 'true'
297 id: cache
298 uses: actions/cache@v5
299 with:
300 path: artifacts/cache
301 key: ${{ steps.cache-key.outputs.key }}
302 - name: Set up QEMU
303 id: qemu
304 if: matrix.qemu && needs.file-check.outputs.run == 'true'
305 run: |
306 sudo apt-get update
307 sudo apt-get upgrade -y
308 sudo apt-get install -y qemu-user-static
309 - name: Build
310 if: needs.file-check.outputs.run == 'true'
311 run: |
312 [ "${{ matrix.qemu }}" == "true" ] || export SKIP_EMULATION=1
313 .github/scripts/build-static.sh ${{ matrix.arch }}
314 - name: Store
315 id: store
316 if: needs.file-check.outputs.run == 'true'
317 uses: actions/upload-artifact@v7.0.1
318 with:
319 name: dist-static-${{ matrix.arch }}
320 path: artifacts/*.gz.run
321 compression-level: 0
322 retention-days: 30
323 - name: Failure Notification
324 uses: rtCamp/action-slack-notify@v2
325 env:
326 SLACK_COLOR: 'danger'
327 SLACK_FOOTER: ''
328 SLACK_ICON_EMOJI: ':github-actions:'
329 SLACK_TITLE: 'Static build failed:'
330 SLACK_USERNAME: 'GitHub Actions'
331 SLACK_MESSAGE: |-
332 ${{ github.repository }}: Failed to create static installer archive for ${{ matrix.arch }}.
333 Checkout: ${{ steps.checkout.outcome }}
334 Fix Tags: ${{ steps.fix-tags.outcome }}
335 Mark stable: ${{ steps.channel.outcome }}
336 Set up QEMU: ${{ steps.qemu.outcome }}
337 Build: ${{ steps.build.outcome }}
338 Store: ${{ steps.store.outcome }}
339 SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
340 if: >-
341 ${{
342 failure()
343 && startsWith(github.ref, 'refs/heads/master')
344 && github.event_name != 'pull_request'
345 && github.repository == 'netdata/netdata'
346 && needs.file-check.outputs.run == 'true'
347 }}
348
349 windows-build: # Build on Windows
350 name: Build Windows
351 runs-on: windows-latest
352 needs:
353 - file-check
354 steps:
355 - name: Skip Check
356 id: skip
357 if: needs.file-check.outputs.run != 'true'
358 run: Write-Output "SKIPPED"
359 - name: Checkout
360 uses: actions/checkout@v6
361 id: checkout
362 if: needs.file-check.outputs.run == 'true'
363 with:
364 submodules: recursive
365 lfs: true
366 - name: Set Up Go
367 id: golang
368 if: needs.file-check.outputs.run == 'true'
369 uses: actions/setup-go@v6
370 with:
371 go-version: "^1.26"
372 - name: Set Up Dependencies
373 id: deps
374 if: needs.file-check.outputs.run == 'true'
375 run: ./packaging/windows/install-dependencies.ps1
376 - name: Build Netdata
377 id: build
378 if: needs.file-check.outputs.run == 'true'
379 env:
380 BUILD_DIR: ${{ github.workspace }}\build
381 run: ./packaging/windows/build.ps1
382 - name: Sign Agent Code
383 id: sign-agent
384 if: needs.file-check.outputs.run == 'true' && github.event_name != 'pull_request'
385 uses: azure/artifact-signing-action@v2.0.0
386 with:
387 azure-tenant-id: ${{ secrets.CODE_SIGNING_TENNANT_ID }}
388 azure-client-id: ${{ secrets.CODE_SIGNING_CLIENT_ID }}
389 azure-client-secret: ${{ secrets.CODE_SIGNING_CLIENT_SECRET }}
390 endpoint: "https://eus.codesigning.azure.net/"
391 signing-account-name: Netdata
392 certificate-profile-name: Netdata
393 files-folder: ${{ github.workspace }}\build
394 files-folder-filter: exe,dll,sys
395 files-folder-recurse: true
396 file-digest: SHA256
397 timestamp-rfc3161: "http://timestamp.acs.microsoft.com"
398 timestamp-digest: SHA256
399 - name: Package Netdata
400 id: package
401 if: needs.file-check.outputs.run == 'true'
402 env:
403 BUILD_DIR: ${{ github.workspace }}\build
404 run: ./packaging/windows/package.ps1
405 - name: Sign Installer
406 id: sign-installer
407 if: needs.file-check.outputs.run == 'true' && github.event_name != 'pull_request'
408 uses: azure/artifact-signing-action@v2.0.0
409 with:
410 azure-tenant-id: ${{ secrets.CODE_SIGNING_TENNANT_ID }}
411 azure-client-id: ${{ secrets.CODE_SIGNING_CLIENT_ID }}
412 azure-client-secret: ${{ secrets.CODE_SIGNING_CLIENT_SECRET }}
413 endpoint: "https://eus.codesigning.azure.net/"
414 signing-account-name: Netdata
415 certificate-profile-name: Netdata
416 files-folder: ${{ github.workspace }}\packaging\windows
417 files-folder-filter: msi
418 file-digest: SHA256
419 timestamp-rfc3161: "http://timestamp.acs.microsoft.com"
420 timestamp-digest: SHA256
421 - name: Upload Installer
422 id: upload
423 uses: actions/upload-artifact@v7.0.1
424 with:
425 name: windows-x86_64-installer
426 path: packaging\windows\netdata*.msi
427 compression-level: 0
428 retention-days: 30
429 - name: Failure Notification
430 uses: rtCamp/action-slack-notify@v2
431 env:
432 SLACK_COLOR: 'danger'
433 SLACK_FOOTER: ''
434 SLACK_ICON_EMOJI: ':github-actions:'
435 SLACK_TITLE: 'Windows build failed:'
436 SLACK_USERNAME: 'GitHub Actions'
437 SLACK_MESSAGE: |-
438 ${{ github.repository }}: Windows build failed.
439 Checkout: ${{ steps.checkout.outcome }}
440 Set Up Dependencies: ${{ steps.deps.outcome }}
441 Build Netdata: ${{ steps.build.outcome }}
442 Sign Agent Code: ${{ steps.sign-agent.outcome }}
443 Package Netdata: ${{ steps.package.outcome }}
444 Sign Installer: ${{ steps.sign-installer.outcome }}
445 Upload Installer: ${{ steps.upload.outcome }}
446 SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
447 if: >-
448 ${{
449 failure()
450 && startsWith(github.ref, 'refs/heads/master')
451 && github.event_name != 'pull_request'
452 && github.repository == 'netdata/netdata'
453 && needs.file-check.outputs.run == 'true'
454 }}
455
456 windows-test: # Test the Windows installer
457 name: Test Windows installer
458 runs-on: windows-latest
459 needs:
460 - windows-build
461 - file-check
462 steps:
463 - name: Skip Check
464 id: skip
465 if: needs.file-check.outputs.run != 'true'
466 run: Write-Output "SKIPPED"
467 - name: Checkout
468 uses: actions/checkout@v6
469 id: checkout
470 if: needs.file-check.outputs.run == 'true'
471 with:
472 submodules: false
473 lfs: false
474 - name: Retrieve Windows Artifacts
475 id: fetch-windows
476 if: needs.file-check.outputs.run == 'true'
477 uses: Wandalen/wretry.action@v3
478 with:
479 action: actions/download-artifact@v4
480 with: |
481 pattern: windows-*-installer
482 path: dist-artifacts
483 merge-multiple: true
484 attempt_limit: 3
485 attempt_delay: 2000
486 - name: Install Netdata
487 id: install-netdata
488 if: needs.file-check.outputs.run == 'true'
489 run: |
490 $installerProc = Start-Process "msiexec" "/qn /i `"$PWD\dist-artifacts\netdata-x64.msi`" /l* `"$PWD\msi.log`" NDDRVINST=0" -Wait -NoNewWindow -PassThru
491 Write-Output "Exit Code: $installerProc.ExitCode"
492 Get-Content "$PWD\msi.log"
493 $successCodes = @(0, 3010)
494 if ($installerProc.ExitCode -notin $successCodes) {
495 exit 1
496 }
497 - name: Check agent linking
498 id: linker-check
499 if: needs.file-check.outputs.run == 'true'
500 run: ./.github/scripts/windows-linker-check.ps1
501 - name: Failure Notification
502 uses: rtCamp/action-slack-notify@v2
503 env:
504 SLACK_COLOR: 'danger'
505 SLACK_FOOTER: ''
506 SLACK_ICON_EMOJI: ':github-actions:'
507 SLACK_TITLE: 'Windows install test failed:'
508 SLACK_USERNAME: 'GitHub Actions'
509 SLACK_MESSAGE: |-
510 ${{ github.repository }}: Windows install test failed.
511 Checkout agent sources: ${{ steps.checkout.outcome }}
512 Fetch Windows installers: ${{ steps.fetch-windows.outcome }}
513 Install Netdata: ${{ steps.install-netdata.outcome }}
514 Check agent linking: ${{ steps.linker-check.outcome }}
515 SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
516 if: >-
517 ${{
518 failure()
519 && startsWith(github.ref, 'refs/heads/master')
520 && github.event_name != 'pull_request'
521 && github.repository == 'netdata/netdata'
522 && needs.file-check.outputs.run == 'true'
523 }}
524
525 prepare-upload: # Consolidate the artifacts for uploading or releasing.
526 name: Prepare Artifacts
527 runs-on: ubuntu-latest
528 needs:
529 - build-dist
530 - build-static
531 - windows-build
532 - file-check
533 steps:
534 - name: Skip Check
535 id: skip
536 if: needs.file-check.outputs.run != 'true'
537 run: echo "SKIPPED"
538 - name: Checkout
539 id: checkout
540 if: needs.file-check.outputs.run == 'true'
541 uses: actions/checkout@v6
542 - name: Prepare Environment
543 id: prepare
544 if: needs.file-check.outputs.run == 'true'
545 run: mkdir -p artifacts
546 - name: Retrieve Build Artifacts
547 id: fetch-dist
548 if: needs.file-check.outputs.run == 'true'
549 uses: Wandalen/wretry.action@v3
550 with:
551 action: actions/download-artifact@v4
552 with: |
553 pattern: dist-*
554 path: dist-artifacts
555 merge-multiple: true
556 attempt_limit: 3
557 attempt_delay: 2000
558 - name: Retrieve Windows Artifacts
559 id: fetch-windows
560 if: needs.file-check.outputs.run == 'true'
561 uses: Wandalen/wretry.action@v3
562 with:
563 action: actions/download-artifact@v4
564 with: |
565 pattern: windows-*-installer
566 path: dist-artifacts
567 merge-multiple: true
568 attempt_limit: 3
569 attempt_delay: 2000
570 - name: Prepare Artifacts
571 id: consolidate
572 if: needs.file-check.outputs.run == 'true'
573 working-directory: ./artifacts/
574 run: |
575 mv ../dist-artifacts/* . || exit 1
576 ln -s ${{ needs.build-dist.outputs.distfile }} netdata-latest.tar.gz || exit 1
577 cp ../packaging/version ./latest-version.txt || exit 1
578 sha256sum -b ./* > sha256sums.txt || exit 1
579 cat sha256sums.txt
580 - name: Store Artifacts
581 id: store
582 if: needs.file-check.outputs.run == 'true'
583 uses: actions/upload-artifact@v7.0.1
584 with:
585 name: final-artifacts
586 path: artifacts/*
587 compression-level: 0
588 retention-days: 30
589 - name: Failure Notification
590 uses: rtCamp/action-slack-notify@v2
591 env:
592 SLACK_COLOR: 'danger'
593 SLACK_FOOTER: ''
594 SLACK_ICON_EMOJI: ':github-actions:'
595 SLACK_TITLE: 'Failed to prepare release artifacts for upload:'
596 SLACK_USERNAME: 'GitHub Actions'
597 SLACK_MESSAGE: |-
598 ${{ github.repository }}: Failed to prepare release artifacts for upload.
599 Checkout: ${{ steps.checkout.outcome }}
600 Prepare environment: ${{ steps.prepare.outcome }}
601 Fetch dist artifacts: ${{ steps.fetch-dist.outcome }}
602 Fetch Windows installers: ${{ steps.fetch-windows.outcome }}
603 Consolidate artifacts: ${{ steps.consolidate.outcome }}
604 Store: ${{ steps.store.outcome }}
605 SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
606 if: >-
607 ${{
608 failure()
609 && startsWith(github.ref, 'refs/heads/master')
610 && github.event_name != 'pull_request'
611 && github.repository == 'netdata/netdata'
612 && needs.file-check.outputs.run == 'true'
613 }}
614
615 artifact-verification-dist: # Verify the regular installer works with the consolidated artifacts.
616 name: Test Consolidated Artifacts (Source)
617 runs-on: ubuntu-latest
618 needs:
619 - prepare-upload
620 - file-check
621 services:
622 apache: # This gets used to serve the dist tarball for the updater script.
623 image: httpd:2.4
624 ports:
625 - 8080:80
626 volumes:
627 - ${{ github.workspace }}:/usr/local/apache2/htdocs/
628 steps:
629 - name: Skip Check
630 id: skip
631 if: needs.file-check.outputs.run != 'true'
632 run: echo "SKIPPED"
633 - name: Checkout
634 id: checkout
635 if: needs.file-check.outputs.run == 'true'
636 uses: actions/checkout@v6
637 - name: Fetch artifacts
638 id: fetch
639 if: needs.file-check.outputs.run == 'true'
640 uses: Wandalen/wretry.action@v3
641 with:
642 action: actions/download-artifact@v4
643 with: |
644 name: final-artifacts
645 path: artifacts
646 attempt_limit: 3
647 attempt_delay: 2000
648 - name: Prepare artifacts directory
649 id: prepare
650 if: needs.file-check.outputs.run == 'true'
651 run: |
652 mkdir -p download/latest latest
653 mv artifacts/* download/latest
654 cp -a download/latest/* latest
655 ls -al download/latest
656 - name: Verify that artifacts work with installer
657 id: verify
658 if: needs.file-check.outputs.run == 'true'
659 env:
660 NETDATA_TARBALL_BASEURL: http://localhost:8080/
661 run: sh -x packaging/installer/kickstart.sh --build-only --dont-start-it --disable-telemetry --dont-wait
662 - name: Failure Notification
663 uses: rtCamp/action-slack-notify@v2
664 env:
665 SLACK_COLOR: 'danger'
666 SLACK_FOOTER: ''
667 SLACK_ICON_EMOJI: ':github-actions:'
668 SLACK_TITLE: 'Artifact verification for source tarball failed.'
669 SLACK_USERNAME: 'GitHub Actions'
670 SLACK_MESSAGE: |-
671 ${{ github.repository }}: Artifact verification for source tarball failed.
672 Checkout: ${{ steps.checkout.outcome }}
673 Fetch artifacts: ${{ steps.fetch.outcome }}
674 Verify artifacts: ${{ steps.verify.outcome }}
675 SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
676 if: >-
677 ${{
678 failure()
679 && startsWith(github.ref, 'refs/heads/master')
680 && github.event_name != 'pull_request'
681 && github.repository == 'netdata/netdata'
682 && needs.file-check.outputs.run == 'true'
683 }}
684
685 artifact-verification-static: # Verify the static installer works with the consolidated artifacts.
686 name: Test Consolidated Artifacts (Static)
687 runs-on: ubuntu-latest
688 needs:
689 - prepare-upload
690 - file-check
691 services:
692 apache: # This gets used to serve the static archives.
693 image: httpd:2.4
694 ports:
695 - 8080:80
696 volumes:
697 - ${{ github.workspace }}:/usr/local/apache2/htdocs/
698 steps:
699 - name: Skip Check
700 id: skip
701 if: needs.file-check.outputs.run != 'true'
702 run: echo "SKIPPED"
703 - name: Checkout
704 id: checkout
705 if: needs.file-check.outputs.run == 'true'
706 uses: actions/checkout@v6
707 - name: Fetch artifacts
708 id: fetch-artifacts
709 if: needs.file-check.outputs.run == 'true'
710 uses: Wandalen/wretry.action@v3
711 with:
712 action: actions/download-artifact@v4
713 with: |
714 name: final-artifacts
715 path: artifacts
716 attempt_limit: 3
717 attempt_delay: 2000
718 - name: Prepare artifacts directory
719 id: prepare
720 if: needs.file-check.outputs.run == 'true'
721 run: |
722 mkdir -p download/latest latest
723 mv artifacts/* download/latest
724 cp -a download/latest/* latest
725 ls -al download/latest
726 - name: Verify that artifacts work with installer
727 id: verify
728 if: needs.file-check.outputs.run == 'true'
729 env:
730 NETDATA_TARBALL_BASEURL: http://localhost:8080/
731 run: sh -x packaging/installer/kickstart.sh --static-only --dont-start-it --disable-telemetry
732 - name: Failure Notification
733 uses: rtCamp/action-slack-notify@v2
734 env:
735 SLACK_COLOR: 'danger'
736 SLACK_FOOTER: ''
737 SLACK_ICON_EMOJI: ':github-actions:'
738 SLACK_TITLE: 'Artifact verification for static build failed.'
739 SLACK_USERNAME: 'GitHub Actions'
740 SLACK_MESSAGE: |-
741 ${{ github.repository }}: Artifact verification for static build failed.
742 Checkout: ${{ steps.checkout.outcome }}
743 Fetch artifacts: ${{ steps.fetch-artifacts.outcome }}
744 Verify artifacts: ${{ steps.verify.outcome }}
745 SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
746 if: >-
747 ${{
748 failure()
749 && startsWith(github.ref, 'refs/heads/master')
750 && github.event_name != 'pull_request'
751 && github.repository == 'netdata/netdata'
752 && needs.file-check.outputs.run == 'true'
753 }}
754
755 artifact-verification-updater: # Test the generated dist archive using the updater code.
756 name: Test Consolidated Artifacts (Updater)
757 runs-on: ubuntu-latest
758 needs:
759 - prepare-upload
760 - file-check
761 services:
762 apache: # This gets used to serve the dist tarball for the updater script.
763 image: httpd:2.4
764 ports:
765 - 8080:80
766 volumes:
767 - ${{ github.workspace }}:/usr/local/apache2/htdocs/
768 steps:
769 - name: Skip Check
770 id: skip
771 if: needs.file-check.outputs.run != 'true'
772 run: echo "SKIPPED"
773 - name: Checkout
774 id: checkout
775 if: needs.file-check.outputs.run == 'true'
776 uses: actions/checkout@v6
777 - name: Fetch artifacts
778 id: fetch-artifacts
779 if: needs.file-check.outputs.run == 'true'
780 uses: Wandalen/wretry.action@v3
781 with:
782 action: actions/download-artifact@v4
783 with: |
784 name: final-artifacts
785 path: artifacts
786 attempt_limit: 3
787 attempt_delay: 2000
788 - name: Prepare artifacts directory
789 id: prepare
790 if: needs.file-check.outputs.run == 'true'
791 run: |
792 mkdir -p download/latest latest
793 mv artifacts/* download/latest
794 cp -a download/latest/* latest
795 ls -al download/latest
796 - name: Run Updater Check
797 id: check
798 if: needs.file-check.outputs.run == 'true'
799 run: |
800 docker run --security-opt seccomp=unconfined -e DISABLE_TELEMETRY=1 --network host \
801 -v $PWD:/netdata -w /netdata \
802 ubuntu:latest /bin/sh -x /netdata/.github/scripts/run-updater-check.sh
803 - name: Failure Notification
804 uses: rtCamp/action-slack-notify@v2
805 env:
806 SLACK_COLOR: 'danger'
807 SLACK_FOOTER: ''
808 SLACK_ICON_EMOJI: ':github-actions:'
809 SLACK_TITLE: 'Updater checks failed:'
810 SLACK_USERNAME: 'GitHub Actions'
811 SLACK_MESSAGE: |-
812 ${{ github.repository }}: Updater checks for failed.
813 Checkout: ${{ steps.checkout.outcome }}
814 Fetch artifacts: ${{ steps.fetch-artifacts.outcome }}
815 Prepare artifact directory: ${{ steps.prepare.outcome }}
816 Updater check: ${{ steps.check.outcome }}
817 SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
818 if: >-
819 ${{
820 failure()
821 && startsWith(github.ref, 'refs/heads/master')
822 && github.event_name != 'pull_request'
823 && github.repository == 'netdata/netdata'
824 && needs.file-check.outputs.run == 'true'
825 }}
826
827 create-nightly: # Create a nightly build release in netdata/netdata-nightlies
828 name: Create Nightly Release
829 runs-on: ubuntu-latest
830 if: github.event_name == 'workflow_dispatch' && github.event.inputs.type == 'nightly' && github.repository == 'netdata/netdata'
831 needs:
832 - prepare-upload
833 - windows-test
834 - artifact-verification-dist
835 - artifact-verification-static
836 steps:
837 - name: Checkout Main Repo
838 id: checkout-main
839 uses: actions/checkout@v6
840 with:
841 path: main
842 - name: Checkout Nightly Repo
843 id: checkout-nightly
844 uses: actions/checkout@v6
845 with:
846 repository: netdata/netdata-nightlies
847 path: nightlies
848 token: ${{ secrets.NETDATABOT_GITHUB_TOKEN }}
849 - name: Retrieve Artifacts
850 id: fetch
851 uses: Wandalen/wretry.action@v3
852 with:
853 action: actions/download-artifact@v4
854 with: |
855 name: final-artifacts
856 path: final-artifacts
857 attempt_limit: 3
858 attempt_delay: 2000
859 - name: Prepare version info
860 id: version
861 run: |
862 # shellcheck disable=SC2129
863 echo "version=$(cat main/packaging/version)" >> "${GITHUB_OUTPUT}"
864 echo "commit=$(cd nightlies && git rev-parse HEAD)" >> "${GITHUB_OUTPUT}"
865 echo "date=$(date +%F)" >> "${GITHUB_OUTPUT}"
866 - name: Create Release
867 id: create-release
868 uses: ncipollo/release-action@v1
869 with:
870 allowUpdates: false
871 artifactErrorsFailBuild: true
872 artifacts: 'final-artifacts/sha256sums.txt,final-artifacts/netdata-*.tar.gz,final-artifacts/netdata-*.gz.run,final-artifacts/netdata-*.msi'
873 owner: netdata
874 repo: netdata-nightlies
875 body: Netdata nightly build for ${{ steps.version.outputs.date }}.
876 commit: ${{ steps.version.outputs.commit }}
877 makeLatest: true
878 tag: ${{ steps.version.outputs.version }}
879 token: ${{ secrets.NETDATABOT_GITHUB_TOKEN }}
880 - name: Checkout netdata main Repo # Checkout back to netdata/netdata repo to the update latest packaged versions
881 id: checkout-netdata
882 uses: actions/checkout@v6
883 with:
884 token: ${{ secrets.NETDATABOT_GITHUB_TOKEN }}
885 - name: Init python environment for publish release metadata
886 uses: actions/setup-python@v6
887 id: init-python
888 with:
889 python-version: "3.12"
890 - name: Setup python environment
891 id: setup-python
892 run: |
893 pip install -r .github/scripts/modules/requirements.txt
894 - name: Check if the version is latest and published
895 id: check-latest-version
896 run: |
897 python .github/scripts/check_latest_versions.py ${{ steps.version.outputs.version }}
898 - name: SSH setup
899 id: ssh-setup
900 if: github.event_name == 'workflow_dispatch' && github.repository == 'netdata/netdata' && steps.check-latest-version.outputs.versions_needs_update == 'true'
901 uses: shimataro/ssh-key-action@v2
902 with:
903 key: ${{ secrets.NETDATABOT_PACKAGES_SSH_KEY }}
904 name: id_ecdsa
905 known_hosts: ${{ secrets.PACKAGES_KNOWN_HOSTS }}
906 - name: Sync release info to packages.netdata.cloud
907 id: sync-releases
908 continue-on-error: true
909 if: github.event_name == 'workflow_dispatch' && github.repository == 'netdata/netdata' && steps.check-latest-version.outputs.versions_needs_update == 'true'
910 run: |
911 .github/scripts/upload-new-version-tags.sh packages.netdata.cloud
912 - name: Sync release info to packages2.netdata.cloud
913 id: sync-releases2
914 if: github.event_name == 'workflow_dispatch' && github.repository == 'netdata/netdata' && steps.check-latest-version.outputs.versions_needs_update == 'true'
915 run: |
916 .github/scripts/upload-new-version-tags.sh packages.netdata.cloud
917 - name: Failure Notification
918 uses: rtCamp/action-slack-notify@v2
919 env:
920 SLACK_COLOR: 'danger'
921 SLACK_FOOTER: ''
922 SLACK_ICON_EMOJI: ':github-actions:'
923 SLACK_TITLE: 'Failed to draft release:'
924 SLACK_USERNAME: 'GitHub Actions'
925 SLACK_MESSAGE: |-
926 ${{ github.repository }}: Failed to create nightly release or attach artifacts.
927 Checkout netdata/netdata: ${{ steps.checkout-main.outcome }}
928 Checkout netdata/netdata-nightlies: ${{ steps.checkout-nightly.outcome }}
929 Fetch artifacts: ${{ steps.fetch.outcome }}
930 Prepare version info: ${{ steps.version.outcome }}
931 Create release: ${{ steps.create-release.outcome }}
932 Checkout back netdata/netdata: ${{ steps.checkout-netdata.outcome }}
933 Init python environment: ${{ steps.init-python.outcome }}
934 Setup python environment: ${{ steps.setup-python.outcome }}
935 Check the nearly published release against the advertised: ${{ steps.check-latest-version.outcome }}
936 Setup ssh: ${{ steps.ssh-setup.outcome }}
937 Sync release info to packages.netdata.cloud: ${{ steps.sync-releases.outcome }}
938 Sync release info to packages2.netdata.cloud: ${{ steps.sync-releases2.outcome }}
939 SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
940 if: >-
941 ${{
942 failure()
943 && github.event_name == 'workflow_dispatch'
944 }}
945
946 normalize-tag: # Fix the release tag if needed
947 name: Normalize Release Tag
948 runs-on: ubuntu-latest
949 if: github.event_name == 'workflow_dispatch' && github.event.inputs.type == 'release'
950 outputs:
951 tag: ${{ steps.tag.outputs.tag }}
952 steps:
953 - name: Normalize Tag
954 id: tag
955 run: |
956 if echo ${{ github.event.inputs.version }} | grep -qE '^[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+$'; then
957 echo "tag=v${{ github.event.inputs.version }}" >> "${GITHUB_OUTPUT}"
958 else
959 echo "tag=${{ github.event.inputs.version }}" >> "${GITHUB_OUTPUT}"
960 fi
961
962 upload-release: # Create the draft release and upload the build artifacts.
963 name: Create Release Draft
964 runs-on: ubuntu-latest
965 if: github.event_name == 'workflow_dispatch' && github.event.inputs.type == 'release' && github.repository == 'netdata/netdata'
966 needs:
967 - artifact-verification-dist
968 - artifact-verification-static
969 - windows-test
970 - normalize-tag
971 steps:
972 - name: Checkout
973 id: checkout
974 uses: actions/checkout@v6
975 - name: Retrieve Artifacts
976 id: fetch
977 uses: Wandalen/wretry.action@v3
978 with:
979 action: actions/download-artifact@v4
980 with: |
981 name: final-artifacts
982 path: final-artifacts
983 attempt_limit: 3
984 attempt_delay: 2000
985 - name: Create Release
986 id: create-release
987 uses: ncipollo/release-action@v1
988 with:
989 allowUpdates: false
990 artifactErrorsFailBuild: true
991 artifacts: 'final-artifacts/sha256sums.txt,final-artifacts/netdata-*.tar.gz,final-artifacts/netdata-*.gz.run,final-artifacts/netdata-*.msi'
992 draft: true
993 tag: ${{ needs.normalize-tag.outputs.tag }}
994 token: ${{ secrets.NETDATABOT_GITHUB_TOKEN }}
995 - name: Failure Notification
996 uses: rtCamp/action-slack-notify@v2
997 env:
998 SLACK_COLOR: 'danger'
999 SLACK_FOOTER: ''
1000 SLACK_ICON_EMOJI: ':github-actions:'
1001 SLACK_TITLE: 'Failed to draft release:'
1002 SLACK_USERNAME: 'GitHub Actions'
1003 SLACK_MESSAGE: |-
1004 ${{ github.repository }}: Failed to create draft release or attach artifacts.
1005 Checkout: ${{ steps.checkout.outcome }}
1006 Fetch artifacts: ${{ steps.fetch.outcome }}
1007 Create draft release: ${{ steps.create-release.outcome }}
1008 SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
1009 if: >-
1010 ${{
1011 failure()
1012 && github.event_name == 'workflow_dispatch'
1013 }}
1014 - name: Success Notification
1015 uses: rtCamp/action-slack-notify@v2
1016 env:
1017 SLACK_COLOR: 'good'
1018 SLACK_FOOTER: ''
1019 SLACK_ICON_EMOJI: ':github-actions:'
1020 SLACK_TITLE: 'Created agent draft release:'
1021 SLACK_USERNAME: 'GitHub Actions'
1022 SLACK_MESSAGE: "${{ github.repository }}: ${{ steps.create-release.outputs.html_url }}"
1023 SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
1024 if: >-
1025 ${{
1026 success()
1027 && github.event_name == 'workflow_dispatch'
1028 }}
1029
1030 # Remaining jobs are only used for CI checks, and not as part of the release process
1031
1032 src-matrix: # Generate the shared build matrix for our Linux build tests.
1033 name: Prepare Build Matrix
1034 runs-on: ubuntu-latest
1035 if: github.event_name != 'workflow_dispatch'
1036 outputs:
1037 matrix: ${{ steps.set-matrix.outputs.matrix }}
1038 steps:
1039 - name: Checkout
1040 id: checkout
1041 uses: actions/checkout@v6
1042 - name: Prepare tools
1043 id: prepare
1044 run: |
1045 sudo apt-get update || true
1046 sudo apt-get install -y python3-ruamel.yaml
1047 - name: Read build matrix
1048 id: set-matrix
1049 run: |
1050 matrix="$(.github/scripts/gen-matrix-build.py)"
1051 echo "Generated matrix: ${matrix}"
1052 echo "matrix=${matrix}" >> "${GITHUB_OUTPUT}"
1053 - name: Failure Notification
1054 uses: rtCamp/action-slack-notify@v2
1055 env:
1056 SLACK_COLOR: 'danger'
1057 SLACK_FOOTER: ''
1058 SLACK_ICON_EMOJI: ':github-actions:'
1059 SLACK_TITLE: 'Build matrix preparation failed:'
1060 SLACK_USERNAME: 'GitHub Actions'
1061 SLACK_MESSAGE: |-
1062 ${{ github.repository }}: Failed to prepare build matrix for build checks.
1063 Checkout: ${{ steps.checkout.outcome }}
1064 Prepare tools: ${{ steps.prepare.outcome }}
1065 Read build matrix: ${{ steps.set-matrix.outcome }}
1066 SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
1067 if: >-
1068 ${{
1069 failure()
1070 && startsWith(github.ref, 'refs/heads/master')
1071 && github.event_name != 'pull_request'
1072 && github.repository == 'netdata/netdata'
1073 }}
1074
1075 source-build: # Test various source build arrangements.
1076 name: Test Source Build
1077 runs-on: ubuntu-latest
1078 if: github.event_name != 'workflow_dispatch'
1079 needs:
1080 - src-matrix
1081 - file-check
1082 strategy:
1083 fail-fast: false
1084 max-parallel: 8
1085 matrix: ${{ fromJson(needs.src-matrix.outputs.matrix) }}
1086 steps:
1087 - name: Skip Check
1088 id: skip
1089 if: needs.file-check.outputs.run != 'true'
1090 run: echo "SKIPPED"
1091 - name: Checkout
1092 id: checkout
1093 if: needs.file-check.outputs.run == 'true'
1094 uses: actions/checkout@v6
1095 with:
1096 submodules: recursive
1097 - name: Setup Buildx
1098 id: buildx
1099 uses: docker/setup-buildx-action@v4
1100 - name: Build test environment
1101 id: build
1102 uses: Wandalen/wretry.action@v3
1103 with:
1104 action: docker/build-push-action@v6
1105 with: |
1106 push: false
1107 load: true
1108 file: .github/dockerfiles/Dockerfile.build_test
1109 build-args: |
1110 BASE=${{ matrix.distro }}
1111 PRE=${{ matrix.env_prep }}
1112 RMJSONC=${{ matrix.jsonc_removal }}
1113 tags: test:${{ matrix.artifact_key }}
1114 attempt_limit: 3
1115 attempt_delay: 15000
1116 - name: netdata-installer on ${{ matrix.distro }}
1117 id: build-cloud
1118 if: needs.file-check.outputs.run == 'true'
1119 run: |
1120 docker run --security-opt seccomp=unconfined -w /netdata test:${{ matrix.artifact_key }} \
1121 /bin/sh -c './netdata-installer.sh --dont-wait --dont-start-it --one-time-build ${{ needs.file-check.outputs.skip-go }}'
1122 - name: Failure Notification
1123 uses: rtCamp/action-slack-notify@v2
1124 env:
1125 SLACK_COLOR: 'danger'
1126 SLACK_FOOTER: ''
1127 SLACK_ICON_EMOJI: ':github-actions:'
1128 SLACK_TITLE: 'Build tests for ${{ matrix.distro }} failed:'
1129 SLACK_USERNAME: 'GitHub Actions'
1130 SLACK_MESSAGE: |-
1131 ${{ github.repository }}: Build tests for ${{ matrix.distro }} failed.
1132 Checkout: ${{ steps.checkout.outcome }}
1133 Set up Buildx: ${{ steps.buildx.outcome }}
1134 Build test environment: ${{ steps.build.outcome }}
1135 netdata-installer: ${{ steps.build-cloud.outcome }}
1136 SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
1137 if: >-
1138 ${{
1139 failure()
1140 && startsWith(github.ref, 'refs/heads/master')
1141 && github.event_name != 'pull_request'
1142 && github.repository == 'netdata/netdata'
1143 && needs.file-check.outputs.run == 'true'
1144 }}
1145
1146 macos-build: # Test building on macOS
1147 name: Test building on macOS
1148 runs-on: ${{ matrix.runner }}
1149 if: github.event_name != 'workflow_dispatch'
1150 needs:
1151 - file-check
1152 strategy:
1153 fail-fast: false
1154 max-parallel: 8
1155 matrix:
1156 include:
1157 - name: macos-14-M1
1158 runner: macos-14
1159 - name: macos-15-M1
1160 runner: macos-15
1161 - name: macos-26-M1
1162 runner: macos-26
1163 steps:
1164 - name: Skip Check
1165 id: skip
1166 if: needs.file-check.outputs.run != 'true'
1167 run: echo "SKIPPED"
1168 - uses: actions/checkout@v6
1169 id: checkout
1170 if: needs.file-check.outputs.run == 'true'
1171 with:
1172 submodules: recursive
1173 - name: Install latest bash
1174 id: install-bash
1175 if: needs.file-check.outputs.run == 'true'
1176 run: |
1177 brew install bash
1178 - name: Install netdata dependencies
1179 id: install-nd-dep
1180 if: needs.file-check.outputs.run == 'true'
1181 run: |
1182 bash ./packaging/installer/install-required-packages.sh --dont-wait --non-interactive netdata-all
1183 - name: Build from source
1184 id: build-source
1185 if: needs.file-check.outputs.run == 'true'
1186 run: |
1187 sudo bash ./netdata-installer.sh --install-no-prefix /usr/local/netdata --dont-wait --dont-start-it --one-time-build
1188 - name: Test Agent start up
1189 id: test-agent
1190 if: needs.file-check.outputs.run == 'true'
1191 run: |
1192 echo "::group::Netdata buildinfo"
1193 /usr/local/netdata/usr/sbin/netdata -W buildinfo
1194 echo "::endgroup::"
1195 /usr/local/netdata/usr/sbin/netdata -D > ./netdata.log 2>&1 &
1196 ./packaging/runtime-check.sh
1197 - name: Failure Notification
1198 uses: rtCamp/action-slack-notify@v2
1199 env:
1200 SLACK_COLOR: 'danger'
1201 SLACK_FOOTER: ''
1202 SLACK_ICON_EMOJI: ':github-actions:'
1203 SLACK_TITLE: 'Build & test from source macOS failed:'
1204 SLACK_USERNAME: 'GitHub Actions'
1205 SLACK_MESSAGE: |-
1206 ${{ github.repository }}: macOS Build and test.
1207 Checkout: ${{ steps.checkout.outcome }}
1208 Setup runner: ${{ steps.install-bash.outcome }}
1209 Install netdata required packages: ${{ steps.install-nd-dep.outcome }}
1210 Build from source: ${{ steps.build-source.outcome }}
1211 Test Agent runtime: ${{ steps.test-agent.outcome }}
1212 SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
1213 if: >-
1214 ${{
1215 failure()
1216 && startsWith(github.ref, 'refs/heads/master')
1217 && github.event_name != 'pull_request'
1218 && github.repository == 'netdata/netdata'
1219 }}