+1 (binding) - Checked SVN, Checksums, Reproducible package build, Licenses, Signatures

Note that "Reproducible package build" had the same small diff on my side discovered by diffoscope, not worth rejecting release. Just one bracked as diff.

On 28.10.25 17:57, Kaxil Naik wrote:
Still waiting on one more binding vote here.

On Tue, 28 Oct 2025 at 00:03, Jarek Potiuk <[email protected]> wrote:

Quick reproducibility protection:
https://github.com/apache/airflow/pull/57390

On Tue, Oct 28, 2025 at 12:34 AM Kaxil Naik <[email protected]> wrote:

Yeah I do use Py 3.10 as default for breeze.

On Mon, 27 Oct 2025 at 15:31, Jarek Potiuk <[email protected]> wrote:

Same diff :(). Tried on a different machine.

Interestingly enough the PR added by you 4 days ago also contains the
addition of the parentheses


https://github.com/apache/airflow-client-python/commit/241405e219eb76e9b43791466f3f4ed27d65a51a#diff-94fc09b38b570968d70d17aeb197363aefe1925a87a37b213b69b75ee2f4a357R65

We used fixed versions of all tools in the dockerfile.
And fix openapi generator: 7.13.0

First I found is that Python 3.10.19 image (previoulsly 3.10.18) has
been
released 4 days ago. I checked and used older version of Python 3.10 -
and
it was not it.

But then I found the reason. We are running patching of
trigger_dag_run_post_body.py in breeze. And there we are using AST:

         source = TRIGGER_MODEL_PATH.read_text(encoding="utf-8")
         tree = ast.parse(source)
         LogicalDateDictPatch().visit(tree)
         ast.fix_missing_locations(tree)
         TRIGGER_MODEL_PATH.write_text(ast.unparse(tree),
encoding="utf-8")
This code is run in breeze, and when your breeze is installed with
python
3.10 it produces (), when you use 3.11+ to install breeze, it does not
add
the parentheses when "unparsing". So I guess your breeze is installed
with
Python 3.10.
You can check it with

uv tool list --show-python # will show you the python version used for
breeze

Then:


uv tool install -e ./dev/breeze --python python3.10
breeze release-management prepare-python-client --distribution-format
both
Followed by:

uv tool install -e ./dev/breeze --python python3.11
breeze release-management prepare-python-client --distribution-format
both
Will roduce .tar.gz files will differ by the extra () in Python 3.10
(you
can compare it with the "asf-dist" file with `diffoscope`

Very interesting case - just in time for the Reproducible Build Summit
:D.
And it also means that's it's a good idea that all our "manipulation"
of
the code runs inside the Dockerfile. not directly in Breeze (there
Python
version is fixed - to default version). i will fix it soon.

J.






On Mon, Oct 27, 2025 at 12:04 PM Kaxil Naik <[email protected]>
wrote:
Could you try the following from the Airflow repo:

git checkout python-client/3.1.0rc1
breeze release-management prepare-python-client --distribution-format
both
--python-client-repo "${CLIENT_REPO_ROOT}" --version-suffix ""

On Mon, 27 Oct 2025 at 08:31, Jarek Potiuk <[email protected]> wrote:

Kaxil - it would be good to know how you generated the client to
get
there
and fix the reproducibility issue.

BTW. Very related thing -  I am going tonight to Vienna for two
days
to
take part in the "Reproducible Builds Summit"


https://reproducible-builds.org/news/2025/08/20/reproducible-builds-summit-in-vienna/
-> with the goal to make our builds permanently reproducible and
following
some emerging standards of reproducibility (there are things
brewing
and
the Summit is the place where things are not only talked but also
there
are
some workshops where I will attempt to apply those things I will
learn).
This will be extremely useful in the near future, when Apache
Trusted
Releases (


https://news.apache.org/foundation/entry/apache-trusted-releases-platform-begins-second-alpha
)
gets out of Alpha status - because having fully reproducible builds
is
the
prerequisite to release our software automatically via ASF-managed
build
infrastructure. This will mean that our releases will not only be
safer
and more secure, but will also have cryptographic attestations of
both
-
source provenance and managed and verified build process.

This is something that will make Airflow one of the first projects
in
the
ASF to make sort of a "golden standard" for supply-chain attack
prevention
(following the recent outbreak of things like xz (
https://en.wikipedia.org/wiki/XZ_Utils_backdoor), or more recent
shai-hulud
attack - self-replicating worm attacking 180+ packages (

https://www.trendmicro.com/en_us/research/25/i/npm-supply-chain-attack.html
).

We are also working in the security team to tighten our security
for
our
dependencies at release time as part of that effort.

J.


On Mon, Oct 27, 2025 at 9:17 AM Jarek Potiuk <[email protected]>
wrote:
+1 (binding): checked reproducibility, signatures, checksums
(licences
not
needed as we are using already checked and released "airflow"
sources
to
generate all client code).

I think there is a bit of discrepancy between the tag and
release.
I
run
a
reproducibility check and the code is slightly different (both
.sdist
and
whl are different).

├── apache_airflow_client-3.1.0.tar
│ ├── file list
│ │ @@ -164,15 +164,15 @@
│ │  -rw-r--r--   0        0        0     7140 2025-09-23
20:07:31.000000
apache_airflow_client-3.1.0/airflow_client/client/models/task_instance_response.py
│ │  -rw-r--r--   0        0        0     1374 2025-09-23
20:07:31.000000
apache_airflow_client-3.1.0/airflow_client/client/models/task_instance_state.py
│ │  -rw-r--r--   0        0        0     6436 2025-09-23
20:07:31.000000
apache_airflow_client-3.1.0/airflow_client/client/models/task_instances_batch_body.py
│ │  -rw-r--r--   0        0        0     3152 2025-09-23
20:07:31.000000
apache_airflow_client-3.1.0/airflow_client/client/models/task_instances_log_response.py
│ │  -rw-r--r--   0        0        0     3019 2025-09-23
20:07:31.000000
apache_airflow_client-3.1.0/airflow_client/client/models/task_outlet_asset_reference.py
│ │  -rw-r--r--   0        0        0     6362 2025-09-23
20:07:31.000000
apache_airflow_client-3.1.0/airflow_client/client/models/task_response.py
│ │  -rw-r--r--   0        0        0     3083 2025-09-23
20:07:31.000000
apache_airflow_client-3.1.0/airflow_client/client/models/time_delta.py
│ │ --rw-r--r--   0        0        0     3641 2025-09-23
20:07:31.000000
apache_airflow_client-3.1.0/airflow_client/client/models/trigger_dag_run_post_body.py
│ │ +-rw-r--r--   0        0        0     3639 2025-09-23
20:07:31.000000
apache_airflow_client-3.1.0/airflow_client/client/models/trigger_dag_run_post_body.py
│ │  -rw-r--r--   0        0        0     3101 2025-09-23
20:07:31.000000
apache_airflow_client-3.1.0/airflow_client/client/models/trigger_response.py
│ │  -rw-r--r--   0        0        0     2920 2025-09-23
20:07:31.000000
apache_airflow_client-3.1.0/airflow_client/client/models/triggerer_info_response.py
│ │  -rw-r--r--   0        0        0     2997 2025-09-23
20:07:31.000000
apache_airflow_client-3.1.0/airflow_client/client/models/update_hitl_detail_payload.py
│ │  -rw-r--r--   0        0        0     3299 2025-09-23
20:07:31.000000
apache_airflow_client-3.1.0/airflow_client/client/models/validation_error.py
│ │  -rw-r--r--   0        0        0     5081 2025-09-23
20:07:31.000000
apache_airflow_client-3.1.0/airflow_client/client/models/validation_error_loc_inner.py
│ │  -rw-r--r--   0        0        0     5140 2025-09-23
20:07:31.000000
apache_airflow_client-3.1.0/airflow_client/client/models/value.py
│ │  -rw-r--r--   0        0        0     3159 2025-09-23
20:07:31.000000
apache_airflow_client-3.1.0/airflow_client/client/models/variable_body.py
│ ├──

apache_airflow_client-3.1.0/airflow_client/client/models/trigger_dag_run_post_body.py
│ │ @@ -58,15 +58,15 @@
│ │          * Fields in `self.additional_properties` are added
to
the
output dict.
│ │          """
│ │          excluded_fields: Set[str] =
set(['additional_properties'])
│ │          _dict = self.model_dump(by_alias=True,
exclude=excluded_fields, exclude_none=True)
│ │          if 'logical_date' not in _dict:
│ │              _dict['logical_date'] = None
│ │          if self.additional_properties is not None:
│ │ -            for (_key, _value) in
self.additional_properties.items():
│ │ +            for _key, _value in
self.additional_properties.items():
│ │                  _dict[_key] = _value
│ │          return _dict
│ │
│ │      @classmethod
│ │      def from_dict(cls, obj: Optional[Dict[str, Any]]) ->
Optional[Self]:
│ │          """Create an instance of TriggerDAGRunPostBody from
a
dict"""
│ │          if obj is None:

I am not sure how the client was generated - and where the
difference
came
from - either different generator or our post-processing code (we
post-process the generated code to fix some of the generator
issues
->
https://github.com/apache/airflow/pull/50704 - or maybe that is
a
"black/ruff" formatting issue with different version of
ruff/black
used? But the difference is insignificant enough and easily
manually
verifiable, so that's not a reason for -1 (reproducibility for
now
is
optional check that can be followed by inspecting the
differences).
J.


On Mon, Oct 27, 2025 at 2:16 AM Kaxil Naik <[email protected]>
wrote:
Aah, yes thanks Jens. Files have been pushed.

On Sun, 26 Oct 2025 at 18:00, Jarek Potiuk <[email protected]>
wrote:
Ah.. I missed this one. Yeah - we need those.

On Sun, Oct 26, 2025 at 6:56 PM Jens Scheffler <
[email protected]
wrote:

Hi Kaxil,

finally wanted to make my PMC duties and check release but
needed
to
realize that ASC and SHA512 files are missing/not uploaded.
Can
you
please push them to SVN for validation?

Jens

On 22.10.25 22:26, Kaxil Naik wrote:
Hey fellow Airflowers,

I have cut the first release candidate for the Apache
Airflow
Python
Client
   3.1.0.
This email is calling for a vote on the release,
which will last for 72 hours. Consider this my (binding)
+1.
Airflow Client 3.1.0rc1 is available at:

https://dist.apache.org/repos/dist/dev/airflow/clients/python/3.1.0rc1/
The apache_airflow_client-3.1.0.tar.gz is an sdist release
that
contains
INSTALL instructions, and also
is the official source release.

The apache_airflow_client-3.1.0-py3-none-any.whl is a
binary
wheel
release
that pip can install.

Those packages do not contain .rc* version as, when
approved,
they
will
be
released as the final version.

The rc packages are also available at PyPI (with rc
suffix)
and
you
can
install it with pip as usual:
https://pypi.org/project/apache-airflow-client/3.1.0rc1/

Public keys are available at:
https://dist.apache.org/repos/dist/release/airflow/KEYS

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_PYTHON_CLIENT.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_PYTHON_CLIENT.md#verify-the-release-candidate-by-contributors
*Changelog*:
https://github.com/apache/airflow-client-python
/blob/3.1.0rc1/CHANGELOG.md

Regards,
Kaxil


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to