Add release script for a2ui python agent#1056
Conversation
There was a problem hiding this comment.
Code Review
This pull request introduces a release workflow for the Python SDK, adding a release.sh script and updating the README with deployment instructions. The review feedback focuses on improving the script's robustness and portability by suggesting the use of environment variables for configuration, isolated tool execution via uvx, handling non-interactive authentication failures, and ensuring proper cleanup of temporary files.
| # You may obtain a copy of the License at | ||
| # | ||
| # http://www.apache.org/licenses/LICENSE-2.0 | ||
| # | ||
| # Unless required by applicable law or agreed to in writing, software | ||
| # distributed under the License is distributed on an "AS IS" BASIS, |
There was a problem hiding this comment.
The project, repository, and GCS bucket names are hardcoded to production values. To make the script more flexible and testable (e.g., for dry runs or staging releases), consider allowing these to be overridden via environment variables with the current values as defaults.
| # You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, software | |
| # distributed under the License is distributed on an "AS IS" BASIS, | |
| PACKAGE_NAME="${PACKAGE_NAME:-a2ui-agent-sdk}" | |
| REPOSITORY="${REPOSITORY:-a2ui--pypi}" | |
| PROJECT="${PROJECT:-oss-exit-gate-prod}" | |
| LOCATION="${LOCATION:-us}" | |
| REPOSITORY_URL="${REPOSITORY_URL:-https://us-python.pkg.dev/${PROJECT}/${REPOSITORY}}" | |
| GCS_URI="${GCS_URI:-gs://oss-exit-gate-prod-projects-bucket/a2ui/pypi/manifests}" |
| # limitations under the License. | ||
|
|
There was a problem hiding this comment.
Using uv tool install modifies the user's global tool environment every time the script runs. For a release script, it is generally better to use uvx (or uv tool run) to execute these tools in a transient, isolated environment. This avoids polluting the user's global state and ensures the script is more self-contained.
| PROJECT="oss-exit-gate-prod" | ||
| LOCATION="us" | ||
| REPOSITORY_URL="https://us-python.pkg.dev/${PROJECT}/${REPOSITORY}" | ||
| GCS_URI="gs://oss-exit-gate-prod-projects-bucket/a2ui/pypi/manifests" |
There was a problem hiding this comment.
Importing the package to extract the version number can be fragile if the environment is not fully set up or if the package has side effects on import. Since the version is defined in a simple Python file, consider parsing it directly to avoid unnecessary execution.
| GCS_URI="gs://oss-exit-gate-prod-projects-bucket/a2ui/pypi/manifests" | |
| version=$(sed -n 's/__version__ = "\(.*\)"/\1/p' src/a2ui/version.py) |
|
|
||
| echo "--- Installing helper packages ---" | ||
| uv tool install twine --with keyrings.google-artifactregistry-auth --with keyring | ||
| uv tool install keyring --with keyrings.google-artifactregistry-auth |
There was a problem hiding this comment.
The command gcloud auth application-default login is interactive and will cause the script to hang or fail in non-interactive environments like CI/CD pipelines. It is better to exit with an error message instructing the user to authenticate if credentials are missing.
| uv tool install keyring --with keyrings.google-artifactregistry-auth | |
| echo "Error: Application Default Credentials not found. Please run 'gcloud auth application-default login'." >&2 | |
| exit 1 |
| twine --version | ||
| twine check dist/* | ||
|
|
||
| version=$(uv run python -c "import a2ui; print(a2ui.__version__)") |
There was a problem hiding this comment.
It is recommended to use the --non-interactive flag with twine upload to ensure the script fails immediately if authentication is not correctly configured, rather than waiting for user input.
| version=$(uv run python -c "import a2ui; print(a2ui.__version__)") | |
| twine upload --non-interactive --repository-url $REPOSITORY_URL dist/* |
|
|
||
| # Authenticate with Google Cloud | ||
| if ! gcloud auth application-default print-access-token --quiet > /dev/null; then | ||
| gcloud auth application-default login |
There was a problem hiding this comment.
The manifest.json file is created in the local directory but never removed. Consider adding a cleanup step to ensure temporary files are deleted after the script finishes.
| gcloud auth application-default login | |
| echo '{ "publish_all": true }' > manifest.json | |
| trap 'rm -f manifest.json' EXIT |
|
|
||
| ## Tracking the release | ||
|
|
||
| 1. Check the release status through Sponge: go/spng2?q=PROJECT%3Aa2ui%2Fpypi |
There was a problem hiding this comment.
Do we want to add this internal link to the OSS project? @jacobsimionato @gspencergoog
Description
Replace this paragraph with a description of what this PR is changing or adding, and why. Consider including before/after screenshots.
List which issues are fixed by this PR. For larger changes, raising an issue first helps reduce redundant work.
Pre-launch Checklist
If you need help, consider asking for advice on the discussion board.