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 b629fa1dee5 Add v3-2-test branch to remaining .github/ configs (#64431)
b629fa1dee5 is described below
commit b629fa1dee559473356e5380c338f15d9c2afb50
Author: Jarek Potiuk <[email protected]>
AuthorDate: Mon Mar 30 02:28:01 2026 +0200
Add v3-2-test branch to remaining .github/ configs (#64431)
Follow-up from #64423 — adds v3-2-test to dependabot,
milestone-tag-assistant,
and basic-tests workflows. Updates release instructions in
dev/README_RELEASE_AIRFLOW.md with details on which .github/ files need
updating when creating a new minor/major branch, and adds a helper script
(dev/update_github_branch_config.py) to automate those changes.
---
.github/dependabot.yml | 73 ++++++
.github/workflows/basic-tests.yml | 8 +-
.github/workflows/milestone-tag-assistant.yml | 1 +
dev/README_RELEASE_AIRFLOW.md | 21 +-
dev/update_github_branch_config.py | 353 ++++++++++++++++++++++++++
5 files changed, 447 insertions(+), 9 deletions(-)
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 1362bc6ae6c..1571b7ef980 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -29,6 +29,19 @@ updates:
patterns:
- "*"
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ cooldown:
+ default-days: 4
+ schedule:
+ # Check for updates to GitHub Actions every week
+ interval: "weekly"
+ target-branch: v3-2-test
+ groups:
+ github-actions-updates:
+ patterns:
+ - "*"
+
- package-ecosystem: "github-actions"
directory: "/"
cooldown:
@@ -200,6 +213,66 @@ updates:
update-types:
- "major"
+ # Repeat dependency updates on v3-2-test branch as well
+ - package-ecosystem: pip
+ cooldown:
+ default-days: 4
+ directories:
+ - /airflow-core
+ - /airflow-ctl
+ - /clients/python
+ - /dev/breeze
+ - /docker-tests
+ - /kubernetes-tests
+ - /helm-tests
+ - /task-sdk
+ - /
+ schedule:
+ interval: daily
+ target-branch: v3-2-test
+ groups:
+ pip-dependency-updates:
+ patterns:
+ - "*"
+
+ - package-ecosystem: npm
+ cooldown:
+ default-days: 4
+ directories:
+ - /airflow-core/src/airflow/ui
+ schedule:
+ interval: "weekly"
+ target-branch: v3-2-test
+ groups:
+ 3-2-core-ui-package-updates:
+ patterns:
+ - "*"
+ update-types:
+ - "minor"
+ - "patch"
+ ignore:
+ - dependency-name: "*"
+ update-types: ["version-update:semver-major"]
+
+ - package-ecosystem: npm
+ cooldown:
+ default-days: 4
+ directories:
+ - /airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui
+ schedule:
+ interval: "weekly"
+ target-branch: v3-2-test
+ groups:
+ 3-2-auth-ui-package-updates:
+ patterns:
+ - "*"
+ update-types:
+ - "minor"
+ - "patch"
+ ignore:
+ - dependency-name: "*"
+ update-types: ["version-update:semver-major"]
+
# Repeat dependency updates on v3-1-test branch as well
- package-ecosystem: pip
cooldown:
diff --git a/.github/workflows/basic-tests.yml
b/.github/workflows/basic-tests.yml
index 87909137c1a..6013b04e57b 100644
--- a/.github/workflows/basic-tests.yml
+++ b/.github/workflows/basic-tests.yml
@@ -414,14 +414,14 @@ jobs:
- name: Install twine
run: pip install twine
- name: "Check Airflow create minor branch command"
- run: breeze release-management create-minor-branch --version-branch
3-1 --answer yes --dry-run
+ run: breeze release-management create-minor-branch --version-branch
3-2 --answer yes --dry-run
- name: "Check Airflow RC process command"
run: >
- breeze release-management start-rc-process --version 3.1.0rc1
--previous-version 3.0.0
- --task-sdk-version 1.0.0rc1 --sync-branch v3-1-test --answer yes
--dry-run
+ breeze release-management start-rc-process --version 3.2.0rc1
--previous-version 3.1.0
+ --task-sdk-version 1.1.0rc1 --sync-branch v3-2-test --answer yes
--dry-run
- name: "Check Airflow release process command"
run: >
- breeze release-management start-release --version 3.1.7
+ breeze release-management start-release --version 3.2.7
--answer yes --dry-run
- name: "Test providers metadata generation"
run: |
diff --git a/.github/workflows/milestone-tag-assistant.yml
b/.github/workflows/milestone-tag-assistant.yml
index dd902b8e17d..31a7b151c1c 100644
--- a/.github/workflows/milestone-tag-assistant.yml
+++ b/.github/workflows/milestone-tag-assistant.yml
@@ -21,6 +21,7 @@ on: # yamllint disable-line rule:truthy
push:
branches:
- main
+ - v3-2-test
- v3-1-test
permissions:
diff --git a/dev/README_RELEASE_AIRFLOW.md b/dev/README_RELEASE_AIRFLOW.md
index 9467646e30c..c67ece4b14c 100644
--- a/dev/README_RELEASE_AIRFLOW.md
+++ b/dev/README_RELEASE_AIRFLOW.md
@@ -282,7 +282,7 @@ explanations added to the documentation. Usually you can
see the list of such ch
```shell
git fetch apache
-git log --oneline apache/v3-1-test | sed -n 's/.*\((#[0-9]*)\)$/\1/p' >
/tmp/merged
+git log --oneline apache/v3-2-test | sed -n 's/.*\((#[0-9]*)\)$/\1/p' >
/tmp/merged
git log --oneline --decorate apache/v2-2-stable..apache/main --
docs/apache-airflow docs/docker-stack/ | grep -vf /tmp/merged
```
@@ -370,13 +370,13 @@ git show --format=tformat:"" --stat --name-only $(cat
/tmp/doc-only-changes.txt)
Then if you see suspicious file (example airflow/sensors/base.py) you can find
details on where they came from:
```shell
-git log apache/v3-1-test --format="%H" -- airflow/sensors/base.py | grep -f
/tmp/doc-only-changes.txt | xargs git show
+git log apache/v3-2-test --format="%H" -- airflow/sensors/base.py | grep -f
/tmp/doc-only-changes.txt | xargs git show
```
And the URL to the PR it comes from:
```shell
-git log apache/v3-1-test --format="%H" -- airflow/sensors/base.py | grep -f
/tmp/doc-only-changes.txt | \
+git log apache/v3-2-test --format="%H" -- airflow/sensors/base.py | grep -f
/tmp/doc-only-changes.txt | \
xargs -n 1 git log --oneline --max-count=1 | \
sed s'/.*(#\([0-9]*\))$/https:\/\/github.com\/apache\/airflow\/pull\/\1/'
```
@@ -461,8 +461,19 @@ uv tool install -e ./dev/breeze
with minimum version for the next version of Airflow will be added in the
future.
- Check `Apache Airflow is tested with` (stable version) in `README.md` has
the same tested versions as in the tip of
the stable branch in `dev/breeze/src/airflow_breeze/global_constants.py`
-- Create `backport-to-vX-Y-test` branch in
https://github.com/apache/airflow/labels
-- Update .github/boring-cyborg.yml and change the previous `backport-...`
branch auto assignment to the new one.
+- Create `backport-to-vX-Y-test` label:
+
+ ```shell script
+ gh label create 'backport-to-vX-Y-test' --repo apache/airflow
--description 'Backport to vX-Y-test' --color 0e8a16
+ ```
+
+- Update `.github/boring-cyborg.yml` and add `backport-to-vX-Y-test`
auto-assignment for the new branch.
+- Update `.github/` configuration on `main` to add the new `vX-Y-test` branch
(you can use the
+ `uv run dev/update_github_branch_config.py X Y` helper script for this). The
following files need updating:
+ - `.github/dependabot.yml` — add `target-branch: vX-Y-test` entries for
github-actions, pip, and npm ecosystems.
+ - `.github/workflows/milestone-tag-assistant.yml` — add `vX-Y-test` to the
push branches list.
+ - `.github/workflows/basic-tests.yml` — update the release-management
dry-run commands to test the new version.
+ - `.github/workflows/ci-notification.yml` — switch the `workflow-status`
matrix branch to the new branch.
- Commit the above changes with the message `Update version to ${VERSION}`.
- Build the release notes:
diff --git a/dev/update_github_branch_config.py
b/dev/update_github_branch_config.py
new file mode 100755
index 00000000000..2783d227dc1
--- /dev/null
+++ b/dev/update_github_branch_config.py
@@ -0,0 +1,353 @@
+#!/usr/bin/env python3
+# 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.
+# /// script
+# requires-python = ">=3.9"
+# ///
+"""
+Update .github/ configuration files on ``main`` when a new major/minor
+release branch (vX-Y-test) is created.
+
+Adds the new branch to dependabot, milestone-tag-assistant, basic-tests,
+ci-notification workflows and boring-cyborg auto-labelling.
+
+Usage::
+
+ uv run dev/update_github_branch_config.py <NEW_MAJOR> <NEW_MINOR>
+
+Example — after creating the v3-3-test branch::
+
+ uv run dev/update_github_branch_config.py 3 3
+"""
+
+from __future__ import annotations
+
+import re
+import sys
+from pathlib import Path
+
+REPO_ROOT = Path(__file__).resolve().parent.parent
+
+
+def _read(path: Path) -> str:
+ return path.read_text()
+
+
+def _write(path: Path, content: str) -> None:
+ path.write_text(content)
+
+
+#
──────────────────────────────────────────────────────────────────────────────
+# dependabot.yml
+#
──────────────────────────────────────────────────────────────────────────────
+def update_dependabot(new_branch: str, prev_branch: str, new_dash: str) ->
None:
+ path = REPO_ROOT / ".github" / "dependabot.yml"
+ content = _read(path)
+
+ if f"target-branch: {new_branch}" in content:
+ print(f"dependabot.yml: {new_branch} already present, skipping.")
+ return
+
+ print(f"dependabot.yml: adding {new_branch} entries...")
+
+ # 1. Add github-actions entry before the existing entry for prev_branch
+ gh_actions_new_entry = f"""\
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ cooldown:
+ default-days: 4
+ schedule:
+ # Check for updates to GitHub Actions every week
+ interval: "weekly"
+ target-branch: {new_branch}
+ groups:
+ github-actions-updates:
+ patterns:
+ - "*"
+
+"""
+ # Match the full existing block for prev_branch
+ prev_gh_actions = f"""\
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ cooldown:
+ default-days: 4
+ schedule:
+ # Check for updates to GitHub Actions every week
+ interval: "weekly"
+ target-branch: {prev_branch}
+"""
+ content = content.replace(prev_gh_actions, gh_actions_new_entry +
prev_gh_actions, 1)
+
+ # 2. Add pip + npm entries before the previous branch's comment block
+ pip_npm_block = f"""\
+ # Repeat dependency updates on {new_branch} branch as well
+ - package-ecosystem: pip
+ cooldown:
+ default-days: 4
+ directories:
+ - /airflow-core
+ - /airflow-ctl
+ - /clients/python
+ - /dev/breeze
+ - /docker-tests
+ - /kubernetes-tests
+ - /helm-tests
+ - /task-sdk
+ - /
+ schedule:
+ interval: daily
+ target-branch: {new_branch}
+ groups:
+ pip-dependency-updates:
+ patterns:
+ - "*"
+
+ - package-ecosystem: npm
+ cooldown:
+ default-days: 4
+ directories:
+ - /airflow-core/src/airflow/ui
+ schedule:
+ interval: "weekly"
+ target-branch: {new_branch}
+ groups:
+ {new_dash}-core-ui-package-updates:
+ patterns:
+ - "*"
+ update-types:
+ - "minor"
+ - "patch"
+ ignore:
+ - dependency-name: "*"
+ update-types: ["version-update:semver-major"]
+
+ - package-ecosystem: npm
+ cooldown:
+ default-days: 4
+ directories:
+ - /airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui
+ schedule:
+ interval: "weekly"
+ target-branch: {new_branch}
+ groups:
+ {new_dash}-auth-ui-package-updates:
+ patterns:
+ - "*"
+ update-types:
+ - "minor"
+ - "patch"
+ ignore:
+ - dependency-name: "*"
+ update-types: ["version-update:semver-major"]
+
+"""
+ prev_comment = f" # Repeat dependency updates on {prev_branch} branch as
well"
+ content = content.replace(prev_comment, pip_npm_block + prev_comment, 1)
+
+ _write(path, content)
+
+
+#
──────────────────────────────────────────────────────────────────────────────
+# milestone-tag-assistant.yml
+#
──────────────────────────────────────────────────────────────────────────────
+def update_milestone_tag_assistant(new_branch: str, prev_branch: str) -> None:
+ path = REPO_ROOT / ".github" / "workflows" / "milestone-tag-assistant.yml"
+ content = _read(path)
+
+ if f"- {new_branch}" in content:
+ print(f"milestone-tag-assistant.yml: {new_branch} already present,
skipping.")
+ return
+
+ print(f"milestone-tag-assistant.yml: adding {new_branch}...")
+ content = content.replace(
+ f" - {prev_branch}",
+ f" - {new_branch}\n - {prev_branch}",
+ 1,
+ )
+ _write(path, content)
+
+
+#
──────────────────────────────────────────────────────────────────────────────
+# basic-tests.yml
+#
──────────────────────────────────────────────────────────────────────────────
+def update_basic_tests(
+ new_branch: str,
+ prev_branch: str,
+ new_version: str,
+ prev_version: str,
+ new_dash: str,
+ prev_dash: str,
+) -> None:
+ path = REPO_ROOT / ".github" / "workflows" / "basic-tests.yml"
+ content = _read(path)
+
+ print(f"basic-tests.yml: updating release-management dry-run versions to
{new_version}...")
+
+ content = content.replace(
+ f"create-minor-branch --version-branch {prev_dash}",
+ f"create-minor-branch --version-branch {new_dash}",
+ )
+ content = content.replace(
+ f"--sync-branch {prev_branch}",
+ f"--sync-branch {new_branch}",
+ )
+
+ # Update start-rc-process version and previous-version
+ content = content.replace(
+ f"start-rc-process --version {prev_version}.0rc1",
+ f"start-rc-process --version {new_version}.0rc1",
+ )
+ content = re.sub(
+ r"--previous-version \d+\.\d+\.0(\s+.*--task-sdk-version)",
+ f"--previous-version {prev_version}.0\\1",
+ content,
+ )
+ # Bump task-sdk version: increment minor
+ content = re.sub(
+ r"--task-sdk-version \d+\.\d+\.0rc1",
+ f"--task-sdk-version 1.{int(new_version.split('.')[1]) - 1}.0rc1",
+ content,
+ )
+
+ # Update start-release version
+ content = re.sub(
+ rf"start-release --version {re.escape(prev_version)}\.\d+",
+ f"start-release --version {new_version}.7",
+ content,
+ )
+
+ _write(path, content)
+
+
+#
──────────────────────────────────────────────────────────────────────────────
+# ci-notification.yml
+#
──────────────────────────────────────────────────────────────────────────────
+def update_ci_notification(new_branch: str, prev_branch: str) -> None:
+ path = REPO_ROOT / ".github" / "workflows" / "ci-notification.yml"
+ content = _read(path)
+
+ print(f"ci-notification.yml: switching branch to {new_branch}...")
+ content = content.replace(
+ f'branch: ["{prev_branch}"]',
+ f'branch: ["{new_branch}"]',
+ )
+ _write(path, content)
+
+
+#
──────────────────────────────────────────────────────────────────────────────
+# boring-cyborg.yml
+#
──────────────────────────────────────────────────────────────────────────────
+BORING_CYBORG_BACKPORT_BLOCK = """\
+ # This should be copy of the "area:dev-tools" above minus contributing docs
and some files that should
+ # only make sense in main - it should be updated when we switch maintenance
branch
+ backport-to-{new_branch}:
+ - scripts/**/*
+ - dev/**/*
+ - .github/**/*
+ - Dockerfile.ci
+ - yamllint-config.yml
+ - .dockerignore
+ - .hadolint.yaml
+ - .pre-commit-config.yaml
+ - .rat-excludes
+
+"""
+
+
+def update_boring_cyborg(new_branch: str, prev_branch: str) -> None:
+ path = REPO_ROOT / ".github" / "boring-cyborg.yml"
+ content = _read(path)
+
+ if f"backport-to-{new_branch}:" in content:
+ print(f"boring-cyborg.yml: backport-to-{new_branch} already present,
skipping.")
+ return
+
+ print(f"boring-cyborg.yml: adding backport-to-{new_branch}...")
+ new_block = BORING_CYBORG_BACKPORT_BLOCK.format(new_branch=new_branch)
+ anchor = f" backport-to-{prev_branch}:"
+ # Find the comment block preceding the previous backport entry
+ prev_comment = f"""\
+ # This should be copy of the "area:dev-tools" above minus contributing docs
and some files that should
+ # only make sense in main - it should be updated when we switch maintenance
branch
+ backport-to-{prev_branch}:"""
+ if prev_comment in content:
+ content = content.replace(prev_comment, new_block + anchor, 1)
+ else:
+ content = content.replace(anchor, new_block + anchor, 1)
+
+ _write(path, content)
+
+
+#
──────────────────────────────────────────────────────────────────────────────
+# dev/README_RELEASE_AIRFLOW.md
+#
──────────────────────────────────────────────────────────────────────────────
+def update_release_readme(new_branch: str, prev_branch: str) -> None:
+ path = REPO_ROOT / "dev" / "README_RELEASE_AIRFLOW.md"
+ content = _read(path)
+
+ print(f"README_RELEASE_AIRFLOW.md: updating apache/{prev_branch}
references to apache/{new_branch}...")
+ content = content.replace(f"apache/{prev_branch}", f"apache/{new_branch}")
+ _write(path, content)
+
+
+#
──────────────────────────────────────────────────────────────────────────────
+# main
+#
──────────────────────────────────────────────────────────────────────────────
+def main() -> None:
+ if len(sys.argv) != 3:
+ print(f"Usage: {sys.argv[0]} <NEW_MAJOR> <NEW_MINOR>")
+ print(f"Example: {sys.argv[0]} 3 3 (for v3-3-test branch)")
+ sys.exit(1)
+
+ new_major = int(sys.argv[1])
+ new_minor = int(sys.argv[2])
+ prev_minor = new_minor - 1
+
+ new_branch = f"v{new_major}-{new_minor}-test"
+ prev_branch = f"v{new_major}-{prev_minor}-test"
+ new_version = f"{new_major}.{new_minor}"
+ prev_version = f"{new_major}.{prev_minor}"
+ new_dash = f"{new_major}-{new_minor}"
+ prev_dash = f"{new_major}-{prev_minor}"
+
+ print(f"Updating .github/ configs: adding {new_branch} (previous:
{prev_branch})")
+ print(f"Repository root: {REPO_ROOT}")
+ print()
+
+ update_dependabot(new_branch, prev_branch, new_dash)
+ update_milestone_tag_assistant(new_branch, prev_branch)
+ update_basic_tests(new_branch, prev_branch, new_version, prev_version,
new_dash, prev_dash)
+ update_ci_notification(new_branch, prev_branch)
+ update_boring_cyborg(new_branch, prev_branch)
+ update_release_readme(new_branch, prev_branch)
+
+ print()
+ print("Done! Please review the changes with 'git diff' before committing.")
+ print()
+ print("Additional manual steps:")
+ print(f" - Create the 'backport-to-{new_branch}' label:")
+ print(
+ f" gh label create 'backport-to-{new_branch}' --repo
apache/airflow"
+ f" --description 'Backport to {new_branch}' --color 0e8a16"
+ )
+ print(" - Update test references in
dev/breeze/tests/test_set_milestone.py if needed")
+ print(" - Update dev/README_AIRFLOW3_DEV.md references if needed")
+
+
+if __name__ == "__main__":
+ main()