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 1724107d560 Fix CI integration tests gated by the wrong platform
(#70015)
1724107d560 is described below
commit 1724107d5608bf921af8120272001adb7b921ba5
Author: PoAn Yang <[email protected]>
AuthorDate: Sun Jul 19 06:54:11 2026 +0900
Fix CI integration tests gated by the wrong platform (#70015)
Signed-off-by: PoAn Yang <[email protected]>
---
.github/workflows/ci-amd.yml | 1 +
.github/workflows/ci-arm.yml | 1 +
dev/breeze/doc/ci/04_selective_checks.md | 9 +
.../doc/images/output_ci_selective-check.svg | 46 +--
.../doc/images/output_ci_selective-check.txt | 2 +-
.../src/airflow_breeze/commands/ci_commands.py | 14 +
.../airflow_breeze/commands/ci_commands_config.py | 1 +
dev/breeze/src/airflow_breeze/global_constants.py | 11 +-
.../src/airflow_breeze/utils/selective_checks.py | 89 +-----
dev/breeze/tests/conftest.py | 8 -
dev/breeze/tests/test_selective_checks.py | 332 ++++-----------------
scripts/ci/prek/check_ci_workflows_in_sync.py | 7 +-
12 files changed, 124 insertions(+), 397 deletions(-)
diff --git a/.github/workflows/ci-amd.yml b/.github/workflows/ci-amd.yml
index cd7d99fae89..9edb394a6cc 100644
--- a/.github/workflows/ci-amd.yml
+++ b/.github/workflows/ci-amd.yml
@@ -226,6 +226,7 @@ jobs:
COMMIT_REF: "${{ github.sha }}"
VERBOSE: "false"
GITHUB_CONTEXT_INPUT: "${{ runner.temp }}/github_context.json"
+ PLATFORM: "linux/amd64"
run: breeze ci selective-check 2>> ${GITHUB_OUTPUT}
- name: env
run: printenv
diff --git a/.github/workflows/ci-arm.yml b/.github/workflows/ci-arm.yml
index d1c79602039..8f5ce3ac079 100644
--- a/.github/workflows/ci-arm.yml
+++ b/.github/workflows/ci-arm.yml
@@ -215,6 +215,7 @@ jobs:
COMMIT_REF: "${{ github.sha }}"
VERBOSE: "false"
GITHUB_CONTEXT_INPUT: "${{ runner.temp }}/github_context.json"
+ PLATFORM: "linux/arm64"
run: breeze ci selective-check 2>> ${GITHUB_OUTPUT}
- name: env
run: printenv
diff --git a/dev/breeze/doc/ci/04_selective_checks.md
b/dev/breeze/doc/ci/04_selective_checks.md
index ebc6e545863..59d55d11178 100644
--- a/dev/breeze/doc/ci/04_selective_checks.md
+++ b/dev/breeze/doc/ci/04_selective_checks.md
@@ -227,6 +227,15 @@ The same matched-file approach drives the **prek hook skip
list** (`skip_prek_ho
compile / lint hook is skipped when nothing in its area changed. See
[Skipping prek hooks](#skipping-prek-hooks-static-checks).
+#### The run's platform (`--platform`)
+
+Some integrations and providers only work on one CPU architecture, so the
selection above is filtered
+by the platform the run's tests will execute on:
+
+* **Integrations** in `DISABLE_TESTABLE_INTEGRATIONS_FROM_ARM` are dropped on
ARM.
+* **Providers** that declare `excluded-platforms` in their `provider.yaml`
(e.g. `ibm.mq` excludes
+ `linux/arm64`) are removed from the providers test-type matrix on that
platform.
+
## Individually simple rules
The list of rules is long, but each rule is a one-liner you can reason about
in isolation. A few
diff --git a/dev/breeze/doc/images/output_ci_selective-check.svg
b/dev/breeze/doc/images/output_ci_selective-check.svg
index 58bccf85cd0..6c5e3064794 100644
--- a/dev/breeze/doc/images/output_ci_selective-check.svg
+++ b/dev/breeze/doc/images/output_ci_selective-check.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 708.8"
xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 757.5999999999999"
xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -43,7 +43,7 @@
<defs>
<clipPath id="breeze-ci-selective-check-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="657.8" />
+ <rect x="0" y="0" width="1463.0" height="706.5999999999999" />
</clipPath>
<clipPath id="breeze-ci-selective-check-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -123,9 +123,15 @@
<clipPath id="breeze-ci-selective-check-line-25">
<rect x="0" y="611.5" width="1464" height="24.65"/>
</clipPath>
+<clipPath id="breeze-ci-selective-check-line-26">
+ <rect x="0" y="635.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-selective-check-line-27">
+ <rect x="0" y="660.3" width="1464" height="24.65"/>
+ </clipPath>
</defs>
- <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1"
x="1" y="1" width="1480" height="706.8" rx="8"/><text
class="breeze-ci-selective-check-title" fill="#c5c8c6" text-anchor="middle"
x="740" y="27">Command: ci selective-check</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1"
x="1" y="1" width="1480" height="755.6" rx="8"/><text
class="breeze-ci-selective-check-title" fill="#c5c8c6" text-anchor="middle"
x="740" y="27">Command: ci selective-check</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -146,22 +152,24 @@
</text><text class="breeze-ci-selective-check-r5" x="0" y="215.2"
textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-8)">│</text><text
class="breeze-ci-selective-check-r4" x="24.4" y="215.2" textLength="341.6"
clip-path="url(#breeze-ci-selective-check-line-8)">--default-branch            </text><text
class="breeze-ci-selective-check-r1" x="390.4" y="215.2" textLength="512.4"
clip-path="url(#breeze-ci-selective-chec [...]
</text><text class="breeze-ci-selective-check-r5" x="0" y="239.6"
textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-9)">│</text><text
class="breeze-ci-selective-check-r4" x="24.4" y="239.6" textLength="341.6"
clip-path="url(#breeze-ci-selective-check-line-9)">--default-constraints-branch</text><text
class="breeze-ci-selective-check-r1" x="390.4" y="239.6" textLength="658.8"
clip-path="url(#breeze-ci-selective-check-line-9)">Constraints Branch against which&#
[...]
</text><text class="breeze-ci-selective-check-r5" x="0" y="264"
textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-10)">│</text><text
class="breeze-ci-selective-check-r6" x="390.4" y="264" textLength="73.2"
clip-path="url(#breeze-ci-selective-check-line-10)">(TEXT)</text><text
class="breeze-ci-selective-check-r5" x="1451.8" y="264" textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-10)">│</text><text
class="breeze-ci-selective-check-r1" x="1464" y="264" textLe [...]
-</text><text class="breeze-ci-selective-check-r5" x="0" y="288.4"
textLength="1464"
clip-path="url(#breeze-ci-selective-check-line-11)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-ci-selective-check-r1" x="1464" y="288.4" textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-11)">
-</text><text class="breeze-ci-selective-check-r5" x="0" y="312.8"
textLength="24.4"
clip-path="url(#breeze-ci-selective-check-line-12)">╭─</text><text
class="breeze-ci-selective-check-r5" x="24.4" y="312.8" textLength="231.8"
clip-path="url(#breeze-ci-selective-check-line-12)"> GitHub parameters </text><text
class="breeze-ci-selective-check-r5" x="256.2" y="312.8" textLength="1183.4"
clip-path="url(#breeze-ci-selective-check-line-12)">──────────────────────────────────────
[...]
-</text><text class="breeze-ci-selective-check-r5" x="0" y="337.2"
textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-13)">│</text><text
class="breeze-ci-selective-check-r4" x="24.4" y="337.2" textLength="268.4"
clip-path="url(#breeze-ci-selective-check-line-13)">--github-event-name   </text><text
class="breeze-ci-selective-check-r1" x="366" y="337.2" textLength="610"
clip-path="url(#breeze-ci-selective-check-line-13)">Name of the GitHub ev
[...]
-</text><text class="breeze-ci-selective-check-r5" x="0" y="361.6"
textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-14)">│</text><text
class="breeze-ci-selective-check-r6" x="366" y="361.6" textLength="1073.6"
clip-path="url(#breeze-ci-selective-check-line-14)">| pull_request_review | pull_request_target | pull_request_workflow | push | schedule | </text><text
class="breeze-ci-selective-check-r5" x="1451.8" y="361.6" t [...]
-</text><text class="breeze-ci-selective-check-r5" x="0" y="386"
textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-15)">│</text><text
class="breeze-ci-selective-check-r6" x="366" y="386" textLength="402.6"
clip-path="url(#breeze-ci-selective-check-line-15)">workflow_dispatch | workflow_run)</text><text
class="breeze-ci-selective-check-r5" x="1451.8" y="386" textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-15)">│</text><text
class="breeze-ci-selecti [...]
-</text><text class="breeze-ci-selective-check-r5" x="0" y="410.4"
textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-16)">│</text><text
class="breeze-ci-selective-check-r4" x="24.4" y="410.4" textLength="268.4"
clip-path="url(#breeze-ci-selective-check-line-16)">--github-repository   </text><text
class="breeze-ci-selective-check-r7" x="317.2" y="410.4" textLength="24.4"
clip-path="url(#breeze-ci-selective-check-line-16)">-g</text><text
class="breeze-ci-select [...]
-</text><text class="breeze-ci-selective-check-r5" x="0" y="434.8"
textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-17)">│</text><text
class="breeze-ci-selective-check-r4" x="24.4" y="434.8" textLength="268.4"
clip-path="url(#breeze-ci-selective-check-line-17)">--github-actor        </text><text
class="breeze-ci-selective-check-r1" x="366" y="434.8" textLength="549"
clip-path="url(#breeze-ci-selective-check-line-17)">Actor that& [...]
-</text><text class="breeze-ci-selective-check-r5" x="0" y="459.2"
textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-18)">│</text><text
class="breeze-ci-selective-check-r4" x="24.4" y="459.2" textLength="268.4"
clip-path="url(#breeze-ci-selective-check-line-18)">--github-context      </text><text
class="breeze-ci-selective-check-r1" x="366" y="459.2" textLength="695.4"
clip-path="url(#breeze-ci-selective-check-line-18)">GitHub context 
[...]
-</text><text class="breeze-ci-selective-check-r5" x="0" y="483.6"
textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-19)">│</text><text
class="breeze-ci-selective-check-r4" x="24.4" y="483.6" textLength="268.4"
clip-path="url(#breeze-ci-selective-check-line-19)">--github-context-input</text><text
class="breeze-ci-selective-check-r1" x="366" y="483.6" textLength="1073.6"
clip-path="url(#breeze-ci-selective-check-line-19)">File input (might be `-`) wi
[...]
-</text><text class="breeze-ci-selective-check-r5" x="0" y="508"
textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-20)">│</text><text
class="breeze-ci-selective-check-r4" x="366" y="508" textLength="195.2"
clip-path="url(#breeze-ci-selective-check-line-20)">--github-context</text><text
class="breeze-ci-selective-check-r1" x="561.2" y="508" textLength="744.2"
clip-path="url(#breeze-ci-selective-check-line-20)"> for large contexts that would exce
[...]
-</text><text class="breeze-ci-selective-check-r5" x="0" y="532.4"
textLength="1464"
clip-path="url(#breeze-ci-selective-check-line-21)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-ci-selective-check-r1" x="1464" y="532.4" textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-21)">
-</text><text class="breeze-ci-selective-check-r5" x="0" y="556.8"
textLength="24.4"
clip-path="url(#breeze-ci-selective-check-line-22)">╭─</text><text
class="breeze-ci-selective-check-r5" x="24.4" y="556.8" textLength="195.2"
clip-path="url(#breeze-ci-selective-check-line-22)"> Common options </text><text
class="breeze-ci-selective-check-r5" x="219.6" y="556.8" textLength="1220"
clip-path="url(#breeze-ci-selective-check-line-22)">───────────────────────────────────────────
[...]
-</text><text class="breeze-ci-selective-check-r5" x="0" y="581.2"
textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-23)">│</text><text
class="breeze-ci-selective-check-r4" x="24.4" y="581.2" textLength="109.8"
clip-path="url(#breeze-ci-selective-check-line-23)">--verbose</text><text
class="breeze-ci-selective-check-r7" x="158.6" y="581.2" textLength="24.4"
clip-path="url(#breeze-ci-selective-check-line-23)">-v</text><text
class="breeze-ci-selective-check-r1" x="207.4" y="5 [...]
-</text><text class="breeze-ci-selective-check-r5" x="0" y="605.6"
textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-24)">│</text><text
class="breeze-ci-selective-check-r4" x="24.4" y="605.6" textLength="109.8"
clip-path="url(#breeze-ci-selective-check-line-24)">--dry-run</text><text
class="breeze-ci-selective-check-r7" x="158.6" y="605.6" textLength="24.4"
clip-path="url(#breeze-ci-selective-check-line-24)">-D</text><text
class="breeze-ci-selective-check-r1" x="207.4" y="6 [...]
-</text><text class="breeze-ci-selective-check-r5" x="0" y="630"
textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-25)">│</text><text
class="breeze-ci-selective-check-r4" x="24.4" y="630" textLength="109.8"
clip-path="url(#breeze-ci-selective-check-line-25)">--help   </text><text
class="breeze-ci-selective-check-r7" x="158.6" y="630" textLength="24.4"
clip-path="url(#breeze-ci-selective-check-line-25)">-h</text><text
class="breeze-ci-selective-check-r1" x="20 [...]
-</text><text class="breeze-ci-selective-check-r5" x="0" y="654.4"
textLength="1464"
clip-path="url(#breeze-ci-selective-check-line-26)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-ci-selective-check-r1" x="1464" y="654.4" textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-26)">
+</text><text class="breeze-ci-selective-check-r5" x="0" y="288.4"
textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-11)">│</text><text
class="breeze-ci-selective-check-r4" x="24.4" y="288.4" textLength="341.6"
clip-path="url(#breeze-ci-selective-check-line-11)">--platform                  </text><text
class="breeze-ci-selective-check-r1" x="390.4" y="288.4" textLength="1049.2"
clip-pa [...]
+</text><text class="breeze-ci-selective-check-r5" x="0" y="312.8"
textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-12)">│</text><text
class="breeze-ci-selective-check-r1" x="390.4" y="312.8" textLength="170.8"
clip-path="url(#breeze-ci-selective-check-line-12)">are testable. </text><text
class="breeze-ci-selective-check-r5" x="561.2" y="312.8" textLength="268.4"
clip-path="url(#breeze-ci-selective-check-line-12)">[default: linux/amd64]</text><text
class="br [...]
+</text><text class="breeze-ci-selective-check-r5" x="0" y="337.2"
textLength="1464"
clip-path="url(#breeze-ci-selective-check-line-13)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-ci-selective-check-r1" x="1464" y="337.2" textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-13)">
+</text><text class="breeze-ci-selective-check-r5" x="0" y="361.6"
textLength="24.4"
clip-path="url(#breeze-ci-selective-check-line-14)">╭─</text><text
class="breeze-ci-selective-check-r5" x="24.4" y="361.6" textLength="231.8"
clip-path="url(#breeze-ci-selective-check-line-14)"> GitHub parameters </text><text
class="breeze-ci-selective-check-r5" x="256.2" y="361.6" textLength="1183.4"
clip-path="url(#breeze-ci-selective-check-line-14)">──────────────────────────────────────
[...]
+</text><text class="breeze-ci-selective-check-r5" x="0" y="386"
textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-15)">│</text><text
class="breeze-ci-selective-check-r4" x="24.4" y="386" textLength="268.4"
clip-path="url(#breeze-ci-selective-check-line-15)">--github-event-name   </text><text
class="breeze-ci-selective-check-r1" x="366" y="386" textLength="610"
clip-path="url(#breeze-ci-selective-check-line-15)">Name of the GitHub event
[...]
+</text><text class="breeze-ci-selective-check-r5" x="0" y="410.4"
textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-16)">│</text><text
class="breeze-ci-selective-check-r6" x="366" y="410.4" textLength="1073.6"
clip-path="url(#breeze-ci-selective-check-line-16)">| pull_request_review | pull_request_target | pull_request_workflow | push | schedule | </text><text
class="breeze-ci-selective-check-r5" x="1451.8" y="410.4" t [...]
+</text><text class="breeze-ci-selective-check-r5" x="0" y="434.8"
textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-17)">│</text><text
class="breeze-ci-selective-check-r6" x="366" y="434.8" textLength="402.6"
clip-path="url(#breeze-ci-selective-check-line-17)">workflow_dispatch | workflow_run)</text><text
class="breeze-ci-selective-check-r5" x="1451.8" y="434.8" textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-17)">│</text><text
class="breeze-ci-s [...]
+</text><text class="breeze-ci-selective-check-r5" x="0" y="459.2"
textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-18)">│</text><text
class="breeze-ci-selective-check-r4" x="24.4" y="459.2" textLength="268.4"
clip-path="url(#breeze-ci-selective-check-line-18)">--github-repository   </text><text
class="breeze-ci-selective-check-r7" x="317.2" y="459.2" textLength="24.4"
clip-path="url(#breeze-ci-selective-check-line-18)">-g</text><text
class="breeze-ci-select [...]
+</text><text class="breeze-ci-selective-check-r5" x="0" y="483.6"
textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-19)">│</text><text
class="breeze-ci-selective-check-r4" x="24.4" y="483.6" textLength="268.4"
clip-path="url(#breeze-ci-selective-check-line-19)">--github-actor        </text><text
class="breeze-ci-selective-check-r1" x="366" y="483.6" textLength="549"
clip-path="url(#breeze-ci-selective-check-line-19)">Actor that& [...]
+</text><text class="breeze-ci-selective-check-r5" x="0" y="508"
textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-20)">│</text><text
class="breeze-ci-selective-check-r4" x="24.4" y="508" textLength="268.4"
clip-path="url(#breeze-ci-selective-check-line-20)">--github-context      </text><text
class="breeze-ci-selective-check-r1" x="366" y="508" textLength="695.4"
clip-path="url(#breeze-ci-selective-check-line-20)">GitHub context (JSON
[...]
+</text><text class="breeze-ci-selective-check-r5" x="0" y="532.4"
textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-21)">│</text><text
class="breeze-ci-selective-check-r4" x="24.4" y="532.4" textLength="268.4"
clip-path="url(#breeze-ci-selective-check-line-21)">--github-context-input</text><text
class="breeze-ci-selective-check-r1" x="366" y="532.4" textLength="1073.6"
clip-path="url(#breeze-ci-selective-check-line-21)">File input (might be `-`) wi
[...]
+</text><text class="breeze-ci-selective-check-r5" x="0" y="556.8"
textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-22)">│</text><text
class="breeze-ci-selective-check-r4" x="366" y="556.8" textLength="195.2"
clip-path="url(#breeze-ci-selective-check-line-22)">--github-context</text><text
class="breeze-ci-selective-check-r1" x="561.2" y="556.8" textLength="744.2"
clip-path="url(#breeze-ci-selective-check-line-22)"> for large contexts that would
[...]
+</text><text class="breeze-ci-selective-check-r5" x="0" y="581.2"
textLength="1464"
clip-path="url(#breeze-ci-selective-check-line-23)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-ci-selective-check-r1" x="1464" y="581.2" textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-23)">
+</text><text class="breeze-ci-selective-check-r5" x="0" y="605.6"
textLength="24.4"
clip-path="url(#breeze-ci-selective-check-line-24)">╭─</text><text
class="breeze-ci-selective-check-r5" x="24.4" y="605.6" textLength="195.2"
clip-path="url(#breeze-ci-selective-check-line-24)"> Common options </text><text
class="breeze-ci-selective-check-r5" x="219.6" y="605.6" textLength="1220"
clip-path="url(#breeze-ci-selective-check-line-24)">───────────────────────────────────────────
[...]
+</text><text class="breeze-ci-selective-check-r5" x="0" y="630"
textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-25)">│</text><text
class="breeze-ci-selective-check-r4" x="24.4" y="630" textLength="109.8"
clip-path="url(#breeze-ci-selective-check-line-25)">--verbose</text><text
class="breeze-ci-selective-check-r7" x="158.6" y="630" textLength="24.4"
clip-path="url(#breeze-ci-selective-check-line-25)">-v</text><text
class="breeze-ci-selective-check-r1" x="207.4" y="630" te [...]
+</text><text class="breeze-ci-selective-check-r5" x="0" y="654.4"
textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-26)">│</text><text
class="breeze-ci-selective-check-r4" x="24.4" y="654.4" textLength="109.8"
clip-path="url(#breeze-ci-selective-check-line-26)">--dry-run</text><text
class="breeze-ci-selective-check-r7" x="158.6" y="654.4" textLength="24.4"
clip-path="url(#breeze-ci-selective-check-line-26)">-D</text><text
class="breeze-ci-selective-check-r1" x="207.4" y="6 [...]
+</text><text class="breeze-ci-selective-check-r5" x="0" y="678.8"
textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-27)">│</text><text
class="breeze-ci-selective-check-r4" x="24.4" y="678.8" textLength="109.8"
clip-path="url(#breeze-ci-selective-check-line-27)">--help   </text><text
class="breeze-ci-selective-check-r7" x="158.6" y="678.8" textLength="24.4"
clip-path="url(#breeze-ci-selective-check-line-27)">-h</text><text
class="breeze-ci-selective-check-r1" [...]
+</text><text class="breeze-ci-selective-check-r5" x="0" y="703.2"
textLength="1464"
clip-path="url(#breeze-ci-selective-check-line-28)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-ci-selective-check-r1" x="1464" y="703.2" textLength="12.2"
clip-path="url(#breeze-ci-selective-check-line-28)">
</text>
</g>
</g>
diff --git a/dev/breeze/doc/images/output_ci_selective-check.txt
b/dev/breeze/doc/images/output_ci_selective-check.txt
index c4b2ee8c47c..625c3a3b750 100644
--- a/dev/breeze/doc/images/output_ci_selective-check.txt
+++ b/dev/breeze/doc/images/output_ci_selective-check.txt
@@ -1 +1 @@
-e1fc891c482e1d0ac98370259cdabebf
+bc06116a5cbad927acd981e56b6a5411
diff --git a/dev/breeze/src/airflow_breeze/commands/ci_commands.py
b/dev/breeze/src/airflow_breeze/commands/ci_commands.py
index 02b9967f29f..f7d0b82b02b 100644
--- a/dev/breeze/src/airflow_breeze/commands/ci_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/ci_commands.py
@@ -41,6 +41,8 @@ from airflow_breeze.commands.common_options import (
option_verbose,
)
from airflow_breeze.global_constants import (
+ CI_AMD_PLATFORM,
+ CI_PLATFORMS,
DEFAULT_PYTHON_MAJOR_MINOR_VERSION,
MILESTONE_BUG_LABELS,
MILESTONE_SKIP_LABELS,
@@ -236,6 +238,16 @@ def get_changed_files(commit_ref: str | None) ->
tuple[str, ...]:
type=str,
default="",
)
[email protected](
+ "--platform",
+ "ci_platform",
+ type=BetterChoice(CI_PLATFORMS),
+ default=CI_AMD_PLATFORM,
+ help="Platform the tests of this run execute on. "
+ "It decides which integrations and providers are testable.",
+ envvar="PLATFORM",
+ show_default=True,
+)
@click.option(
"--github-context",
help="GitHub context (JSON formatted) passed by GitHub Actions",
@@ -262,6 +274,7 @@ def selective_check(
github_actor: str,
github_context: str,
github_context_input: StringIO | None,
+ ci_platform: str,
):
try:
from airflow_breeze.utils.selective_checks import SelectiveChecks
@@ -287,6 +300,7 @@ def selective_check(
github_repository=github_repository,
github_actor=github_actor,
github_context_dict=github_context_dict,
+ platform=ci_platform,
)
print(str(sc), file=sys.stderr)
except Exception:
diff --git a/dev/breeze/src/airflow_breeze/commands/ci_commands_config.py
b/dev/breeze/src/airflow_breeze/commands/ci_commands_config.py
index ae5bc64a5b7..61b62e6ed8f 100644
--- a/dev/breeze/src/airflow_breeze/commands/ci_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/ci_commands_config.py
@@ -46,6 +46,7 @@ CI_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = {
"--pr-labels",
"--default-branch",
"--default-constraints-branch",
+ "--platform",
],
},
{
diff --git a/dev/breeze/src/airflow_breeze/global_constants.py
b/dev/breeze/src/airflow_breeze/global_constants.py
index c24b92dd795..d7fca41779d 100644
--- a/dev/breeze/src/airflow_breeze/global_constants.py
+++ b/dev/breeze/src/airflow_breeze/global_constants.py
@@ -37,13 +37,10 @@ from airflow_breeze.utils.path_utils import (
PUBLIC_AMD_RUNNERS = '["ubuntu-22.04"]'
PUBLIC_ARM_RUNNERS = '["ubuntu-22.04-arm"]'
-# The runner type cross-mapping is intentional — if the previous scheduled
build used AMD, the current scheduled build should run with ARM.
-RUNNERS_TYPE_CROSS_MAPPING = {
- "ubuntu-22.04": '["ubuntu-22.04-arm"]',
- "ubuntu-22.04-arm": '["ubuntu-22.04"]',
- "windows-2022": '["windows-2022"]',
- "windows-2025": '["windows-2025"]',
-}
+# Platform the tests of a CI run execute on.
+CI_AMD_PLATFORM = "linux/amd64"
+CI_ARM_PLATFORM = "linux/arm64"
+CI_PLATFORMS = [CI_AMD_PLATFORM, CI_ARM_PLATFORM]
ANSWER = ""
diff --git a/dev/breeze/src/airflow_breeze/utils/selective_checks.py
b/dev/breeze/src/airflow_breeze/utils/selective_checks.py
index b912af64e3d..970c90e606f 100644
--- a/dev/breeze/src/airflow_breeze/utils/selective_checks.py
+++ b/dev/breeze/src/airflow_breeze/utils/selective_checks.py
@@ -32,6 +32,8 @@ from airflow_breeze.branch_defaults import AIRFLOW_BRANCH,
DEFAULT_AIRFLOW_CONST
from airflow_breeze.global_constants import (
ALL_PYTHON_MAJOR_MINOR_VERSIONS,
APACHE_AIRFLOW_GITHUB_REPOSITORY,
+ CI_AMD_PLATFORM,
+ CI_ARM_PLATFORM,
COMMITTERS,
CURRENT_KUBERNETES_VERSIONS,
CURRENT_MYSQL_VERSIONS,
@@ -51,7 +53,6 @@ from airflow_breeze.global_constants import (
PROVIDERS_COMPATIBILITY_TESTS_MATRIX,
PUBLIC_AMD_RUNNERS,
PUBLIC_ARM_RUNNERS,
- RUNNERS_TYPE_CROSS_MAPPING,
TESTABLE_CORE_INTEGRATIONS,
TESTABLE_PROVIDERS_INTEGRATION_OWNERS,
TESTABLE_PROVIDERS_INTEGRATIONS,
@@ -683,6 +684,7 @@ class SelectiveChecks:
github_repository: str = APACHE_AIRFLOW_GITHUB_REPOSITORY,
github_actor: str = "",
github_context_dict: dict[str, Any] | None = None,
+ platform: str = CI_AMD_PLATFORM,
):
self._files = files
self._default_branch = default_branch
@@ -693,6 +695,7 @@ class SelectiveChecks:
self._github_repository = github_repository
self._github_actor = github_actor
self._github_context_dict = github_context_dict or {}
+ self._platform = platform
self._new_toml: dict[str, Any] = {}
self._old_toml: dict[str, Any] = {}
@@ -1400,7 +1403,7 @@ class SelectiveChecks:
@cached_property
def _platform_excluded_providers(self) -> set[str]:
- """Provider ids that opt out of the current ``self.platform`` via
provider.yaml.
+ """Provider ids that opt out of the current platform via provider.yaml.
Mirrors the ``excluded-python-versions`` mechanism but keyed by Docker
platform
string (e.g. ``linux/arm64``) so providers whose native dependencies
are unavailable
@@ -1408,7 +1411,7 @@ class SelectiveChecks:
"""
excluded: set[str] = set()
for provider_id, provider_info in get_provider_dependencies().items():
- if self.platform in provider_info.get("excluded-platforms", []):
+ if self._platform in provider_info.get("excluded-platforms", []):
excluded.add(provider_id)
return excluded
@@ -1803,80 +1806,6 @@ class SelectiveChecks:
suspended = set(get_suspended_provider_ids())
return " ".join(sorted(p for p in affected_providers if p not in
suspended))
- def get_job_label(self, event_type: str, branch: str):
- import requests # type: ignore[import-untyped]
-
- # The main CI is now split into ci-arm.yml and ci-amd.yml; the old
- # ci-amd-arm.yml file no longer exists. This lookup is dormant for the
- # main pipeline (which hardcodes runner-type per wrapper) and only
- # remains here for the `is_disabled_integration` code path that still
- # reads `runner_type`. The API call against a missing workflow returns
- # nothing and the caller falls back to PUBLIC_AMD_RUNNERS.
- job_name = "Basic tests"
- workflow_name = "ci-amd-arm.yml"
- headers = {"Accept": "application/vnd.github.v3+json"}
- if os.environ.get("GITHUB_TOKEN"):
- headers["Authorization"] = f"token
{os.environ.get('GITHUB_TOKEN')}"
-
- url =
f"https://api.github.com/repos/{self._github_repository}/actions/workflows/{workflow_name}/runs"
- payload = {"event": event_type, "status": "completed", "branch":
branch}
-
- response = requests.get(url, headers=headers, params=payload)
- if response.status_code != 200:
- try:
- error_msg = response.json()
- except ValueError:
- error_msg = response.text[:200] # Truncate long HTML responses
- console_print(f"[red]Error while listing workflow runs error:
{error_msg}.\n")
- return None
- runs = response.json().get("workflow_runs", [])
- if not runs:
- console_print(
- f"[yellow]No runs information found for workflow
{workflow_name}, params: {payload}.\n"
- )
- return None
- jobs_url = runs[0].get("jobs_url")
- jobs_response = requests.get(jobs_url, headers=headers)
- if jobs_response.status_code != 200:
- try:
- error_msg = jobs_response.json()
- except ValueError:
- error_msg = jobs_response.text[:200]
- console_print(f"[red]Error while listing jobs error:
{error_msg}.\n")
- return None
- jobs = jobs_response.json().get("jobs", [])
- if not jobs:
- console_print("[yellow]No jobs information found for jobs %s.\n",
jobs_url)
- return None
-
- for job in jobs:
- if job_name in job.get("name", ""):
- runner_labels = job.get("labels", [])
- if "windows-2025" in runner_labels:
- continue
- if not runner_labels:
- console_print("[yellow]No labels found for job
{job_name}.\n", jobs_url)
- return None
- return runner_labels[0]
-
- return None
-
- @cached_property
- def runner_type(self):
- if self._github_event in [GithubEvents.SCHEDULE, GithubEvents.PUSH]:
- branch = self._github_context_dict.get("ref_name", "main")
- label =
self.get_job_label(event_type=str(self._github_event.value), branch=branch)
-
- return RUNNERS_TYPE_CROSS_MAPPING.get(label, PUBLIC_AMD_RUNNERS)
if label else PUBLIC_AMD_RUNNERS
-
- return PUBLIC_AMD_RUNNERS
-
- @cached_property
- def platform(self):
- if "arm" in self.runner_type:
- return "linux/arm64"
- return "linux/amd64"
-
@cached_property
def amd_runners(self) -> str:
return PUBLIC_AMD_RUNNERS
@@ -1913,10 +1842,8 @@ class SelectiveChecks:
return json.dumps(sorted_providers_to_exclude)
def _is_disabled_integration(self, integration: str) -> bool:
- return (
- integration in DISABLE_TESTABLE_INTEGRATIONS_FROM_CI
- or integration in DISABLE_TESTABLE_INTEGRATIONS_FROM_ARM
- and self.runner_type in PUBLIC_ARM_RUNNERS
+ return integration in DISABLE_TESTABLE_INTEGRATIONS_FROM_CI or (
+ integration in DISABLE_TESTABLE_INTEGRATIONS_FROM_ARM and
self._platform == CI_ARM_PLATFORM
)
@cached_property
diff --git a/dev/breeze/tests/conftest.py b/dev/breeze/tests/conftest.py
index 76d92bc0b0a..1d8779562e6 100644
--- a/dev/breeze/tests/conftest.py
+++ b/dev/breeze/tests/conftest.py
@@ -64,11 +64,3 @@ def pytest_unconfigure(config):
@pytest.fixture(autouse=True)
def clear_clearable_cache():
clear_all_cached_functions()
-
-
[email protected]
-def json_decode_error():
- """Provide a requests.exceptions.JSONDecodeError for mocking API
failures."""
- import requests
-
- return requests.exceptions.JSONDecodeError("", "", 0)
diff --git a/dev/breeze/tests/test_selective_checks.py
b/dev/breeze/tests/test_selective_checks.py
index ae8260db30f..3698d41d51b 100644
--- a/dev/breeze/tests/test_selective_checks.py
+++ b/dev/breeze/tests/test_selective_checks.py
@@ -27,13 +27,14 @@ from rich.console import Console
from airflow_breeze.global_constants import (
ALLOWED_KUBERNETES_VERSIONS,
ALLOWED_PYTHON_MAJOR_MINOR_VERSIONS,
+ CI_AMD_PLATFORM,
+ CI_ARM_PLATFORM,
DEFAULT_KUBERNETES_VERSION,
DEFAULT_PYTHON_MAJOR_MINOR_VERSION,
JAVA_SDK_VERSION,
NUMBER_OF_CORE_SLICES,
NUMBER_OF_LOW_DEP_SLICES,
PROVIDERS_COMPATIBILITY_TESTS_MATRIX,
- PUBLIC_AMD_RUNNERS,
GithubEvents,
)
from airflow_breeze.utils.functools_cache import clearable_cache
@@ -2513,26 +2514,12 @@ def test_expected_output_pull_request_v2_7(
),
],
)
[email protected]("os.environ", {"GITHUB_TOKEN": "test_token"})
-@patch("requests.get")
def test_expected_output_push(
- mock_get,
files: tuple[str, ...],
pr_labels: tuple[str, ...],
default_branch: str,
expected_outputs: dict[str, str],
):
- # Mock GitHub API calls for runner_type property (used in PUSH events)
- workflow_response = Mock()
- workflow_response.status_code = 200
- workflow_response.json.return_value = {"workflow_runs": [{"jobs_url":
"https://api.github.com/jobs/123"}]}
- jobs_response = Mock()
- jobs_response.status_code = 200
- jobs_response.json.return_value = {
- "jobs": [{"name": "Basic tests (ubuntu-22.04)", "labels":
["ubuntu-22.04"]}]
- }
- mock_get.side_effect = [workflow_response, jobs_response]
-
stderr = SelectiveChecks(
files=files,
commit_ref=NEUTRAL_COMMIT,
@@ -2768,20 +2755,7 @@ def test_expected_output_pull_request_target(
GithubEvents.SCHEDULE,
],
)
[email protected]("os.environ", {"GITHUB_TOKEN": "test_token"})
-@patch("requests.get")
-def test_no_commit_provided_trigger_full_build_for_any_event_type(mock_get,
github_event):
- # Mock GitHub API calls for runner_type property (used in PUSH/SCHEDULE
events)
- workflow_response = Mock()
- workflow_response.status_code = 200
- workflow_response.json.return_value = {"workflow_runs": [{"jobs_url":
"https://api.github.com/jobs/123"}]}
- jobs_response = Mock()
- jobs_response.status_code = 200
- jobs_response.json.return_value = {
- "jobs": [{"name": "Basic tests (ubuntu-22.04)", "labels":
["ubuntu-22.04"]}]
- }
- mock_get.side_effect = [workflow_response, jobs_response]
-
+def
test_no_commit_provided_trigger_full_build_for_any_event_type(github_event):
stderr = SelectiveChecks(
files=(),
commit_ref="",
@@ -2814,20 +2788,7 @@ def
test_no_commit_provided_trigger_full_build_for_any_event_type(mock_get, gith
GithubEvents.SCHEDULE,
],
)
[email protected]("os.environ", {"GITHUB_TOKEN": "test_token"})
-@patch("requests.get")
-def test_files_provided_trigger_full_build_for_any_event_type(mock_get,
github_event):
- # Mock GitHub API calls for runner_type property (used in PUSH/SCHEDULE
events)
- workflow_response = Mock()
- workflow_response.status_code = 200
- workflow_response.json.return_value = {"workflow_runs": [{"jobs_url":
"https://api.github.com/jobs/123"}]}
- jobs_response = Mock()
- jobs_response.status_code = 200
- jobs_response.json.return_value = {
- "jobs": [{"name": "Basic tests (ubuntu-22.04)", "labels":
["ubuntu-22.04"]}]
- }
- mock_get.side_effect = [workflow_response, jobs_response]
-
+def test_files_provided_trigger_full_build_for_any_event_type(github_event):
stderr = SelectiveChecks(
files=(
"airflow-core/src/airflow/ui/src/pages/Run/Details.tsx",
@@ -3229,270 +3190,116 @@ def test_mypy_matches(
assert_outputs_are_printed(expected_outputs, str(stderr))
-@patch("requests.get")
[email protected]("os.environ", {"GITHUB_TOKEN": "test_token"})
-def test_get_job_label(mock_get):
- selective_checks = SelectiveChecks(
- files=(),
- github_event=GithubEvents.PULL_REQUEST,
- github_repository="apache/airflow",
- github_context_dict={},
- )
-
- workflow_response = Mock()
- workflow_response.status_code = 200
- workflow_response.json.return_value = {"workflow_runs": [{"jobs_url":
"https://api.github.com/jobs/123"}]}
-
- jobs_response = Mock()
- jobs_response.status_code = 200
- jobs_response.json.return_value = {
- "jobs": [
- {"name": "Basic tests (ubuntu-22.04)", "labels": ["ubuntu-22.04"]},
- {"name": "Other job", "labels": ["ubuntu-22.04"]},
- ]
- }
-
- mock_get.side_effect = [workflow_response, jobs_response]
-
- result = selective_checks.get_job_label("push", "main")
-
- assert result == "ubuntu-22.04"
-
-
-@patch("requests.get")
[email protected]("os.environ", {"GITHUB_TOKEN": "test_token"})
-def test_get_job_label_not_found(mock_get):
- selective_checks = SelectiveChecks(
- files=(),
- github_event=GithubEvents.PULL_REQUEST,
- github_repository="apache/airflow",
- github_context_dict={},
- )
-
- workflow_response = Mock()
- workflow_response.status_code = 200
- workflow_response.json.return_value = {"workflow_runs": [{"jobs_url":
"https://api.github.com/jobs/123"}]}
-
- jobs_response = Mock()
- jobs_response.status_code = 200
- jobs_response.json.return_value = {
- "jobs": [
- {"name": "Basic tests (ubuntu-22.04)", "labels": []},
- {"name": "Other job", "labels": ["ubuntu-22.04"]},
- ]
- }
-
- mock_get.side_effect = [workflow_response, jobs_response]
-
- result = selective_checks.get_job_label("push", "main")
-
- assert result is None
-
-
@pytest.mark.parametrize(
- ("workflow_status", "jobs_status", "expected_result"),
- [
- pytest.param(504, 200, None, id="workflow_api_504_error"),
- pytest.param(200, 503, None, id="jobs_api_503_error"),
- pytest.param(200, 200, "ubuntu-22.04", id="both_apis_200_success"),
- ],
-)
-@patch("requests.get")
[email protected]("os.environ", {"GITHUB_TOKEN": "test_token"})
-def test_get_job_label_api_status_codes(
- mock_get, workflow_status, jobs_status, expected_result, json_decode_error
-):
- """Test that get_job_label handles various HTTP status codes correctly."""
- selective_checks = SelectiveChecks(
- files=(),
- github_event=GithubEvents.PULL_REQUEST,
- github_repository="apache/airflow",
- github_context_dict={},
- )
-
- workflow_response = Mock()
- workflow_response.status_code = workflow_status
- if workflow_status == 200:
- workflow_response.json.return_value = {
- "workflow_runs": [{"jobs_url": "https://api.github.com/jobs/123"}]
- }
- else:
- workflow_response.json.side_effect = json_decode_error
- workflow_response.text = "<html>Gateway Timeout</html>"
-
- jobs_response = Mock()
- jobs_response.status_code = jobs_status
- if jobs_status == 200:
- jobs_response.json.return_value = {
- "jobs": [
- {"name": "Basic tests (ubuntu-22.04)", "labels":
["ubuntu-22.04"]},
- {"name": "Other job", "labels": ["ubuntu-22.04"]},
- ]
- }
- else:
- jobs_response.json.side_effect = json_decode_error
- jobs_response.text = "<html>Service Unavailable</html>"
-
- mock_get.side_effect = [workflow_response, jobs_response]
-
- result = selective_checks.get_job_label("push", "main")
-
- assert result == expected_result
-
-
-def test_runner_type_pr():
- selective_checks = SelectiveChecks(github_event=GithubEvents.PULL_REQUEST)
-
- result = selective_checks.runner_type
-
- assert result == PUBLIC_AMD_RUNNERS
-
-
-@patch("requests.get")
[email protected]("os.environ", {"GITHUB_TOKEN": "test_token"})
-def test_runner_type_schedule(mock_get):
- selective_checks = SelectiveChecks(
- files=(),
- github_event=GithubEvents.SCHEDULE,
- github_repository="apache/airflow",
- github_context_dict={},
- )
-
- workflow_response = Mock()
- workflow_response.status_code = 200
- workflow_response.json.return_value = {"workflow_runs": [{"jobs_url":
"https://api.github.com/jobs/123"}]}
-
- jobs_response = Mock()
- jobs_response.status_code = 200
- jobs_response.json.return_value = {
- "jobs": [
- {"name": "Basic tests / Test git clone on Windows", "labels":
["windows-2025"]},
- {"name": "Basic tests (ubuntu-22.04)", "labels": ["ubuntu-22.04"]},
- {"name": "Other job", "labels": ["ubuntu-22.04"]},
- ]
- }
-
- mock_get.side_effect = [workflow_response, jobs_response]
-
- result = selective_checks.runner_type
-
- assert result == '["ubuntu-22.04-arm"]'
-
-
[email protected](
- ("integration", "runner_type", "expected_result"),
+ ("integration", "platform", "expected_result"),
[
# Test integrations disabled for all CI environments
pytest.param(
"mssql",
- PUBLIC_AMD_RUNNERS,
+ CI_AMD_PLATFORM,
True,
id="mssql_disabled_on_amd",
),
pytest.param(
"localstack",
- '["ubuntu-22.04-arm"]',
+ CI_ARM_PLATFORM,
True,
id="localstack_disabled_on_arm",
),
# Test integrations disabled only for ARM runners
pytest.param(
"kerberos",
- '["ubuntu-22.04-arm"]',
+ CI_ARM_PLATFORM,
True,
id="kerberos_disabled_on_arm",
),
pytest.param(
"drill",
- '["ubuntu-22.04-arm"]',
+ CI_ARM_PLATFORM,
True,
id="drill_disabled_on_arm",
),
pytest.param(
"tinkerpop",
- '["ubuntu-22.04-arm"]',
+ CI_ARM_PLATFORM,
True,
id="tinkerpop_disabled_on_arm",
),
pytest.param(
"pinot",
- '["ubuntu-22.04-arm"]',
+ CI_ARM_PLATFORM,
True,
id="pinot_disabled_on_arm",
),
pytest.param(
"trino",
- '["ubuntu-22.04-arm"]',
+ CI_ARM_PLATFORM,
True,
id="trino_disabled_on_arm",
),
pytest.param(
"ydb",
- '["ubuntu-22.04-arm"]',
+ CI_ARM_PLATFORM,
True,
id="ydb_disabled_on_arm",
),
# Test integrations that are NOT disabled on AMD runners
pytest.param(
"kerberos",
- PUBLIC_AMD_RUNNERS,
+ CI_AMD_PLATFORM,
False,
id="kerberos_enabled_on_amd",
),
pytest.param(
"drill",
- PUBLIC_AMD_RUNNERS,
+ CI_AMD_PLATFORM,
False,
id="drill_enabled_on_amd",
),
pytest.param(
"tinkerpop",
- PUBLIC_AMD_RUNNERS,
+ CI_AMD_PLATFORM,
False,
id="tinkerpop_enabled_on_amd",
),
# Test an integration that is not in any disabled list
pytest.param(
"postgres",
- PUBLIC_AMD_RUNNERS,
+ CI_AMD_PLATFORM,
False,
id="postgres_enabled_on_amd",
),
pytest.param(
"postgres",
- '["ubuntu-22.04-arm"]',
+ CI_ARM_PLATFORM,
False,
id="postgres_enabled_on_arm",
),
pytest.param(
"redis",
- PUBLIC_AMD_RUNNERS,
+ CI_AMD_PLATFORM,
False,
id="redis_enabled_on_amd",
),
pytest.param(
"redis",
- '["ubuntu-22.04-arm"]',
+ CI_ARM_PLATFORM,
False,
id="redis_enabled_on_arm",
),
],
)
-def test_is_disabled_integration(integration: str, runner_type: str,
expected_result: bool):
+def test_is_disabled_integration(integration: str, platform: str,
expected_result: bool):
"""Test that _is_disabled_integration correctly identifies disabled
integrations."""
selective_checks = SelectiveChecks(
files=(),
github_event=GithubEvents.PULL_REQUEST,
github_repository="apache/airflow",
github_context_dict={},
+ platform=platform,
)
- # Mock the runner_type property
- with patch.object(
- SelectiveChecks, "runner_type", new_callable=lambda: property(lambda
self: runner_type)
- ):
- result = selective_checks._is_disabled_integration(integration)
- assert result == expected_result
+ assert selective_checks._is_disabled_integration(integration) ==
expected_result
def test_testable_core_integrations_excludes_disabled():
@@ -3506,14 +3313,10 @@ def test_testable_core_integrations_excludes_disabled():
files=("airflow-core/tests/test_example.py",),
commit_ref=NEUTRAL_COMMIT,
github_event=GithubEvents.PULL_REQUEST,
+ platform=CI_AMD_PLATFORM,
)
- with (
- patch.object(
- SelectiveChecks, "runner_type", new_callable=lambda:
property(lambda self: PUBLIC_AMD_RUNNERS)
- ),
- patch.object(
- SelectiveChecks, "full_tests_needed", new_callable=lambda:
property(lambda self: True)
- ),
+ with patch.object(
+ SelectiveChecks, "full_tests_needed", new_callable=lambda:
property(lambda self: True)
):
result = selective_checks_amd.testable_core_integrations
assert "postgres" in result
@@ -3530,16 +3333,10 @@ def
test_testable_core_integrations_excludes_arm_disabled_on_arm():
commit_ref=NEUTRAL_COMMIT,
github_event=GithubEvents.SCHEDULE,
github_context_dict={"ref_name": "main"},
+ platform=CI_ARM_PLATFORM,
)
- with (
- patch.object(
- SelectiveChecks,
- "runner_type",
- new_callable=lambda: property(lambda self:
'["ubuntu-22.04-arm"]'),
- ),
- patch.object(
- SelectiveChecks, "full_tests_needed", new_callable=lambda:
property(lambda self: True)
- ),
+ with patch.object(
+ SelectiveChecks, "full_tests_needed", new_callable=lambda:
property(lambda self: True)
):
result = selective_checks_arm.testable_core_integrations
assert "postgres" in result
@@ -3558,14 +3355,10 @@ def
test_testable_providers_integrations_excludes_disabled():
files=("providers/amazon/tests/test_example.py",),
commit_ref=NEUTRAL_COMMIT,
github_event=GithubEvents.PULL_REQUEST,
+ platform=CI_AMD_PLATFORM,
)
- with (
- patch.object(
- SelectiveChecks, "runner_type", new_callable=lambda:
property(lambda self: PUBLIC_AMD_RUNNERS)
- ),
- patch.object(
- SelectiveChecks, "full_tests_needed", new_callable=lambda:
property(lambda self: True)
- ),
+ with patch.object(
+ SelectiveChecks, "full_tests_needed", new_callable=lambda:
property(lambda self: True)
):
result = selective_checks_amd.testable_providers_integrations
assert "postgres" in result
@@ -3583,16 +3376,10 @@ def
test_testable_providers_integrations_excludes_arm_disabled_on_arm():
commit_ref=NEUTRAL_COMMIT,
github_event=GithubEvents.SCHEDULE,
github_context_dict={"ref_name": "main"},
+ platform=CI_ARM_PLATFORM,
)
- with (
- patch.object(
- SelectiveChecks,
- "runner_type",
- new_callable=lambda: property(lambda self:
'["ubuntu-22.04-arm"]'),
- ),
- patch.object(
- SelectiveChecks, "full_tests_needed", new_callable=lambda:
property(lambda self: True)
- ),
+ with patch.object(
+ SelectiveChecks, "full_tests_needed", new_callable=lambda:
property(lambda self: True)
):
result = selective_checks_arm.testable_providers_integrations
assert "postgres" in result
@@ -3616,12 +3403,9 @@ def
test_testable_core_integrations_gated_by_source(changed_file, expected_integ
files=(changed_file,),
commit_ref=NEUTRAL_COMMIT,
github_event=GithubEvents.PULL_REQUEST,
+ platform=CI_AMD_PLATFORM,
)
- with patch.object(
- SelectiveChecks, "runner_type", new_callable=lambda: property(lambda
self: PUBLIC_AMD_RUNNERS)
- ):
- result = selective_checks.testable_core_integrations
- assert result == [expected_integration]
+ assert selective_checks.testable_core_integrations ==
[expected_integration]
def test_testable_core_integrations_empty_when_unrelated_source():
@@ -3630,11 +3414,9 @@ def
test_testable_core_integrations_empty_when_unrelated_source():
files=("airflow-core/src/airflow/models/taskinstance.py",),
commit_ref=NEUTRAL_COMMIT,
github_event=GithubEvents.PULL_REQUEST,
+ platform=CI_AMD_PLATFORM,
)
- with patch.object(
- SelectiveChecks, "runner_type", new_callable=lambda: property(lambda
self: PUBLIC_AMD_RUNNERS)
- ):
- assert selective_checks.testable_core_integrations == []
+ assert selective_checks.testable_core_integrations == []
def test_testable_providers_integrations_gated_by_affected_provider():
@@ -3643,15 +3425,13 @@ def
test_testable_providers_integrations_gated_by_affected_provider():
files=("providers/apache/cassandra/src/airflow/providers/apache/cassandra/hooks/cassandra.py",),
commit_ref=NEUTRAL_COMMIT,
github_event=GithubEvents.PULL_REQUEST,
+ platform=CI_AMD_PLATFORM,
)
- with patch.object(
- SelectiveChecks, "runner_type", new_callable=lambda: property(lambda
self: PUBLIC_AMD_RUNNERS)
- ):
- result = selective_checks.testable_providers_integrations
- assert "cassandra" in result
- # Unrelated integrations whose providers are not affected must be
absent.
- assert "mongo" not in result
- assert "ydb" not in result
+ result = selective_checks.testable_providers_integrations
+ assert "cassandra" in result
+ # Unrelated integrations whose providers are not affected must be absent.
+ assert "mongo" not in result
+ assert "ydb" not in result
def test_individual_providers_excludes_platform_excluded_on_arm():
@@ -3665,14 +3445,11 @@ def
test_individual_providers_excludes_platform_excluded_on_arm():
github_context_dict={"ref_name": "main"},
default_branch="main",
pr_labels=("full tests needed",),
+ platform=CI_ARM_PLATFORM,
)
- with patch.object(
- SelectiveChecks, "runner_type", new_callable=lambda: property(lambda
self: '["ubuntu-22.04-arm"]')
- ):
- assert arm_checks.platform == "linux/arm64"
- arm_output =
arm_checks.individual_providers_test_types_list_as_strings_in_json
- assert arm_output is not None
- assert "Providers[ibm.mq]" not in arm_output
+ arm_output =
arm_checks.individual_providers_test_types_list_as_strings_in_json
+ assert arm_output is not None
+ assert "Providers[ibm.mq]" not in arm_output
amd_checks = SelectiveChecks(
files=("airflow-core/tests/test_example.py",),
@@ -3681,14 +3458,11 @@ def
test_individual_providers_excludes_platform_excluded_on_arm():
github_context_dict={"ref_name": "main"},
default_branch="main",
pr_labels=("full tests needed",),
+ platform=CI_AMD_PLATFORM,
)
- with patch.object(
- SelectiveChecks, "runner_type", new_callable=lambda: property(lambda
self: PUBLIC_AMD_RUNNERS)
- ):
- assert amd_checks.platform == "linux/amd64"
- amd_output =
amd_checks.individual_providers_test_types_list_as_strings_in_json
- assert amd_output is not None
- assert "Providers[ibm.mq]" in amd_output
+ amd_output =
amd_checks.individual_providers_test_types_list_as_strings_in_json
+ assert amd_output is not None
+ assert "Providers[ibm.mq]" in amd_output
def test_run_kubernetes_tests_forced_by_label():
diff --git a/scripts/ci/prek/check_ci_workflows_in_sync.py
b/scripts/ci/prek/check_ci_workflows_in_sync.py
index 2e5584c2431..14d195f067b 100755
--- a/scripts/ci/prek/check_ci_workflows_in_sync.py
+++ b/scripts/ci/prek/check_ci_workflows_in_sync.py
@@ -36,9 +36,11 @@ Documented divergences:
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
+6. ``PLATFORM`` env on the ``selective-checks`` step — the platform this
+ workflow's tests run on.
+7. ``print-platform`` job — ``name:`` and the architecture echoed to
GITHUB_STEP_SUMMARY
-7. ``notify-slack`` Slack-state artifact name — ``slack-state-tests-…-arm``
+8. ``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
@@ -85,6 +87,7 @@ LINE_RULES: list[tuple[str, str]] = [
(r"^ group: ci-(?:arm|amd)-", " group: ci-PLACEHOLDER-"),
(r'^ platform: "linux/(?:arm64|amd64)"$', ' platform:
"linux/PLACEHOLDER"'),
(r"^ runner-type: '\[\"ubuntu-22\.04(?:-arm)?\"\]'$", "
runner-type: 'PLACEHOLDER'"),
+ (r'^ PLATFORM: "linux/(?:arm64|amd64)"$', ' PLATFORM:
"linux/PLACEHOLDER"'),
(
r"^ # (?:ARM|AMD) copy\)\. The matching (?:AMD|ARM) copy lives in
ci-(?:amd|arm)\.yml\.$",
" # PLACEHOLDER copy). The matching PLACEHOLDER copy lives in
ci-PLACEHOLDER.yml.",