Release Process
This guide documents the complete release process for publishing NoETL across all distribution channels.
Overview
NoETL is distributed through multiple channels:
- Homebrew: macOS/Linux package manager
- APT: Debian/Ubuntu repository at https://noetl.github.io/apt
- PyPI: Python package (noetlctl)
- Crates.io: Rust package (noetl, noetl-gateway)
- GitHub Releases: Binary downloads
Prerequisites
brew(for Homebrew testing)cargoandmaturin(for Rust/Python publishing)dpkganddpkg-dev(for Debian packages)ghCLI (for GitHub releases)twine(for PyPI publishing, optional - maturin handles this)- Write access to noetl GitHub repositories
Version Update Process
1. Update Version Numbers
Update version in all configuration files:
# Root workspace Cargo.toml
version = "2.5.4"
# crates/noetlctl/pyproject.toml
version = "2.5.4"
# crates/gateway/Cargo.toml
version = "2.5.4"
# pyproject.toml (root - for noetl Python package)
version = "2.5.4"
# homebrew/noetl.rb (will be updated with SHA256 later)
url = "https://github.com/noetl/noetl/archive/refs/tags/v2.5.4.tar.gz"
2. Create Release Branch
git checkout -b release/v2.5.4
git add Cargo.toml crates/*/Cargo.toml crates/*/pyproject.toml pyproject.toml homebrew/noetl.rb
git commit -m "chore: Bump version to 2.5.4"
git push -u origin release/v2.5.4
Create and merge PR, then pull to master:
git checkout master
git pull
3. Create Git Tag
git tag -a v2.5.4 -m "Release v2.5.4 - <Brief description>"
git push origin v2.5.4
Build Artifacts
Build Rust Binary
cd crates/noetlctl
cargo build --release
# Binary at: ../../target/release/noetl
Build Python Wheel
cd crates/noetlctl
maturin build --release
# Wheel at: ../../target/wheels/noetlctl-2.5.4-py3-none-macosx_11_0_arm64.whl
Build Debian Package
./docker/release/build-deb-docker.sh 2.5.4
# Package at: build/deb/noetl_2.5.4-1_arm64.deb
Test installation:
docker run --rm -v $(pwd)/build/deb:/packages ubuntu:22.04 bash -c \
'apt-get update && dpkg -i /packages/noetl_2.5.4-1_*.deb && noetl --version'
Publishing
1. Publish to PyPI (noetlctl)
cd crates/noetlctl
maturin publish
Verify:
pip install --upgrade noetlctl
noetl --version
2. Publish to Crates.io
Main CLI:
cd crates/noetlctl
cargo publish
Gateway:
cd crates/gateway
cargo publish
Verify:
cargo install noetl
cargo install noetl-gateway
3. Publish APT Repository
Build and publish:
# Using Docker (recommended)
./docker/release/publish-apt-docker.sh 2.5.4 arm64
Upload to GitHub Pages:
APT repository is hosted at https://github.com/noetl/apt (public repository):
# Copy generated repository
cp -r apt-repo/* /path/to/apt-repo/
cd /path/to/apt-repo
git add .
git commit -m "Add NoETL v2.5.4"
git push origin main
GitHub Pages automatically deploys from the main branch. Repository is accessible at:
https://noetl.github.io/apt
Verify installation:
echo 'deb [trusted=yes] https://noetl.github.io/apt jammy main' | sudo tee /etc/apt/sources.list.d/noetl.list
sudo apt-get update
sudo apt-get install noetl
noetl --version
4. Create GitHub Release
# Create release notes file
cat > release-notes-v2.5.4.md << 'EOF'
# NoETL v2.5.4
## What's New
- Feature highlights
- Bug fixes
- Breaking changes (if any)
## Installation
See https://noetl.dev/docs/getting-started/installation
## Full Changelog
https://github.com/noetl/noetl/compare/v2.5.3...v2.5.4
EOF
# Create release with binary
gh release create v2.5.4 \
--title "v2.5.4 - <Release Name>" \
--notes-file release-notes-v2.5.4.md \
target/release/noetl#noetl-macos-arm64
5. Update Homebrew Formula
Calculate SHA256:
curl -sL https://github.com/noetl/noetl/archive/refs/tags/v2.5.4.tar.gz | shasum -a 256
Update formula:
Edit homebrew/noetl.rb:
url "https://github.com/noetl/noetl/archive/refs/tags/v2.5.4.tar.gz"
sha256 "<calculated_sha256>"
Publish to tap:
# Copy to homebrew-tap repository
cp homebrew/noetl.rb /path/to/homebrew-tap/Formula/noetl.rb
cd /path/to/homebrew-tap
git add Formula/noetl.rb
git commit -m "Update noetl to v2.5.4"
git push
Verify installation:
brew update
brew upgrade noetl
noetl --version
Verification Checklist
After publishing, verify all channels:
- PyPI:
pip install --upgrade noetlctl && noetl --version - Crates.io:
cargo install noetl && noetl --version - Homebrew:
brew upgrade noetl && noetl --version - APT: Visit https://noetl.github.io/apt and check Packages file
- GitHub Release: Check https://github.com/noetl/noetl/releases/tag/v2.5.4
- Documentation: Update version references in docs
Common Issues
dpkg-scanpackages Not Found
Install dpkg-dev:
brew install dpkg # macOS
Or use Docker-based publishing:
./docker/release/publish-apt-docker.sh 2.5.4 arm64
Homebrew Caching Old Version
Clear cache and reinstall:
brew update
brew upgrade noetl
# If still showing old version:
brew uninstall noetl
brew install noetl
Version Mismatch in venv
If using Python virtual environment with noetlctl:
pip install --upgrade --force-reinstall noetlctl
PyPI Upload Credentials
maturin uses credentials from ~/.pypirc:
[pypi]
username = __token__
password = pypi-...
Post-Release
- Update documentation version references
- Announce release on social media/blog
- Update CHANGELOG.md
- Close milestone (if using GitHub milestones)
- Archive release branch (optional)
Rollback Procedure
If a release has critical issues:
- GitHub: Delete release and tag
- PyPI: Cannot delete, publish hotfix version (e.g., 2.5.4.post1)
- Crates.io: Yank version:
cargo yank [email protected] - Homebrew: Revert commit in homebrew-tap
- APT: Remove version from apt repository
Automation
Consider automating the release process with GitHub Actions:
# .github/workflows/release.yml
name: Release
on:
push:
tags:
- 'v*'
jobs:
release:
runs-on: ubuntu-latest
steps:
- name: Build artifacts
- name: Publish to PyPI
- name: Publish to Crates.io
- name: Create GitHub release
- name: Update Homebrew formula