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 1d198a159c7 Update release process for source tarballs prepared during
release (#57364)
1d198a159c7 is described below
commit 1d198a159c7c814fc31a527a5767eaab55b49288
Author: Jarek Potiuk <[email protected]>
AuthorDate: Mon Oct 27 22:25:18 2025 +0100
Update release process for source tarballs prepared during release (#57364)
The updated airflow-ctl release process had some small issues related
to source tarball created - which turned out to be just errors in
matching version to tag. When we prepared source tarball we were
using the "x.y.z" tag always - no matter which distribution was
created - this was fine for Airflow but not fine for other
distributions:
* airflow-ctl/x.y.z
* task-sdk/x.y.z
* providers/YYYY-MM-DD
Also names of the source tarballs had extra `apache-' prefix after
we switched to passing actual distribution name as parameter.
This PR fixes the commands used to prepare tarballs:
* proper tag is used for all distributions
* documentation about using those tags is updated
* release documentation for airflow-ctl is updated to have proper
links
* release documentation for providers is updated to add the new
way of tagging the providers with `providers/YYYY-MM-DD` tag
additionally to individual provider's tags (to denote the date
of provider's wave)
Fixes: #47343
---
dev/README_RELEASE_AIRFLOWCTL.md | 26 ++++++++++--------
dev/README_RELEASE_PROVIDERS.md | 13 ++++++---
.../commands/release_candidate_command.py | 32 +++++++++++++---------
.../commands/release_management_commands.py | 21 +++++++++++---
4 files changed, 59 insertions(+), 33 deletions(-)
diff --git a/dev/README_RELEASE_AIRFLOWCTL.md b/dev/README_RELEASE_AIRFLOWCTL.md
index 6664fe2d083..2258b7c4aab 100644
--- a/dev/README_RELEASE_AIRFLOWCTL.md
+++ b/dev/README_RELEASE_AIRFLOWCTL.md
@@ -346,21 +346,21 @@ Body:
```shell script
cat <<EOF
-The release candidate for *Apache airflowctl** : ${VERSION_RC} is now
available for testing!
+The release candidate for **Apache Airflow Ctl**: ${VERSION_RC} is now
available for testing!
-This email is calling for a vote on the release, which will last at least until
-*October 30, 2025* and until 3 binding +1 votes have been received.
+This email is calling for a vote on the release, which will last at least
until the
+DATE_HERE and until 3 binding +1 votes have been received.
Consider this my +1 non-binding vote.
-airflowctl ${VERSION_RC} is available at:
https://dist.apache.org/repos/dist/dev/airflow/airflow-ctl/${VERSION_RC}/
+The apache-airflow-ctl ${VERSION_RC} package is available at:
https://dist.apache.org/repos/dist/dev/airflow/airflow-ctl/${VERSION_RC}/
-"airflowctl" package:
+The "airflowctl" package:
- - *airflowctl-${VERSION}-source.tar.gz* is a source release that comes
+ - *apache_airfow_ctl-${VERSION}-source.tar.gz* is a source release that
comes
with INSTALL instructions.
- - *airflowctl-${VERSION}.tar.gz* is the binary Python "sdist" release.
- - *airflowctl-${VERSION}-py3-none-any.whl* is the binary Python wheel
"binary" release.
+ - *apache_airfow_ctl-${VERSION}.tar.gz* is the binary Python "sdist"
release.
+ - *apache_airfow_ctl-${VERSION}-py3-none-any.whl* is the binary Python
wheel "binary" release.
Public keys are available at:
https://dist.apache.org/repos/dist/release/airflow/KEYS
@@ -377,22 +377,24 @@ The test procedure for PMC members is described in:
https://github.com/apache/ai
The test procedure for contributors and members of the community who would
like to test this RC is described in:
https://github.com/apache/airflow/blob/main/dev/README_RELEASE_AIRFLOWCTL.md#verify-the-release-candidate-by-contributors
-Please note that the version number excludes the 'rcX' string, so it's now
simply ${VERSION} for the airflowctl package.
+Please note that the version number excludes the 'rcX' string, so it's now
simply ${VERSION} for the apache-airflow-ctl package.
This will allow us to rename the artifact without modifying the artifact
checksums when we actually release.
-*Docs* (for preview):
https://airflow.staged.apache.org/docs/airflowctl/${VERSION}
+*Docs* (for preview):
https://airflow.staged.apache.org/docs/apache-airflow-ctl/${VERSION}/index.html
*Release Notes*:
https://github.com/apache/airflow/blob/airflow-ctl/${VERSION_RC}/airflow-ctl/RELEASE_NOTES.rst
*Testing Instructions using PyPI*:
+The packages are available in PyPI:
https://pypi.org/project/apache-airflow-ctl/${VERSION_RC}/
+
You can build a virtualenv that installs this and other required packages like
this:
uv venv
-uv pip install -U airflowctl==${VERSION_RC}
+uv pip install -U apache-airflow-ctl==${VERSION_RC}
Regards,
-<Your namee>
+<Your name>
EOF
```
diff --git a/dev/README_RELEASE_PROVIDERS.md b/dev/README_RELEASE_PROVIDERS.md
index aca9c26c502..4e71f6eb56f 100644
--- a/dev/README_RELEASE_PROVIDERS.md
+++ b/dev/README_RELEASE_PROVIDERS.md
@@ -840,13 +840,11 @@ How to verify it:
cd "${AIRFLOW_REPO_ROOT}"
```
-2) Check out one of the tags for the release. Pick one of the
provider-specific tags that are part
- of the release wave. Assume your remote to apache repo is `apache` - then
the right set of
- commands are:
+2) Check out the ``providers/YYYY-MM-DD`` tag:
```shell
git fetch apache --tags
-git checkout providers-amazon/9.1.0rc1
+git checkout providers/2025-10-20
```
3) Remove all the packages you have in dist folder
@@ -1347,6 +1345,13 @@ If you want to disable this behaviour, set the env
**CLEAN_LOCAL_TAGS** to false
breeze release-management tag-providers
```
+The command should output all the tags it created. At the end it should also
print the general tag
+applied for this provider's release wave - with current date in the format of:
+
+```
+providers/YYYY-MM-DD
+```
+
## Publish documentation
Documentation is an essential part of the product and should be made available
to users.
diff --git
a/dev/breeze/src/airflow_breeze/commands/release_candidate_command.py
b/dev/breeze/src/airflow_breeze/commands/release_candidate_command.py
index 406fb9c3609..10eb1b1d048 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_candidate_command.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_candidate_command.py
@@ -256,11 +256,11 @@ def tarball_release(
distribution_name: DistributionType,
tag: str | None = None,
):
- console_print(f"[info]Creating tarball for Apache
{distribution_name.value} {version}")
+ console_print(f"[info]Creating tarball for {distribution_name.value}
{version}")
shutil.rmtree(OUT_PATH, ignore_errors=True)
OUT_PATH.mkdir(exist_ok=True)
AIRFLOW_DIST_PATH.mkdir(exist_ok=True)
- archive_name =
f"apache-{distribution_name.value}-{version_without_rc}-source.tar.gz"
+ archive_name =
f"{distribution_name.value}-{version_without_rc}-source.tar.gz"
temporary_archive = OUT_PATH / archive_name
result = run_command(
[
@@ -270,7 +270,7 @@ def tarball_release(
"archive",
"--format=tar.gz",
f"{version if tag is None else tag}",
- f"--prefix=apache-{distribution_name.value}-{version_without_rc}/",
+ f"--prefix={distribution_name.value}-{version_without_rc}/",
"-o",
temporary_archive.as_posix(),
],
@@ -308,19 +308,25 @@ def create_tarball_release(
if distribution_name == DistributionType.AIRFLOW_CORE:
version = get_airflow_version()
elif distribution_name == DistributionType.TASK_SDK:
- version = get_task_sdk_version()
+ version = f"task-sdk/{get_task_sdk_version()}"
elif distribution_name == DistributionType.AIRFLOW_CTL:
- version = get_airflowctl_version()
+ version = f"airflow-ctl/{get_airflowctl_version()}"
elif distribution_name == DistributionType.PROVIDERS:
- version = get_airflow_version()
- distribution_version = Version(version)
- source_date_epoch = get_source_date_epoch(AIRFLOW_ROOT_PATH)
- version_without_rc = (
- distribution_version.base_version
- if distribution_name != DistributionType.PROVIDERS
- else f"{datetime.now().strftime('%Y-%m-%d')}"
- )
+ version = f"providers/{datetime.now().strftime('%Y-%m-%d')}"
+ else:
+ if distribution_name == DistributionType.TASK_SDK:
+ version = f"task-sdk/{version}"
+ elif distribution_name == DistributionType.AIRFLOW_CTL:
+ version = f"airflow-ctl/{version}"
+ elif distribution_name == DistributionType.PROVIDERS:
+ version = f"providers/{version}"
+ if distribution_name != DistributionType.PROVIDERS:
+ distribution_version = Version(version.split("/")[-1])
+ version_without_rc = distribution_version.base_version
+ else:
+ version_without_rc = version.split("/")[-1]
+ source_date_epoch = get_source_date_epoch(AIRFLOW_ROOT_PATH)
# Create the tarball
tarball_release(
version=version,
diff --git
a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
index e951b37e952..d4b422b9a08 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
@@ -32,7 +32,7 @@ import time
from collections import defaultdict
from collections.abc import Generator, Iterable
from copy import deepcopy
-from datetime import date, datetime
+from datetime import datetime
from enum import Enum
from functools import partial
from multiprocessing import Pool
@@ -1317,6 +1317,8 @@ def tag_providers(
except subprocess.CalledProcessError:
pass
+ release_date = datetime.now().strftime("%Y-%m-%d")
+
if found_remote is None:
raise ValueError("Could not find remote configured to push to
apache/airflow")
@@ -1328,15 +1330,26 @@ def tag_providers(
provider = f"providers-{match.group(1).replace('_', '-')}"
tag = f"{provider}/{match.group(2)}"
try:
+ get_console().print(f"[info]Creating tag: {tag}")
run_command(
- ["git", "tag", tag, "-m", f"Release {date.today()} of
providers"],
+ ["git", "tag", tag, "-m", f"Release {release_date} of
providers"],
check=True,
)
tags.append(tag)
- except subprocess.CalledProcessError:
+ except subprocess.CalledProcessError as e:
+ get_console().print(f"[warning]Failed to create {tag}:
{e}")
pass
-
+ providers_date_tag = f"providers/{release_date}"
if tags:
+ run_command(
+ ["git", "tag", providers_date_tag, "-m", f"Release {release_date}
of providers"],
+ check=True,
+ )
+ get_console().print()
+ get_console().print("\n[info]The providers release have been tagged
with:[/]")
+ get_console().print(providers_date_tag)
+ get_console().print()
+ tags.append(providers_date_tag)
try:
push_result = run_command(
["git", "push", found_remote, *tags],