-
-
Notifications
You must be signed in to change notification settings - Fork 659
feat: add py_zipapp_binary and test rules for zipapp support #3539
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
Summary of ChangesHello @rickeylev, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request introduces a comprehensive overhaul of Python zip application (zipapp) support within the Bazel rules. By extracting zipapp creation into new, dedicated Highlights
🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console. Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code Review
This pull request introduces a significant new feature: dedicated rules for creating Python zipapps (py_zipapp_binary and py_zipapp_test). This is a substantial refactoring that moves zipapp creation logic out of the generic py_binary rule, improving modularity and adding features like explicit compression control and enhanced determinism. The changes are extensive, touching many parts of the Python rules, including common utilities, executable creation, and providers. The new tooling for zipping and creating executables is well-designed and thoroughly tested.
Overall, the implementation is of high quality. However, I've identified a couple of critical issues in the new macros that would lead to build failures due to missing imports. I've also found a logic bug in a shell script template that affects a debugging feature. I've provided suggestions to fix these issues. The rest of the changes, including the refactoring of runfiles handling and the new actions_run helper, are excellent improvements.
74ff6b0 to
7ac5c39
Compare
7ac5c39 to
149a840
Compare
…into refactor.pyzipapp
…into refactor.pyzipapp
…into refactor.pyzipapp
|
@gemini-code-assist review |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code Review
This pull request introduces py_zipapp_binary and py_zipapp_test rules, a significant enhancement for Python zipapp support that will eventually replace the existing logic within py_binary. The changes are extensive, refactoring core py_executable logic to expose more details for packaging, adding new tools for zip creation, and including a comprehensive set of tests. The implementation is well-structured, with new logic cleanly organized into a new zipapp package. I've identified a couple of potential issues with argument handling that could cause build failures in certain edge cases, but overall, this is an excellent and valuable addition to rules_python.
|
OK, ready for review. PTAL |
…into refactor.pyzipapp
aignas
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In general LGTM. Thank you for easy to read code!
| return "rf-file|" + _is_symlink(file) + "|" + file.short_path + "|" + file.path | ||
|
|
||
| def _map_zip_symlinks(entry): | ||
| return "rf-symlink|" + _is_symlink(entry.target_file) + "|" + entry.path + "|" + entry.target_file.path |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: I remember that "%s" % "foo" being faster than "{}".format. Is + even better to use than "%s" or are they equivalent?
| def _create_self_executable_zip(ctx, preamble, zip_file): | ||
| pyz = ctx.actions.declare_file(ctx.label.name + ".pyz") | ||
| args = ctx.actions.args() | ||
| args.add(preamble) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: why not use add_all?
|
|
||
| py_zipapp_binary = rule( | ||
| doc = """ | ||
| Packages a `py_binary` as a Python zipapp. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is the zipapp the same as https://docs.python.org/3/library/zipapp.html?
| exec_runtime = ( | ||
| ctx.toolchains["@rules_python//python:exec_tools_toolchain_type"]. | ||
| exec_tools.exec_interpreter[platform_common.ToolchainInfo].py3_runtime | ||
| ) | ||
| ``` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is a great addition!
|
|
||
| # NOTE: Using ctx.actions.symlink() here doesn't always work with RBE | ||
| # because it's not guaranteed that it will materialize as a symlink, but | ||
| # we rely on it being a symlink so that Python can find its actual |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
what does this mean to me as a maintainer. Do some RBE implementation not work with our code? Does it not work sometimes? Do we have the RBE support for this disabled because of this?
| @@ -0,0 +1,40 @@ | |||
| import hashlib | |||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this private to the zipapp? I would personally have it in python/private/zipapp/exe_zip_maker.py until somebody comes along and asks for this to be exposed.
| @@ -0,0 +1,230 @@ | |||
| import argparse | |||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ditto
| that are associated with the target's `srcs` are present. | ||
| ([#3354](https://github.com/bazel-contrib/rules_python/issues/3354)). | ||
| * (zipapp) {obj}`py_zipapp_binary` and {obj}`py_zipapp_test` rules added. These | ||
| will replace `--build_python_zip` and the zip output group of |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
when do you want to replace these? Next major version? Should we add some deprecation messages?
| py_zipapp_binary( | ||
| name = "system_python_zipapp", | ||
| binary = ":system_python_bin", | ||
| target_compatible_with = NOT_WINDOWS, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What about windows and zipapps? If I understand correctly, Windows most of the time is building zips under the hood?
It would be good to have a comment somewhere about plans/strategy of this.
This adds Python zipapp support as a separate rule that works with a py_binary.
This will eventually replace the zipapp logic that is directly part of py_binary.
The high level behavior should be the same, but there's a few differences and improvements:
Changes:
{name}.pyzImprovements:
For now, this lacks Windows support for lack of time (it requires plumbing in the
"windows exe maker" stuff or equivalent for self-executable zip support).
Along the way:
--verbose_failuresin CI config to give more info when actions fail.--visible_for_testinga command line flag. This makes it a bit easier todebug toolchain issues by showing the source of the toolchain.
actions_runhelper: this makes it easier to use py scripts as build actions.Work towards #3324 #2586