You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by po...@apache.org on 2025/11/05 15:53:04 UTC

(airflow) branch v3-1-test updated: [v3-1-test] Update release documentation for airflowctl and tarballs (#57337) (#57876)

This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch v3-1-test
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/v3-1-test by this push:
     new e1409454c99 [v3-1-test] Update release documentation for airflowctl and tarballs (#57337) (#57876)
e1409454c99 is described below

commit e1409454c9967ef9655f9405cafefd9e547187cc
Author: Jarek Potiuk <ja...@potiuk.com>
AuthorDate: Wed Nov 5 16:52:56 2025 +0100

    [v3-1-test] Update release documentation for airflowctl and tarballs (#57337) (#57876)
    
    With airflowctl release, we are updating the release process as this
    is the first time we release the package. That also includes preparing
    source package - for airflowctl but also providers (in the future for
    task-sdk as well).
    
    This PR is the next step in making our release process more complete
    with sources released every time we release all packages.
    (cherry picked from commit e4e74dd97932318b819b7965879a687a946f07b5)
---
 dev/README_RELEASE_AIRFLOW.md                      |   4 +-
 dev/README_RELEASE_AIRFLOWCTL.md                   | 122 +++++++++++++++------
 dev/README_RELEASE_PROVIDERS.md                    |   9 +-
 .../doc/images/output_release-management.svg       |   2 +-
 .../doc/images/output_release-management.txt       |   2 +-
 ..._release-management_prepare-airflow-tarball.svg |  34 +++---
 ..._release-management_prepare-airflow-tarball.txt |   2 +-
 .../commands/release_candidate_command.py          |  15 ++-
 .../commands/release_management_commands.py        |  12 +-
 dev/breeze/src/airflow_breeze/global_constants.py  |   8 +-
 10 files changed, 140 insertions(+), 70 deletions(-)

diff --git a/dev/README_RELEASE_AIRFLOW.md b/dev/README_RELEASE_AIRFLOW.md
index 6850209f35b..12985bff051 100644
--- a/dev/README_RELEASE_AIRFLOW.md
+++ b/dev/README_RELEASE_AIRFLOW.md
@@ -629,7 +629,7 @@ export AIRFLOW_REPO_ROOT=$(pwd)
 rm -rf dist/*
 breeze release-management prepare-airflow-distributions --distribution-format both
 breeze release-management prepare-task-sdk-distributions --distribution-format both
-breeze release-management prepare-airflow-tarball --version ${VERSION}
+breeze release-management prepare-airflow-tarball --version ${VERSION} --distribution-name apache_airflow
 ```
 
 The `prepare-airflow-distributions` by default will use Dockerized approach and building of the packages
@@ -639,7 +639,7 @@ will be done in a docker container.  However, if you have  `hatch` installed loc
 ```bash
 breeze release-management prepare-airflow-distributions --distribution-format both --use-local-hatch
 breeze release-management prepare-task-sdk-distributions --distribution-format both --use-local-hatch
-breeze release-management prepare-airflow-tarball --version ${VERSION}
+breeze release-management prepare-airflow-tarball --version ${VERSION} --distribution-name apache_airflow
 ```
 
 This is generally faster and requires less resources/network bandwidth. Note that you have to
diff --git a/dev/README_RELEASE_AIRFLOWCTL.md b/dev/README_RELEASE_AIRFLOWCTL.md
index 899f8480357..1fe1aa85e82 100644
--- a/dev/README_RELEASE_AIRFLOWCTL.md
+++ b/dev/README_RELEASE_AIRFLOWCTL.md
@@ -170,12 +170,17 @@ cd asf-dist/dev/airflow/airflow-ctl
 # Remove previously released versions
 svn rm *
 
+mkdir -p ${VERSION_RC}
+cd ${VERSION_RC}
+
 # Move the artifacts to svn folder
 mv ${AIRFLOW_REPO_ROOT}/dist/* .
 
+cd ..
+
 # Add and commit
 svn add *
-svn commit -m "Add artifacts for Airflow CTL $(date "+%Y-%m-%d%n")"
+svn commit -m "Add artifacts for Airflow CTL ${VERSION_RC}"
 
 cd ${AIRFLOW_REPO_ROOT}
 ```
@@ -207,6 +212,7 @@ you should clean up dist folder before generating the packages, so you will only
 rm -rf ${AIRFLOW_REPO_ROOT}/dist/*
 
 breeze release-management prepare-airflow-ctl-distributions --version-suffix rc1 --distribution-format both
+breeze release-management prepare-airflow-tarball --distribution-name apache_airflow_ctl
 ```
 
 * Verify the artifacts that would be uploaded:
@@ -232,11 +238,9 @@ set tags for the airflow-ctl in the repo.
 Sometimes in cases when there is a connectivity issue to GitHub, it might be possible that local tags get created
 and lead to annoying errors. The default behaviour would be to clean such local tags up.
 
-If you want to disable this behaviour, set the env **CLEAN_LOCAL_TAGS** to false.
-
 ```shell script
 git tag -s "airflow-ctl/${VERSION_RC}"
-git push apache --tags
+git push apache --tags "airflow-ctl/${VERSION_RC}"
 ```
 
 ## Prepare documentation in Staging
@@ -261,13 +265,14 @@ The command does the following:
 3. Triggers S3 to GitHub Sync
 
 ```shell script
-  breeze workflow-run publish-docs --ref <tag> --site-env <staging/live/auto> apache-airflow-ctl
+  breeze workflow-run publish-docs --ref <tag> apache-airflow-ctl
 ```
 
 The `--ref` parameter should be the tag of the release candidate you are publishing.
 
-The `--site-env` parameter should be set to `staging` for pre-release versions or `live` for final releases. the default option is `auto`
-if the tag is rc it publishes to `staging` bucket, otherwise it publishes to `live` bucket.
+You can also add the `--site-env` parameter should be set to `staging` for pre-release
+versions or `live` for final releases. The default option is `auto` if the tag is rc it
+publishes to `staging` bucket, otherwise it publishes to `live` bucket.
 
 One of the interesting features of publishing this way is that you can also rebuild historical version of
 the documentation with patches applied to the documentation (if they can be applied cleanly).
@@ -278,7 +283,7 @@ building it (don't forget to add --skip-write-to-stable-folder if you are publis
 previous version of the distribution). Example:
 
 ```shell script
-breeze workflow-run publish-docs --ref airflow-ctl/1.0.0rc1 --site-env live \
+breeze workflow-run publish-docs --ref airflow-ctl/1.0.0 --site-env live \
   --apply-commits 4ae273cbedec66c87dc40218c7a94863390a380d --skip-write-to-stable-folder \
   apache.hive
 ```
@@ -335,7 +340,70 @@ TODO: prepare an issue
 
 Make sure the packages are in https://dist.apache.org/repos/dist/dev/airflow/airflow-ctl/
 
-TODO: prepare email
+
+Subject:
+
+```shell script
+cat <<EOF
+[VOTE] Release Airflow CTL ${VERSION} from ${VERSION_RC}
+EOF
+```
+
+Body:
+
+```shell script
+cat <<EOF
+The release candidate for *Apache airflowctl** :  ${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.
+
+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}/
+
+"airflowctl" package:
+
+   - *airflowctl-${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.
+
+Public keys are available at: https://dist.apache.org/repos/dist/release/airflow/KEYS
+
+Please vote accordingly:
+
+[ ] +1 approve
+[ ] +0 no opinion
+[ ] -1 disapprove with the reason
+
+Only votes from PMC members are binding, but all members of the community are encouraged to test the release and vote with "(non-binding)".
+
+The test procedure for PMC members is described in: https://github.com/apache/airflow/blob/main/dev/README_RELEASE_AIRFLOWCTL.md#verify-the-release-candidate-by-pmc-members
+
+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.
+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}
+
+*Release Notes*: https://github.com/apache/airflow/blob/airflow-ctl/${VERSION_RC}/airflow-ctl/RELEASE_NOTES.rst
+
+*Testing Instructions using PyPI*:
+
+You can build a virtualenv that installs this and other required packages like this:
+
+uv venv
+uv pip install -U airflowctl==${VERSION_RC}
+
+Regards,
+<Your namee>
+
+EOF
+```
+
 
 ## Verify the release candidate by PMC members
 
@@ -367,32 +435,12 @@ svn update .
 Set an environment variable: PATH_TO_SVN to the root of folder where you have airflow-ctl
 
 ``` shell
-cd asf-dist/dev/airflow
+cd asf-dist/dev/airflow/airflow-ctl
 export PATH_TO_SVN=$(pwd -P)
 ```
 
 TODO: implement check in ``check_files.py``
 
-Optionally you can use the [`check_files.py`](https://github.com/apache/airflow/blob/main/dev/check_files.py)
-script to verify that all expected files are present in SVN. This script will produce a `Dockerfile.pmc` which
-may help with verifying installation of the packages.
-
-Once you have cloned/updated the SVN repository, copy the pypi URLs shared in the email to a file called `packages.txt` in the $AIRFLOW_REPO_ROOT/dev
-directory and cd into it.
-
-```shell script
-uv run check_files.py airflow-ctl -p ${PATH_TO_SVN}
-```
-
-After the above script completes you can build `Dockerfile.pmc` to trigger an installation of airflow-ctl
-package and verify the correct versions are installed:
-
-```shell script
-docker build -f Dockerfile.pmc --tag local/airflow .
-docker run --rm --entrypoint "airflow-ctl" local/airflow info
-docker image rm local/airflow
-```
-
 ### Reproducible package builds checks
 
 For Airflow-ctl distributions we introduced a reproducible build mechanism - which means that whoever wants
@@ -428,6 +476,7 @@ rm -rf dist/*
 
 ```shell
 breeze release-management prepare-airflow-ctl-distributions --distribution-format both
+breeze release-management prepare-airflow-tarball --distribution-name apache_airflow_ctl
 ```
 
 5) Switch to the folder where you checked out the SVN dev files
@@ -473,8 +522,8 @@ fi
 # Cleanup old folders (if needed)
 find . -type d -maxdepth 1 | grep -v "^.$"> /tmp/files.txt
 cat /tmp/files.txt | xargs rm -rf
-# Unpack all packages
-for i in *.tar.gz
+# Unpack all source packages
+for i in *source.tar.gz
 do
    tar -xvzf $i
 done
@@ -578,9 +627,10 @@ done
 You should get output similar to:
 
 ```
-Checking apache-airflow-ctl-1.0.0rc1.tar.gz.sha512
-Checking apache_airflow-ctl-1.0.0rc1-py3-none-any.whl.sha512
-...
+Checking apache-airflow_ctl-1.0.0.tar.gz.sha512
+Checking apache_airflow_ctl-1.0.0-py3-none-any.whl.sha512
+Checking apache_airflow_ctl-1.0.0-source.tar.gz.sha512
+
 ```
 
 ## Verify the release candidate by Contributors
@@ -600,7 +650,7 @@ downloaded from the SVN).
 ### Installing in your local virtualenv
 
 ```shell
-pip install apache-airflow-ctl>==<VERSION>rc<X>
+pip install apache-airflow-ctl==<VERSION>rc<X>
 ```
 
 ### Additional Verification
diff --git a/dev/README_RELEASE_PROVIDERS.md b/dev/README_RELEASE_PROVIDERS.md
index d946d676746..6066eb4642d 100644
--- a/dev/README_RELEASE_PROVIDERS.md
+++ b/dev/README_RELEASE_PROVIDERS.md
@@ -345,6 +345,7 @@ brew install gnupg
 * Cleanup dist folder:
 
 ```shell script
+export PACKAGE_DATE=$(date "+%Y-%m-%d%n")
 export AIRFLOW_REPO_ROOT=$(pwd -P)
 rm -rf ${AIRFLOW_REPO_ROOT}/dist/*
 ```
@@ -353,6 +354,7 @@ rm -rf ${AIRFLOW_REPO_ROOT}/dist/*
 
 ```shell script
 breeze release-management prepare-provider-distributions  --include-removed-providers --distribution-format both
+breeze release-management prepare-airflow-tarball --version ${PACKGE_DATE} --distribution-name apache_airflow_providers
 ```
 
 if you only build few packages, run:
@@ -360,6 +362,7 @@ if you only build few packages, run:
 ```shell script
 breeze release-management prepare-provider-distributions  --include-removed-providers \
 --distribution-format both PACKAGE PACKAGE ....
+breeze release-management prepare-airflow-tarball --version ${PACKGE_DATE} --distribution-name apache_airflow_providers
 ```
 
 In case you want to also release a pre-installed provider that is in ``not-ready`` state (i.e. when
@@ -399,7 +402,7 @@ mv ${AIRFLOW_REPO_ROOT}/dist/* .
 
 # Add and commit
 svn add *
-svn commit -m "Add artifacts for Airflow Providers $(date "+%Y-%m-%d%n")"
+svn commit -m "Add artifacts for Airflow Providers ${PACKAGE_DATE}"
 
 cd ${AIRFLOW_REPO_ROOT}
 ```
@@ -576,10 +579,10 @@ There are few special considerations when the list of provider is updated.
 
 ```shell script
 cd "${AIRFLOW_SITE_DIRECTORY}"
-branch="add-documentation-$(date "+%Y-%m-%d%n")"
+branch="add-documentation-${PACKAGE_DATE}"
 git checkout -b "${branch}"
 git add .
-git commit -m "Add documentation for packages - $(date "+%Y-%m-%d%n")"
+git commit -m "Add documentation for packages - ${PACKAGE_DATE}"
 git push --set-upstream origin "${branch}"
 ```
 
diff --git a/dev/breeze/doc/images/output_release-management.svg b/dev/breeze/doc/images/output_release-management.svg
index e56fab233a6..addcc8ecd56 100644
--- a/dev/breeze/doc/images/output_release-management.svg
+++ b/dev/breeze/doc/images/output_release-management.svg
@@ -214,7 +214,7 @@
 </text><text class="breeze-release-management-r5" x="0" y="215.2" textLength="24.4" clip-path="url(#breeze-release-management-line-8)">╭─</text><text class="breeze-release-management-r5" x="24.4" y="215.2" textLength="317.2" clip-path="url(#breeze-release-management-line-8)">&#160;Airflow&#160;release&#160;commands&#160;</text><text class="breeze-release-management-r5" x="341.6" y="215.2" textLength="1098" clip-path="url(#breeze-release-management-line-8)">─────────────────────────────── [...]
 </text><text class="breeze-release-management-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-release-management-line-9)">│</text><text class="breeze-release-management-r4" x="24.4" y="239.6" textLength="414.8" clip-path="url(#breeze-release-management-line-9)">create-minor-branch&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-release-management-r1" x="463.6" y="239.6" textLength="976" clip-path="url(#breez [...]
 </text><text class="breeze-release-management-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-release-management-line-10)">│</text><text class="breeze-release-management-r4" x="24.4" y="264" textLength="414.8" clip-path="url(#breeze-release-management-line-10)">prepare-airflow-distributions&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-release-management-r1" x="463.6" y="264" textLength="976" clip-path="url(#breeze-release-management-line-10)">Prepare&#160;sdist/whl& [...]
-</text><text class="breeze-release-management-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-release-management-line-11)">│</text><text class="breeze-release-management-r4" x="24.4" y="288.4" textLength="414.8" clip-path="url(#breeze-release-management-line-11)">prepare-airflow-tarball&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-release-management-r1" x="463.6" y="288.4" textLength="976" clip-path="url(#breeze-release-manageme [...]
+</text><text class="breeze-release-management-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-release-management-line-11)">│</text><text class="breeze-release-management-r4" x="24.4" y="288.4" textLength="414.8" clip-path="url(#breeze-release-management-line-11)">prepare-airflow-tarball&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-release-management-r1" x="463.6" y="288.4" textLength="976" clip-path="url(#breeze-release-manageme [...]
 </text><text class="breeze-release-management-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-release-management-line-12)">│</text><text class="breeze-release-management-r4" x="24.4" y="312.8" textLength="414.8" clip-path="url(#breeze-release-management-line-12)">start-rc-process&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-release-management-r1" x="463.6" y="312.8" textLength="976" clip [...]
 </text><text class="breeze-release-management-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-release-management-line-13)">│</text><text class="breeze-release-management-r4" x="24.4" y="337.2" textLength="414.8" clip-path="url(#breeze-release-management-line-13)">start-release&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-release-management-r1" x="463.6" y="337.2" textLe [...]
 </text><text class="breeze-release-management-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-release-management-line-14)">│</text><text class="breeze-release-management-r4" x="24.4" y="361.6" textLength="414.8" clip-path="url(#breeze-release-management-line-14)">release-prod-images&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-release-management-r1" x="463.6" y="361.6" textLength="976" clip-path="url(#bre [...]
diff --git a/dev/breeze/doc/images/output_release-management.txt b/dev/breeze/doc/images/output_release-management.txt
index 807d6884b2b..dd2b8109463 100644
--- a/dev/breeze/doc/images/output_release-management.txt
+++ b/dev/breeze/doc/images/output_release-management.txt
@@ -1 +1 @@
-2387270c0e14eb8ba7c5ff8c67b970aa
+316300f22446634fe904c57ec4f62d32
diff --git a/dev/breeze/doc/images/output_release-management_prepare-airflow-tarball.svg b/dev/breeze/doc/images/output_release-management_prepare-airflow-tarball.svg
index b298e8e694a..86482f53598 100644
--- a/dev/breeze/doc/images/output_release-management_prepare-airflow-tarball.svg
+++ b/dev/breeze/doc/images/output_release-management_prepare-airflow-tarball.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 440.4" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 489.2" xmlns="http://www.w3.org/2000/svg">
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -43,7 +43,7 @@
 
     <defs>
     <clipPath id="breeze-release-management-prepare-airflow-tarball-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="389.4" />
+      <rect x="0" y="0" width="1463.0" height="438.2" />
     </clipPath>
     <clipPath id="breeze-release-management-prepare-airflow-tarball-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -90,9 +90,15 @@
 <clipPath id="breeze-release-management-prepare-airflow-tarball-line-14">
     <rect x="0" y="343.1" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-release-management-prepare-airflow-tarball-line-15">
+    <rect x="0" y="367.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-prepare-airflow-tarball-line-16">
+    <rect x="0" y="391.9" 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="438.4" rx="8"/><text class="breeze-release-management-prepare-airflow-tarball-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;release-management&#160;prepare-airflow-tarball</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="487.2" rx="8"/><text class="breeze-release-management-prepare-airflow-tarball-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;release-management&#160;prepare-airflow-tarball</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -105,19 +111,21 @@
     <text class="breeze-release-management-prepare-airflow-tarball-r1" x="1464" y="20" textLength="12.2" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-0)">
 </text><text class="breeze-release-management-prepare-airflow-tarball-r2" x="12.2" y="44.4" textLength="73.2" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-1)">Usage:</text><text class="breeze-release-management-prepare-airflow-tarball-r3" x="97.6" y="44.4" textLength="597.8" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-1)">breeze&#160;release-management&#160;prepare-airflow-tarball</text><text class="breeze-release-management-prepare-ai [...]
 </text><text class="breeze-release-management-prepare-airflow-tarball-r1" x="1464" y="68.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-2)">
-</text><text class="breeze-release-management-prepare-airflow-tarball-r1" x="12.2" y="93.2" textLength="695.4" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-3)">Prepare&#160;airflow&#x27;s&#160;or&#160;airflow&#160;distribution&#160;source&#160;tarball.</text><text class="breeze-release-management-prepare-airflow-tarball-r1" x="1464" y="93.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-3)">
+</text><text class="breeze-release-management-prepare-airflow-tarball-r1" x="12.2" y="93.2" textLength="536.8" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-3)">Prepare&#160;Airflow&#160;distribution&#160;source&#160;tarball.</text><text class="breeze-release-management-prepare-airflow-tarball-r1" x="1464" y="93.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-3)">
 </text><text class="breeze-release-management-prepare-airflow-tarball-r1" x="1464" y="117.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-4)">
 </text><text class="breeze-release-management-prepare-airflow-tarball-r5" x="0" y="142" textLength="24.4" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-5)">╭─</text><text class="breeze-release-management-prepare-airflow-tarball-r5" x="24.4" y="142" textLength="183" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-5)">&#160;Package&#160;flags&#160;</text><text class="breeze-release-management-prepare-airflow-tarball-r5" x="207.4" y="142" text [...]
 </text><text class="breeze-release-management-prepare-airflow-tarball-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-6)">│</text><text class="breeze-release-management-prepare-airflow-tarball-r4" x="24.4" y="166.4" textLength="109.8" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-6)">--version</text><text class="breeze-release-management-prepare-airflow-tarball-r1" x="305" y="166.4" textLength="524.6" c [...]
-</text><text class="breeze-release-management-prepare-airflow-tarball-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-7)">│</text><text class="breeze-release-management-prepare-airflow-tarball-r4" x="24.4" y="190.8" textLength="231.8" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-7)">--distribution-name</text><text class="breeze-release-management-prepare-airflow-tarball-r1" x="305" y="190.8" textLength [...]
-</text><text class="breeze-release-management-prepare-airflow-tarball-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-8)">│</text><text class="breeze-release-management-prepare-airflow-tarball-r4" x="24.4" y="215.2" textLength="61" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-8)">--tag</text><text class="breeze-release-management-prepare-airflow-tarball-r1" x="305" y="215.2" textLength="1122.4" clip-pa [...]
-</text><text class="breeze-release-management-prepare-airflow-tarball-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-9)">│</text><text class="breeze-release-management-prepare-airflow-tarball-r6" x="305" y="239.6" textLength="1122.4" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-9)">(TEXT)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
-</text><text class="breeze-release-management-prepare-airflow-tarball-r5" x="0" y="264" textLength="1464" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-10)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-prepare-airflow-tarball-r1" x="1464" y="264" textLength="12.2" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-10)">
-</text><text class="breeze-release-management-prepare-airflow-tarball-r5" x="0" y="288.4" textLength="24.4" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-11)">╭─</text><text class="breeze-release-management-prepare-airflow-tarball-r5" x="24.4" y="288.4" textLength="195.2" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-11)">&#160;Common&#160;options&#160;</text><text class="breeze-release-management-prepare-airflow-tarball-r5" x="219.6" y=" [...]
-</text><text class="breeze-release-management-prepare-airflow-tarball-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-12)">│</text><text class="breeze-release-management-prepare-airflow-tarball-r4" x="24.4" y="312.8" textLength="109.8" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-12)">--dry-run</text><text class="breeze-release-management-prepare-airflow-tarball-r7" x="158.6" y="312.8" textLength="24.4 [...]
-</text><text class="breeze-release-management-prepare-airflow-tarball-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-13)">│</text><text class="breeze-release-management-prepare-airflow-tarball-r4" x="24.4" y="337.2" textLength="109.8" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-13)">--verbose</text><text class="breeze-release-management-prepare-airflow-tarball-r7" x="158.6" y="337.2" textLength="24.4 [...]
-</text><text class="breeze-release-management-prepare-airflow-tarball-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-14)">│</text><text class="breeze-release-management-prepare-airflow-tarball-r4" x="24.4" y="361.6" textLength="73.2" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-14)">--help</text><text class="breeze-release-management-prepare-airflow-tarball-r7" x="158.6" y="361.6" textLength="24.4" cl [...]
-</text><text class="breeze-release-management-prepare-airflow-tarball-r5" x="0" y="386" textLength="1464" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-15)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-prepare-airflow-tarball-r1" x="1464" y="386" textLength="12.2" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-15)">
+</text><text class="breeze-release-management-prepare-airflow-tarball-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-7)">│</text><text class="breeze-release-management-prepare-airflow-tarball-r4" x="24.4" y="190.8" textLength="231.8" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-7)">--distribution-name</text><text class="breeze-release-management-prepare-airflow-tarball-r1" x="305" y="190.8" textLength [...]
+</text><text class="breeze-release-management-prepare-airflow-tarball-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-8)">│</text><text class="breeze-release-management-prepare-airflow-tarball-r6" x="305" y="215.2" textLength="1134.6" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-8)">(apache_airflow&#160;|&#160;apache_airflow_ctl&#160;|&#160;apache_airflow_providers&#160;|&#160;apache_airflow_task_sdk&# [...]
+</text><text class="breeze-release-management-prepare-airflow-tarball-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-9)">│</text><text class="breeze-release-management-prepare-airflow-tarball-r6" x="305" y="239.6" textLength="1134.6" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-9)">helm-chart)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&# [...]
+</text><text class="breeze-release-management-prepare-airflow-tarball-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-10)">│</text><text class="breeze-release-management-prepare-airflow-tarball-r4" x="24.4" y="264" textLength="61" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-10)">--tag</text><text class="breeze-release-management-prepare-airflow-tarball-r1" x="305" y="264" textLength="1122.4" clip-path=" [...]
+</text><text class="breeze-release-management-prepare-airflow-tarball-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-11)">│</text><text class="breeze-release-management-prepare-airflow-tarball-r6" x="305" y="288.4" textLength="1122.4" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-11)">(TEXT)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="breeze-release-management-prepare-airflow-tarball-r5" x="0" y="312.8" textLength="1464" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-12)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-prepare-airflow-tarball-r1" x="1464" y="312.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-12)">
+</text><text class="breeze-release-management-prepare-airflow-tarball-r5" x="0" y="337.2" textLength="24.4" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-13)">╭─</text><text class="breeze-release-management-prepare-airflow-tarball-r5" x="24.4" y="337.2" textLength="195.2" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-13)">&#160;Common&#160;options&#160;</text><text class="breeze-release-management-prepare-airflow-tarball-r5" x="219.6" y=" [...]
+</text><text class="breeze-release-management-prepare-airflow-tarball-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-14)">│</text><text class="breeze-release-management-prepare-airflow-tarball-r4" x="24.4" y="361.6" textLength="109.8" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-14)">--dry-run</text><text class="breeze-release-management-prepare-airflow-tarball-r7" x="158.6" y="361.6" textLength="24.4 [...]
+</text><text class="breeze-release-management-prepare-airflow-tarball-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-15)">│</text><text class="breeze-release-management-prepare-airflow-tarball-r4" x="24.4" y="386" textLength="109.8" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-15)">--verbose</text><text class="breeze-release-management-prepare-airflow-tarball-r7" x="158.6" y="386" textLength="24.4" clip [...]
+</text><text class="breeze-release-management-prepare-airflow-tarball-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-16)">│</text><text class="breeze-release-management-prepare-airflow-tarball-r4" x="24.4" y="410.4" textLength="73.2" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-16)">--help</text><text class="breeze-release-management-prepare-airflow-tarball-r7" x="158.6" y="410.4" textLength="24.4" cl [...]
+</text><text class="breeze-release-management-prepare-airflow-tarball-r5" x="0" y="434.8" textLength="1464" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-17)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-prepare-airflow-tarball-r1" x="1464" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-17)">
 </text>
     </g>
     </g>
diff --git a/dev/breeze/doc/images/output_release-management_prepare-airflow-tarball.txt b/dev/breeze/doc/images/output_release-management_prepare-airflow-tarball.txt
index 1f782aecabc..33741b14638 100644
--- a/dev/breeze/doc/images/output_release-management_prepare-airflow-tarball.txt
+++ b/dev/breeze/doc/images/output_release-management_prepare-airflow-tarball.txt
@@ -1 +1 @@
-d6bd14bc9e4d7bd1f6fb5b9b3272a3a1
+672fd22525258a12e220cc3e59bf80a8
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 247a3ab35e6..83e4f8f00d8 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_candidate_command.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_candidate_command.py
@@ -34,6 +34,7 @@ from airflow_breeze.global_constants import (
 )
 from airflow_breeze.utils.confirm import confirm_action
 from airflow_breeze.utils.console import console_print
+from airflow_breeze.utils.custom_param_types import BetterChoice
 from airflow_breeze.utils.path_utils import (
     AIRFLOW_DIST_PATH,
     AIRFLOW_ROOT_PATH,
@@ -295,7 +296,9 @@ def tarball_release(
 
 def create_tarball_release(
     version: str,
-    distribution_name: Literal["airflow", "task-sdk", "providers", "airflowctl"],
+    distribution_name: Literal[
+        "apache_airflow", "apache_airflow_task_sdk", "apache_airflow_providers", "apache_airflow_ctl"
+    ],
     tag: str | None,
 ):
     from packaging.version import Version
@@ -582,13 +585,15 @@ def remove_old_releases(version, repo_root):
 
 @release_management.command(
     name="prepare-airflow-tarball",
-    help="Prepare airflow's or airflow distribution source tarball.",
+    help="Prepare Airflow distribution source tarball.",
 )
 @click.option("--version", help="The release candidate version e.g. 2.4.3rc1", envvar="VERSION")
 @click.option(
     "--distribution-name",
     default="airflow",
-    help="The distribution name, airflow, task-sdk, providers, airflowctl",
+    type=BetterChoice(sorted([e.value for e in DistributionType])),
+    envvar="DISTRIBUTION_NAME",
+    help="The distribution name",
 )
 @click.option(
     "--tag",
@@ -599,7 +604,9 @@ def remove_old_releases(version, repo_root):
 @option_verbose
 def prepare_airflow_tarball(
     version: str,
-    distribution_name: Literal["airflow", "task-sdk", "providers", "airflowctl"],
+    distribution_name: Literal[
+        "apache_airflow", "apache_airflow_task_sdk", "apache_airflow_providers", "apache_airflow_ctl"
+    ],
     tag: str | None,
 ):
     create_tarball_release(
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 748b0aa3262..a8c4259176f 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
@@ -540,7 +540,9 @@ def _check_sdist_to_wheel(python_path: Path, dist_info: DistributionPackageInfo,
 
 def create_tarball_from_tag(
     version_suffix: str,
-    distribution_name: Literal["airflow", "task-sdk", "providers", "airflowctl"],
+    distribution_name: Literal[
+        "apache_airflow", "apache_airflow_task_sdk", "apache_airflow_providers", "apache_airflow_ctl"
+    ],
     tag: str | None,
 ):
     if tag is not None:
@@ -603,7 +605,7 @@ def prepare_airflow_distributions(
     # Create the tarball if tag is provided
     create_tarball_from_tag(
         version_suffix=version_suffix,
-        distribution_name="airflow",
+        distribution_name="apache_airflow",
         tag=tag,
     )
 
@@ -757,7 +759,7 @@ def prepare_task_sdk_distributions(
     # Create the tarball if tag is provided
     create_tarball_from_tag(
         version_suffix=version_suffix,
-        distribution_name="task-sdk",
+        distribution_name="apache_airflow_task_sdk",
         tag=tag,
     )
 
@@ -795,7 +797,7 @@ def prepare_airflow_ctl_distributions(
     # Create the tarball if tag is provided
     create_tarball_from_tag(
         version_suffix=version_suffix,
-        distribution_name="airflowctl",
+        distribution_name="apache_airflow_ctl",
         tag=tag,
     )
 
@@ -1195,7 +1197,7 @@ def prepare_provider_distributions(
     # Create the tarball if tag is provided
     create_tarball_from_tag(
         version_suffix=version_suffix,
-        distribution_name="providers",
+        distribution_name="apache_airflow_providers",
         tag=tag,
     )
 
diff --git a/dev/breeze/src/airflow_breeze/global_constants.py b/dev/breeze/src/airflow_breeze/global_constants.py
index cb225dfd8d6..4a92f0f8ada 100644
--- a/dev/breeze/src/airflow_breeze/global_constants.py
+++ b/dev/breeze/src/airflow_breeze/global_constants.py
@@ -235,10 +235,10 @@ REGULAR_DOC_PACKAGES = [
 
 # packages that are distributions of Airflow
 class DistributionType(Enum):
-    AIRFLOW_CORE = "airflow"
-    PROVIDERS = "providers"
-    TASK_SDK = "task-sdk"
-    AIRFLOW_CTL = "airflowctl"
+    AIRFLOW_CORE = "apache_airflow"
+    PROVIDERS = "apache_airflow_providers"
+    TASK_SDK = "apache_airflow_task_sdk"
+    AIRFLOW_CTL = "apache_airflow_ctl"
     HELM_CHART = "helm-chart"