This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new 022e35d9719 Restore AMD scheduled canary, split README badges, fix
Slack-state collision (#66662)
022e35d9719 is described below
commit 022e35d9719b61e9d575f97750040faf9cc58e45
Author: Jarek Potiuk <[email protected]>
AuthorDate: Sun May 10 20:22:25 2026 +0200
Restore AMD scheduled canary, split README badges, fix Slack-state
collision (#66662)
PR #66348 split the combined ci-amd-arm.yml into per-platform wrappers and
intentionally deferred re-adding a schedule trigger to ci-amd.yml ('No
schedule for now; ARM keeps the canary slot. Add a schedule: block here
if/when AMD should also act as a scheduled canary'). As a result:
- The AMD 'Tests (AMD)' badge on the README pointed at a workflow that
hadn't run on main since 2025-10-25 (it now only runs on PRs and
release-branch pushes), so the badge was stale.
- The notify-slack job at the bottom of ci-amd.yml is gated on
github.event_name == 'schedule' and was therefore dead code: there
was no schedule trigger left to fire it.
- main on AMD had no scheduled CI monitor at all (ci-notification.yml
only watches v3-2-test x ci-amd.yml, and the comment there assumes
ARM is reported by its own notify-slack).
This change:
1. Restores the previous AMD canary cron in ci-amd.yml at minute :58 of
the same hours ARM uses, so the two scheduled runs don't compete for
runners at exactly the same minute.
2. Splits the README build-status row for main into two badges (AMD and
ARM), drops the obsolete 2.x row (still using the legacy ci.yml), and
keeps 3.x AMD-only (ARM has no v3-2-test schedule). Click-throughs go
to the workflow page rather than the catch-all /actions URL.
3. Disambiguates the slack-state artifact names that ci-amd.yml,
ci-arm.yml, and ci-image-checks.yml share. Before this PR the latent
collision did not bite (AMD's notify-slack never fired); restoring
the AMD schedule activates it. Each platform now writes its own
slack-state-{tests,inventory}-<branch>-{amd,arm} artifact so the
de-dup tracker in scripts/ci/slack_notification_state.py keeps
independent state per platform.
4. Updates scripts/ci/prek/check_ci_workflows_in_sync.py to allow the
new AMD-only schedule block and the per-platform artifact-name
suffix as documented divergences.
generated/PYPI_README.md is regenerated automatically by the
generate-pypi-readme prek hook to mirror README.md.
---
.github/workflows/ci-amd.yml | 9 +++++++--
.github/workflows/ci-arm.yml | 4 ++--
.github/workflows/ci-image-checks.yml | 6 ++++--
README.md | 5 ++---
generated/PYPI_README.md | 5 ++---
scripts/ci/prek/check_ci_workflows_in_sync.py | 22 +++++++++++++++++++---
6 files changed, 36 insertions(+), 15 deletions(-)
diff --git a/.github/workflows/ci-amd.yml b/.github/workflows/ci-amd.yml
index f657b7fb314..bc8397a631c 100644
--- a/.github/workflows/ci-amd.yml
+++ b/.github/workflows/ci-amd.yml
@@ -25,6 +25,11 @@
# Edit both files together when changing pipeline shape.
name: Tests (AMD)
on: # yamllint disable-line rule:truthy
+ schedule:
+ # Mirror of the previous AMD canary cron from before the AMD/ARM split (PR
#66348),
+ # offset by 30 min from ARM's `:28` slot in `ci-arm.yml` so the two
scheduled
+ # canaries don't compete for runners at exactly the same minute.
+ - cron: '58 1,7,13,19 * * *'
push:
branches:
- v[0-9]+-[0-9]+-test
@@ -1056,13 +1061,13 @@ jobs:
gh auth status || gh auth login --with-token <<< "${GITHUB_TOKEN}"
python3 scripts/ci/slack_notification_state.py
env:
- ARTIFACT_NAME: "slack-state-tests-${{ github.ref_name }}"
+ ARTIFACT_NAME: "slack-state-tests-${{ github.ref_name }}-amd"
CURRENT_FAILURES: "${{ steps.get-failures.outputs.failed-jobs }}"
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: "Upload notification state"
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
# v7.0.1
with:
- name: "slack-state-tests-${{ github.ref_name }}"
+ name: "slack-state-tests-${{ github.ref_name }}-amd"
path: ./slack-state/
retention-days: 7
overwrite: true
diff --git a/.github/workflows/ci-arm.yml b/.github/workflows/ci-arm.yml
index 27aa6b0c8e2..ce92595bad2 100644
--- a/.github/workflows/ci-arm.yml
+++ b/.github/workflows/ci-arm.yml
@@ -1047,13 +1047,13 @@ jobs:
gh auth status || gh auth login --with-token <<< "${GITHUB_TOKEN}"
python3 scripts/ci/slack_notification_state.py
env:
- ARTIFACT_NAME: "slack-state-tests-${{ github.ref_name }}"
+ ARTIFACT_NAME: "slack-state-tests-${{ github.ref_name }}-arm"
CURRENT_FAILURES: "${{ steps.get-failures.outputs.failed-jobs }}"
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: "Upload notification state"
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
# v7.0.1
with:
- name: "slack-state-tests-${{ github.ref_name }}"
+ name: "slack-state-tests-${{ github.ref_name }}-arm"
path: ./slack-state/
retention-days: 7
overwrite: true
diff --git a/.github/workflows/ci-image-checks.yml
b/.github/workflows/ci-image-checks.yml
index 7956ec90e1b..53966ca3bd5 100644
--- a/.github/workflows/ci-image-checks.yml
+++ b/.github/workflows/ci-image-checks.yml
@@ -245,7 +245,8 @@ jobs:
shell: bash
run: python3 scripts/ci/slack_notification_state.py
env:
- ARTIFACT_NAME: "slack-state-inventory-${{ inputs.branch }}"
+ # yamllint disable-line rule:line-length
+ ARTIFACT_NAME: "slack-state-inventory-${{ inputs.branch }}-${{
contains(inputs.platform, 'arm') && 'arm' || 'amd' }}"
CURRENT_FAILURES: "${{
steps.check-missing-inventories.outputs.packages }}"
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: "Upload inventory notification state"
@@ -255,7 +256,8 @@ jobs:
matrix.flag == '--docs-only'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
# v7.0.1
with:
- name: "slack-state-inventory-${{ inputs.branch }}"
+ # yamllint disable-line rule:line-length
+ name: "slack-state-inventory-${{ inputs.branch }}-${{
contains(inputs.platform, 'arm') && 'arm' || 'amd' }}"
path: ./slack-state/
retention-days: 7
overwrite: true
diff --git a/README.md b/README.md
index a6592439616..3ca3a418e22 100644
--- a/README.md
+++ b/README.md
@@ -30,9 +30,8 @@
| Version | Build Status
|
|---------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| Main | [](https://github.com/apache/airflow/actions)
|
-| 3.x | [](https://github.com/apache/airflow/actions)
|
-| 2.x | [](https://github.com/apache/airflow/actions)
|
+| Main | [](https://github.com/apache/airflow/actions/workflows/ci-amd.yml)
[](https://github.com/apache/airflow/actions/workflows/ci-arm.yml)
|
+| 3.x | [](https://github.com/apache/airflow/actions/workflows/ci-amd.yml)
|
diff --git a/generated/PYPI_README.md b/generated/PYPI_README.md
index 2372610eeb4..c7eef450ef7 100644
--- a/generated/PYPI_README.md
+++ b/generated/PYPI_README.md
@@ -32,9 +32,8 @@ PROJECT BY THE `generate-pypi-readme` PREK HOOK. YOUR CHANGES
HERE WILL BE AUTOM
| Version | Build Status
|
|---------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| Main | [](https://github.com/apache/airflow/actions)
|
-| 3.x | [](https://github.com/apache/airflow/actions)
|
-| 2.x | [](https://github.com/apache/airflow/actions)
|
+| Main | [](https://github.com/apache/airflow/actions/workflows/ci-amd.yml)
[](https://github.com/apache/airflow/actions/workflows/ci-arm.yml)
|
+| 3.x | [](https://github.com/apache/airflow/actions/workflows/ci-amd.yml)
|
diff --git a/scripts/ci/prek/check_ci_workflows_in_sync.py
b/scripts/ci/prek/check_ci_workflows_in_sync.py
index 3a219edd232..1807f53b2d8 100755
--- a/scripts/ci/prek/check_ci_workflows_in_sync.py
+++ b/scripts/ci/prek/check_ci_workflows_in_sync.py
@@ -27,13 +27,18 @@ Documented divergences:
1. Header intro comment (different prose explaining what each file is for)
2. Workflow ``name:`` — ``Tests (ARM)`` vs ``Tests (AMD)``
-3. Triggers — ARM = schedule + workflow_dispatch only; AMD = pull_request +
- push (to release branches) + workflow_dispatch
+3. Triggers — ARM = schedule + workflow_dispatch only; AMD = its own
+ schedule (offset from ARM's cron) + pull_request + push (to release
+ branches) + workflow_dispatch
4. ``concurrency.group`` prefix — ``ci-arm-`` vs ``ci-amd-``
5. ``build-info`` outputs ``platform`` and ``runner-type`` — hardcoded per
architecture (and the surrounding comment naming the "ARM/AMD copy")
6. ``print-platform`` job — ``name:`` and the architecture echoed to
GITHUB_STEP_SUMMARY
+7. ``notify-slack`` Slack-state artifact name — ``slack-state-tests-…-arm``
+ vs ``slack-state-tests-…-amd``, so the de-dup tracker in
+ ``slack_notification_state.py`` keeps independent state for each
+ platform on the same branch
Anything else differing between the two files is a drift bug. To
intentionally introduce a new divergence, update the rules in this script
@@ -86,6 +91,12 @@ LINE_RULES: list[tuple[str, str]] = [
r"^ run: \"echo '## Architecture: (?:ARM|AMD)' >>
\$GITHUB_STEP_SUMMARY\"$",
" run: \"echo '## Architecture: PLACEHOLDER' >>
$GITHUB_STEP_SUMMARY\"",
),
+ # Slack-state artifact name in the notify-slack job — suffixed `-amd` /
+ # `-arm` so each platform tracks its own de-dup state on the same branch.
+ (
+ r'^(?P<indent>\s+)(?P<key>ARTIFACT_NAME|name):
"slack-state-tests-\$\{\{ github\.ref_name \}\}-(?:amd|arm)"$',
+ r'\g<indent>\g<key>: "slack-state-tests-${{ github.ref_name
}}-PLACEHOLDER"',
+ ),
]
# Whole sections that legitimately exist in only one file. Each entry is the
@@ -96,7 +107,12 @@ ARM_ONLY_BLOCK = """ schedule:
- cron: '28 1,3,7,9,13,15,19,21 * * *'
"""
-AMD_ONLY_BLOCK = """ push:
+AMD_ONLY_BLOCK = """ schedule:
+ # Mirror of the previous AMD canary cron from before the AMD/ARM split (PR
#66348),
+ # offset by 30 min from ARM's `:28` slot in `ci-arm.yml` so the two
scheduled
+ # canaries don't compete for runners at exactly the same minute.
+ - cron: '58 1,7,13,19 * * *'
+ push:
branches:
- v[0-9]+-[0-9]+-test
- providers-[a-z]+-?[a-z]*/v[0-9]+-[0-9]+