Instructions for releasing and maintaining the parallel-web-tools package.
From the repository root:
Create a .envrc file in the repo root containing:
use flake;
Make sure you have the following installed:
- uv
- Python 3.12
- Node 24
- pnpm
Sets up Python, installs all dev dependencies, and sets up pre-commit:
uv sync --extra dev
# Install git hooks
uv run pre-commit install
# Run hooks manually on all files
uv run pre-commit run --all-filesJust run:
uv run parallel-cli
If you want to build the binary for whatever reason:
uv run python scripts/build.pyFrom the main branch with a clean working tree:
# Release candidate (most common)
./scripts/release.sh rc
# Promote RC to stable
./scripts/release.sh stable
# Explicit version
./scripts/release.sh 0.2.0This script will:
- Calculate the next version
- Update all 4 version files
- Create a
release/vX.Y.Zbranch - Commit, push, and open a PR
After you merge the PR, everything else is automated:
auto-release.ymldetects the version bump commit and creates a GitHub Release + tagrelease.ymlbuilds standalone binaries for all platformspublish.ymlpublishes to PyPI- npm publish is handled by the release workflow
Update the version in these places:
pyproject.toml:version = "X.Y.Z"parallel_web_tools/__init__.py:__version__ = "X.Y.Z"parallel_web_tools/integrations/bigquery/cloud_function/requirements.txt:parallel-web-tools>=X.Y.Znpm/package.json:"version": "X.Y.Z"(use semver pre-release format for RCs, e.g."X.Y.Z-rc.1")
Then commit with the message chore: bump version to X.Y.Z — the auto-release workflow
will detect it and create the release.
After the workflows complete:
# Test binary installation
curl -fsSL https://raw.githubusercontent.com/parallel-web/parallel-web-tools/main/install-cli.sh | bash
parallel-cli --version
# Test Homebrew installation
brew install parallel-web/tap/parallel-cli
parallel-cli --version
# Test PyPI installation
pip install parallel-web-tools[all] --upgrade
parallel-cli --version| Platform | Runner | Archive Name |
|---|---|---|
| macOS Apple Silicon | macos-15 |
parallel-cli-darwin-arm64.zip |
| macOS Intel | macos-15-large |
parallel-cli-darwin-x64.zip |
| Linux x64 | ubuntu-latest |
parallel-cli-linux-x64.zip |
| Windows x64 | windows-latest |
parallel-cli-windows-x64.zip |
Note: Linux arm64 is not supported (no GitHub-hosted ARM64 runners available).
Expect ~35-50 MB per platform archive (zip). The standalone CLI uses PyInstaller onedir mode for fast startup (~0.2s). The archive extracts to ~80 MB on disk.
Configure trusted publishing (no API tokens needed):
- Go to https://pypi.org/manage/account/publishing/
- Click Add a new pending publisher
- Fill in:
- PyPI project name:
parallel-web-tools - Owner:
parallel-developers - Repository:
parallel-web-tools - Workflow name:
publish.yml - Environment name:
pypi
- PyPI project name:
For Test PyPI (recommended for testing):
- Go to https://test.pypi.org/manage/account/publishing/
- Same steps, but use environment name:
test-pypi
To publish without creating a release:
- Go to Actions → Publish to PyPI
- Click Run workflow
- Check "Publish to Test PyPI" for testing
- Click Run workflow
The package supports optional dependencies:
pip install parallel-web-tools # Core library only
pip install parallel-web-tools[cli] # + CLI tools (click, rich, questionary)
pip install parallel-web-tools[duckdb] # + DuckDB connector
pip install parallel-web-tools[bigquery] # + BigQuery connector
pip install parallel-web-tools[all] # Everything# Delete release and tag
gh release delete v0.0.1-test --cleanup-tag
# Or separately:
gh release delete v0.0.1-test
git push origin --delete v0.0.1-testFor testing without affecting "latest":
- Create release as usual
- Check Set as a pre-release
Pre-releases won't be installed by the install script (which uses GitHub's "latest" release API).
If a release has issues:
# Yank (hide from default install, but still accessible)
pip install twine
twine yank parallel-web-tools==0.0.1
# Or delete entirely (not recommended)
# Must be done via PyPI web interface within 24 hoursThe Homebrew formula is published to parallel-web/homebrew-tap.
- Create the
parallel-web/homebrew-taprepository on GitHub - Add a
HOMEBREW_TAP_TOKENsecret to this repository — a GitHub PAT withreposcope that has write access toparallel-web/homebrew-tap
The publish-homebrew job in release.yml automatically updates the formula on stable releases
(skips RCs). It downloads SHA256 checksums from the release and generates the formula.
# Generate formula from the latest release
python scripts/update-homebrew-formula.py --output homebrew/parallel-cli.rb
# Generate formula for a specific version
python scripts/update-homebrew-formula.py --version 0.1.2 --output homebrew/parallel-cli.rb| Workflow | Trigger | Purpose |
|---|---|---|
ci.yml |
Push to main, PRs | Run tests and type checking |
auto-release.yml |
Push to main (version bump commits) | Create tag + GitHub Release |
release.yml |
Release created | Build binaries, publish to npm + Homebrew |
publish.yml |
Release published | Publish to PyPI |
# Trigger release build manually
gh workflow run release.yml -f tag=v0.0.1
# Trigger PyPI publish manually
gh workflow run publish.yml -f test_pypi=true- Check the Actions log for the specific platform
- Common issues:
- Missing hidden imports in
parallel-web-tools.spec - Platform-specific dependency issues
- Missing hidden imports in
- Verify trusted publishing is configured correctly
- Check the environment name matches (
pypiortest-pypi) - Ensure version number hasn't been used before
- Check if zip archives exist on the release
- Verify checksum files are present (
.zip.sha256) - Test the download URL manually:
curl -fsSL https://github.com/parallel-web/parallel-web-tools/releases/download/v0.0.1/parallel-cli-darwin-arm64.zip -o test.zip