| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| # |
| --- |
| name: "CI Notification" |
| on: # yamllint disable-line rule:truthy |
| schedule: |
| - cron: '0 6,17 * * *' |
| workflow_dispatch: |
| permissions: |
| # All other permissions are set to none by default |
| contents: read |
| env: |
| GITHUB_REPOSITORY: ${{ github.repository }} |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
| GITHUB_USERNAME: ${{ github.actor }} |
| SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }} |
| VERBOSE: "true" |
| |
| jobs: |
| |
| workflow-status: |
| strategy: |
| matrix: |
| branch: ["v3-2-test"] |
| # Track AMD; ARM is the canary slot and is reported separately by |
| # `ci-arm.yml`'s notify-slack job on schedule events. |
| workflow-id: ["ci-amd.yml"] |
| runs-on: ubuntu-latest |
| steps: |
| - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )" |
| uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 |
| with: |
| persist-credentials: false |
| |
| - name: "Find workflow run status" |
| id: find-workflow-run-status |
| run: | |
| python3 -m pip install uv |
| uv run ./dev/breeze/src/airflow_breeze/utils/workflow_status.py |
| env: |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
| workflow_branch: ${{ matrix.branch }} |
| workflow_id: ${{ matrix.workflow-id }} |
| |
| - name: "Determine notification action" |
| id: notification |
| shell: bash |
| run: | |
| command -v gh >/dev/null 2>&1 || { echo "::error::gh CLI is not installed"; exit 1; } |
| gh auth status || gh auth login --with-token <<< "${GITHUB_TOKEN}" |
| python3 scripts/ci/slack_notification_state.py |
| env: |
| ARTIFACT_NAME: "slack-state-ci-${{ matrix.branch }}-${{ matrix.workflow-id }}" |
| CURRENT_FAILURES: "${{ steps.find-workflow-run-status.outputs.failed-jobs }}" |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
| |
| - name: "Upload notification state" |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 |
| with: |
| name: "slack-state-ci-${{ matrix.branch }}-${{ matrix.workflow-id }}" |
| path: ./slack-state/ |
| retention-days: 7 |
| overwrite: true |
| |
| - name: "Send Slack notification (new/changed failures)" |
| if: steps.notification.outputs.action == 'notify_new' |
| uses: slackapi/slack-github-action@45a88b9581bfab2566dc881e2cd66d334e621e2c # v3.0.3 |
| with: |
| method: chat.postMessage |
| token: ${{ env.SLACK_BOT_TOKEN }} |
| # yamllint disable rule:line-length |
| payload: | |
| channel: "internal-airflow-ci-cd" |
| text: "🚨 Failure Alert: ${{ env.workflow_id }} on branch *${{ env.branch }}*\n\nFailing jobs:\n${{ steps.find-workflow-run-status.outputs.failed-jobs }}\n\n*Details:* <${{ env.run_url }}|View the failure log>" |
| blocks: |
| - type: "section" |
| text: |
| type: "mrkdwn" |
| text: "🚨 Failure Alert: ${{ env.workflow_id }} on *${{ env.branch }}*\n\nFailing jobs:\n${{ steps.find-workflow-run-status.outputs.failed-jobs }}\n\n*Details:* <${{ env.run_url }}|View the failure log>" |
| # yamllint enable rule:line-length |
| env: |
| run_url: ${{ steps.find-workflow-run-status.outputs.run-url }} |
| branch: ${{ matrix.branch }} |
| workflow_id: ${{ matrix.workflow-id }} |
| |
| - name: "Send Slack notification (still not fixed)" |
| if: steps.notification.outputs.action == 'notify_reminder' |
| uses: slackapi/slack-github-action@45a88b9581bfab2566dc881e2cd66d334e621e2c # v3.0.3 |
| with: |
| method: chat.postMessage |
| token: ${{ env.SLACK_BOT_TOKEN }} |
| # yamllint disable rule:line-length |
| payload: | |
| channel: "internal-airflow-ci-cd" |
| text: "🚨🔁 Still not fixed: ${{ env.workflow_id }} on branch *${{ env.branch }}*\n\nFailing jobs:\n${{ steps.find-workflow-run-status.outputs.failed-jobs }}\n\n*Details:* <${{ env.run_url }}|View the failure log>" |
| blocks: |
| - type: "section" |
| text: |
| type: "mrkdwn" |
| text: "🚨🔁 Still not fixed: ${{ env.workflow_id }} on *${{ env.branch }}*\n\nFailing jobs:\n${{ steps.find-workflow-run-status.outputs.failed-jobs }}\n\n*Details:* <${{ env.run_url }}|View the failure log>" |
| # yamllint enable rule:line-length |
| env: |
| run_url: ${{ steps.find-workflow-run-status.outputs.run-url }} |
| branch: ${{ matrix.branch }} |
| workflow_id: ${{ matrix.workflow-id }} |
| |
| - name: "Send Slack notification (all passing)" |
| if: steps.notification.outputs.action == 'notify_recovery' |
| uses: slackapi/slack-github-action@45a88b9581bfab2566dc881e2cd66d334e621e2c # v3.0.3 |
| with: |
| method: chat.postMessage |
| token: ${{ env.SLACK_BOT_TOKEN }} |
| # yamllint disable rule:line-length |
| payload: | |
| channel: "internal-airflow-ci-cd" |
| text: "✅ All passing: ${{ env.workflow_id }} on branch *${{ env.branch }}*\n\n*Details:* <${{ env.run_url }}|View the run log>" |
| blocks: |
| - type: "section" |
| text: |
| type: "mrkdwn" |
| text: "✅ All passing: ${{ env.workflow_id }} on *${{ env.branch }}*\n\n*Details:* <${{ env.run_url }}|View the run log>" |
| # yamllint enable rule:line-length |
| env: |
| run_url: ${{ steps.find-workflow-run-status.outputs.run-url }} |
| branch: ${{ matrix.branch }} |
| workflow_id: ${{ matrix.workflow-id }} |