This is an automated email from the ASF dual-hosted git repository.
ephraimanierobi pushed a commit to branch v3-1-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit 49d08fe87b652ef4e38400bb86d5291cc0d053d5
Author: github-actions[bot]
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Thu Jan 8 22:04:43 2026 +0100
[v3-1-test] Fix flaky release command (#60284) (#60291)
(cherry picked from commit a037560f85f1ae98691b30877c976bedb8e8a504)
Co-authored-by: Rahul Vats <[email protected]>
---
.../src/airflow_breeze/commands/release_command.py | 77 +++++++++++++++-------
1 file changed, 55 insertions(+), 22 deletions(-)
diff --git a/dev/breeze/src/airflow_breeze/commands/release_command.py
b/dev/breeze/src/airflow_breeze/commands/release_command.py
index a66dd38c52f..8b0926fdf41 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_command.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_command.py
@@ -18,6 +18,8 @@ from __future__ import annotations
import os
import re
+import time
+from subprocess import CalledProcessError
import click
@@ -27,19 +29,42 @@ from airflow_breeze.utils.confirm import confirm_action
from airflow_breeze.utils.console import console_print
from airflow_breeze.utils.path_utils import AIRFLOW_ROOT_PATH
from airflow_breeze.utils.run_utils import run_command
+from airflow_breeze.utils.shared_options import get_dry_run
# Pattern to match Airflow release versions (e.g., "3.0.5")
RELEASE_PATTERN =
re.compile(r"^(?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)$")
+SVN_NUM_TRIES = 3
+
+
def clone_asf_repo(working_dir):
if confirm_action("Clone ASF repo?"):
run_command(["rm", "-rf", f"{working_dir}/asf-dist"], check=True)
- run_command(
- ["svn", "checkout", "--depth=immediates",
"https://dist.apache.org/repos/dist", "asf-dist"],
- check=True,
- dry_run_override=False,
- )
+
+ # SVN checkout with retries
+ for attempt in range(SVN_NUM_TRIES):
+ try:
+ run_command(
+ [
+ "svn",
+ "checkout",
+ "--depth=immediates",
+ "https://dist.apache.org/repos/dist",
+ "asf-dist",
+ ],
+ check=True,
+ dry_run_override=False,
+ )
+ break
+ except CalledProcessError:
+ if attempt == SVN_NUM_TRIES - 1:
+ raise
+ console_print(
+ f"[warning]SVN checkout failed. Retrying! {SVN_NUM_TRIES -
attempt - 1} tries left."
+ )
+ time.sleep(5)
+
dev_dir = f"{working_dir}/asf-dist/dev/airflow"
release_dir = f"{working_dir}/asf-dist/release/airflow"
run_command(["svn", "update", "--set-depth", "infinity", dev_dir],
dry_run_override=False, check=True)
@@ -401,26 +426,34 @@ def airflow_release(version, task_sdk_version):
# Clone the asf repo
os.chdir("..")
working_dir = os.getcwd()
- clone_asf_repo(working_dir)
svn_dev_repo = f"{working_dir}/asf-dist/dev/airflow"
svn_release_repo = f"{working_dir}/asf-dist/release/airflow"
- console_print("SVN dev repo root:", svn_dev_repo)
- console_print("SVN release repo root:", svn_release_repo)
-
- # Find the latest release candidate for the given version
- console_print()
- console_print("Finding latest release candidate from SVN dev directory...")
- release_candidate = find_latest_release_candidate(version, svn_dev_repo,
component="airflow")
- if not release_candidate:
- exit(f"No release candidate found for version {version} in SVN dev
directory")
- task_sdk_release_candidate = None
- if task_sdk_version:
- task_sdk_release_candidate = find_latest_release_candidate(
- task_sdk_version, svn_dev_repo, component="task-sdk"
- )
- if not task_sdk_release_candidate:
- exit(f"No Task SDK release candidate found for version
{task_sdk_version} in SVN dev directory")
+ if get_dry_run():
+ # Skip SVN clone in dry-run mode - use placeholder RCs for testing the
workflow
+ console_print("[info]Skipping SVN operations in dry-run mode")
+ release_candidate = f"{version}rc1"
+ task_sdk_release_candidate = f"{task_sdk_version}rc1" if
task_sdk_version else None
+ else:
+ clone_asf_repo(working_dir)
+ console_print("SVN dev repo root:", svn_dev_repo)
+ console_print("SVN release repo root:", svn_release_repo)
+
+ console_print()
+ console_print("Finding latest release candidate from SVN dev
directory...")
+ release_candidate = find_latest_release_candidate(version,
svn_dev_repo, component="airflow")
+ if not release_candidate:
+ exit(f"No release candidate found for version {version} in SVN dev
directory")
+
+ task_sdk_release_candidate = None
+ if task_sdk_version:
+ task_sdk_release_candidate = find_latest_release_candidate(
+ task_sdk_version, svn_dev_repo, component="task-sdk"
+ )
+ if not task_sdk_release_candidate:
+ exit(
+ f"No Task SDK release candidate found for version
{task_sdk_version} in SVN dev directory"
+ )
console_print()
console_print("Airflow Release candidate:", release_candidate)