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 31f3ad90157 Fix apache-airflow-mypy release docs to match ASF dist 
conventions (#68332)
31f3ad90157 is described below

commit 31f3ad9015759115a7fd22451a9c409254c8ab90
Author: Hussein Awala <[email protected]>
AuthorDate: Wed Jun 10 18:48:31 2026 +0200

    Fix apache-airflow-mypy release docs to match ASF dist conventions (#68332)
    
    The SVN/asf-dist artifacts must use the final version (no rc suffix) and
    live under apache-airflow-mypy/<version>rc<rc>/, matching airflow-ctl and
    helm-chart. Release candidates go to PyPI (not TestPyPI). Also split the
    verification guidance into PMC members and Contributors sections.
---
 dev/README_RELEASE_MYPY.md | 159 ++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 135 insertions(+), 24 deletions(-)

diff --git a/dev/README_RELEASE_MYPY.md b/dev/README_RELEASE_MYPY.md
index bf0e378b618..e2b956c460c 100644
--- a/dev/README_RELEASE_MYPY.md
+++ b/dev/README_RELEASE_MYPY.md
@@ -32,7 +32,8 @@
   - [Commit the source packages to Apache SVN 
repo](#commit-the-source-packages-to-apache-svn-repo)
   - [Publish the distributions to PyPI (release 
candidates)](#publish-the-distributions-to-pypi-release-candidates)
   - [Prepare voting email](#prepare-voting-email)
-  - [Verify the release candidate](#verify-the-release-candidate)
+  - [Verify the release candidate by PMC 
members](#verify-the-release-candidate-by-pmc-members)
+  - [Verify the release candidate by 
Contributors](#verify-the-release-candidate-by-contributors)
 - [Publish release](#publish-release)
   - [Summarize the voting](#summarize-the-voting)
   - [Publish release to SVN](#publish-release-to-svn)
@@ -90,14 +91,20 @@ Review and edit the generated release notes as needed.
 
 ## Build apache-airflow-mypy distributions for SVN apache upload
 
-The Release Manager can use the `breeze` tool to build the package:
+The distributions uploaded to the ASF dist SVN repo might get promoted to 
"final" packages by just
+renaming the files, so internally they should keep the final version number 
**without** the rc suffix,
+even if they are rc1/rc2/... candidates. Build them without a version suffix:
 
 ```bash
 breeze release-management prepare-mypy-distributions \
     --distribution-format both \
-    --version-suffix rc1
+    --version-suffix ""
 ```
 
+This produces `apache_airflow_mypy-<VERSION>-py3-none-any.whl` and 
`apache_airflow_mypy-<VERSION>.tar.gz`
+(no `rc` in the file names or internal metadata). The rc-suffixed packages are 
built separately for PyPI
+(see [Publish the distributions to 
PyPI](#publish-the-distributions-to-pypi-release-candidates)).
+
 ## Build and sign the source and convenience packages
 
 Follow the same signing process as other Airflow packages:
@@ -121,16 +128,44 @@ git push origin apache-airflow-mypy-<VERSION>rc<RC>
 
 ## Commit the source packages to Apache SVN repo
 
-Follow the standard Apache release process for committing to the SVN 
repository.
+Upload the (non-suffixed) artifacts to the ASF dev dist repo under the
+`apache-airflow-mypy/<VERSION>rc<RC>/` directory (the project has its own
+group directory, the version-rc string is the folder name):
+
+```bash
+# Check out the dev dist area (shallow) if you do not have it yet
+svn checkout --depth=immediates https://dist.apache.org/repos/dist/dev/airflow 
asf-dist-dev-airflow
+cd asf-dist-dev-airflow
+
+# Create the group/version-rc folder and move the signed artifacts in
+mkdir -p apache-airflow-mypy/<VERSION>rc<RC>
+mv ${AIRFLOW_REPO_ROOT}/dist/apache_airflow_mypy-<VERSION>* 
apache-airflow-mypy/<VERSION>rc<RC>/
+
+# Remove any previous release candidate folders for this version
+svn rm apache-airflow-mypy/<old-rc-folders>   # if applicable
+
+svn add apache-airflow-mypy
+svn commit -m "Add artifacts for Apache Airflow Mypy <VERSION>rc<RC>"
+```
+
+Verify the files appear at
+https://dist.apache.org/repos/dist/dev/airflow/apache-airflow-mypy/<VERSION>rc<RC>/
 
 ## Publish the distributions to PyPI (release candidates)
 
-Release candidates should be published to TestPyPI first:
+Release candidates are published to PyPI as pre-releases (not TestPyPI), so 
voters can install them
+directly with `pip install --pre`. These are **different** packages than the 
ones uploaded to SVN: they
+carry the `rc` suffix, so build them with `--version-suffix rc<RC>`:
 
 ```bash
-twine upload --repository testpypi dist/apache_airflow_mypy-<VERSION>rc<RC>*
+breeze release-management prepare-mypy-distributions \
+    --distribution-format both \
+    --version-suffix rc<RC>
+twine upload dist/apache_airflow_mypy-<VERSION>rc<RC>*
 ```
 
+Use a short-lived (throw-away) PyPI API token for the upload and delete it 
afterwards.
+
 ## Prepare voting email
 
 Send a voting email to [email protected] with the following template:
@@ -143,10 +178,17 @@ Hello Apache Airflow Community,
 This is a call for the vote to release Apache Airflow Mypy version <VERSION>.
 
 The release candidate is available at:
-https://dist.apache.org/repos/dist/dev/airflow/apache-airflow-mypy-<VERSION>rc<RC>/
+https://dist.apache.org/repos/dist/dev/airflow/apache-airflow-mypy/<VERSION>rc<RC>/
 
-The packages are available at TestPyPI:
-https://test.pypi.org/project/apache-airflow-mypy/<VERSION>rc<RC>/
+The packages are available at PyPI:
+https://pypi.org/project/apache-airflow-mypy/<VERSION>rc<RC>/
+
+You can install the release candidate with:
+
+    pip install --pre apache-airflow-mypy==<VERSION>rc<RC>
+
+Public keys are available at:
+https://dist.apache.org/repos/dist/release/airflow/KEYS
 
 The vote will be open for at least 72 hours.
 
@@ -160,24 +202,92 @@ Best regards,
 <YOUR NAME>
 ```
 
-## Verify the release candidate
+## Verify the release candidate by PMC members
+
+PMC members should verify the integrity and provenance of the SVN artifacts 
before casting a binding
+vote. The files live at
+https://dist.apache.org/repos/dist/dev/airflow/apache-airflow-mypy/<VERSION>rc<RC>/
+and are versioned without the `rc` suffix (`apache_airflow_mypy-<VERSION>-*`).
+
+### SVN check
+
+Check out the candidate and confirm the expected 6 files are present 
(`.tar.gz` and
+`-py3-none-any.whl`, each with `.asc` + `.sha512`):
+
+```shell script
+svn co 
https://dist.apache.org/repos/dist/dev/airflow/apache-airflow-mypy/<VERSION>rc<RC>
 mypy-rc
+cd mypy-rc
+ls -1
+```
+
+### Signature check
+
+Import the Airflow KEYS file (it must contain the Release Manager's key) and 
verify each signature:
+
+```shell script
+curl -fsS https://dist.apache.org/repos/dist/release/airflow/KEYS | gpg 
--import
+for i in *.asc; do echo "Checking $i"; gpg --verify "$i"; done
+```
+
+You should see `Good signature from ...` for each file.
+
+### SHA512 check
+
+```shell script
+for i in *.sha512; do echo "Checking $i"; shasum -a 512 "$(basename "$i" 
.sha512)" | diff - "$i"; done
+```
+
+### Version check
+
+Confirm the version embedded in the artifacts is the final version, with no 
`rc` suffix:
+
+```shell script
+unzip -p apache_airflow_mypy-<VERSION>-py3-none-any.whl '*.dist-info/METADATA' 
| grep '^Version:'
+tar -xzOf apache_airflow_mypy-<VERSION>.tar.gz '*/PKG-INFO' | grep '^Version:'
+```
+
+### Reproducible package builds check
+
+Rebuild the packages from the tagged source and confirm they are 
byte-identical to the SVN ones:
+
+```shell script
+cd ${AIRFLOW_REPO_ROOT}
+git fetch apache --tags --force
+git checkout apache-airflow-mypy-<VERSION>rc<RC>
+rm -rf dist/*
+breeze release-management prepare-mypy-distributions --distribution-format 
both --version-suffix ""
+for i in apache_airflow_mypy-<VERSION>*.tar.gz 
apache_airflow_mypy-<VERSION>*.whl; do
+    echo -n "$i: "; diff "${PATH_TO_MYPY_RC}/$i" "dist/$i" && echo "No diff 
found"
+done
+```
+
+### Licence check
+
+Run the Apache RAT tool against the unpacked sdist (download the jar from
+https://creadur.apache.org/rat/download_rat.cgi). There should be no files 
reported as Unknown or
+Unapproved.
 
-Verify the release by:
+## Verify the release candidate by Contributors
 
-1. Installing from TestPyPI:
+Contributors (and especially actual users) are encouraged to test the release 
candidate functionally.
+Each candidate is published to PyPI as a pre-release, so anyone can install it:
 
-   ```bash
-   pip install --index-url https://test.pypi.org/simple/ 
apache-airflow-mypy==<VERSION>rc<RC>
-   ```
+### Installing in your local virtualenv
 
-2. Testing the plugins in a mypy configuration:
+```shell script
+pip install --pre apache-airflow-mypy==<VERSION>rc<RC>
+```
 
-   ```ini
-   [mypy]
-   plugins = airflow_mypy.plugins.decorators, airflow_mypy.plugins.outputs
-   ```
+### Testing the plugins
+
+Add the plugins to your mypy configuration and run mypy against your code base:
+
+```ini
+[mypy]
+plugins = airflow_mypy.plugins.decorators, airflow_mypy.plugins.outputs
+```
 
-3. Running the test suite if available
+Run the test suite if available, and perform any additional verification you 
see as necessary.
 
 # Publish release
 
@@ -187,11 +297,12 @@ Once the vote passes, summarize the results in a reply to 
the voting thread.
 
 ## Publish release to SVN
 
-Move the release from dev to release in SVN:
+Move the release from dev to release in SVN. Because the artifacts are already 
versioned without the
+`rc` suffix, promotion is a simple move of the version-rc folder to the final 
version folder:
 
 ```bash
-svn mv 
https://dist.apache.org/repos/dist/dev/airflow/apache-airflow-mypy-<VERSION>rc<RC>
 \
-       
https://dist.apache.org/repos/dist/release/airflow/apache-airflow-mypy-<VERSION>
 \
+svn mv 
https://dist.apache.org/repos/dist/dev/airflow/apache-airflow-mypy/<VERSION>rc<RC>
 \
+       
https://dist.apache.org/repos/dist/release/airflow/apache-airflow-mypy/<VERSION>
 \
        -m "Release Apache Airflow Mypy <VERSION>"
 ```
 

Reply via email to