Skip to main content

Distribution Overview

NoETL CLI is distributed through multiple channels to support different platforms and package managers.

Package Naming

The NoETL CLI uses different names across distribution channels:

ChannelPackage NameBinary NameDirectory
Crates.ionoetlnoetlcrates/noetlctl
PyPInoetlctlnoetlcrates/noetlctl
Homebrewnoetlnoetlcrates/noetlctl
APTnoetlnoetlcrates/noetlctl

Rationale:

  • Crates.io: noetl for clean cargo install command
  • PyPI: noetlctl to avoid conflicts, descriptive "noetl control"
  • Homebrew/APT: noetl for simplicity
  • Directory: noetlctl for descriptive naming in repository

All packages install the same Rust binary named noetl.

Distribution Channels

1. Crates.io (Rust)

Package: https://crates.io/crates/noetl
Install: cargo install noetl
Platform: Cross-platform (requires Rust toolchain)

Pros:

  • Native Rust ecosystem
  • Latest updates available quickly
  • Source-based builds with optimization options

Release Process: See Crates.io Releases

2. PyPI (Python)

Package: https://pypi.org/project/noetlctl/
Install: pip install noetlctl
Platform: Pre-built wheels for macOS, Linux, Windows

Pros:

  • No Rust toolchain required
  • Fast installation (pre-compiled binaries)
  • Works in Python virtual environments

Technical: Built with maturin using bin bindings

Release Process: See Maturin Release

3. Homebrew (macOS)

Tap: https://github.com/noetl/homebrew-tap
Install: brew install noetl
Platform: macOS (Apple Silicon & Intel)

Pros:

  • Native macOS package management
  • Automatic updates with brew upgrade
  • No Rust toolchain required for users

Release Process: See Homebrew Releases

4. APT (Ubuntu/Debian)

Repository: https://noetl.github.io/apt
Install: sudo apt-get install noetl
Platform: Ubuntu/Debian (amd64, arm64)

Pros:

  • Native Linux package management
  • System-wide installation
  • Integration with apt-get workflow

Build: Docker-based for cross-platform building from macOS

Release Process: See APT Releases

Installation Matrix

PlatformRecommended MethodAlternative
macOSHomebrewCrates.io, PyPI
Ubuntu/DebianAPTCrates.io, PyPI
Other LinuxCrates.ioPyPI
WindowsPyPICrates.io
CI/CDCrates.ioPyPI, Docker

Version Synchronization

All distribution channels should maintain version parity:

Workspace Version (root Cargo.toml):

[workspace.package]
version = "2.5.3"

Package Versions:

  • Crates.io: noetl v2.5.3
  • PyPI: noetlctl v2.5.3
  • Homebrew: Formula URL with v2.5.3 tag
  • APT: Package version 2.5.3-1

Release Workflow

For a new version (e.g., 2.5.4):

  1. Update version in Cargo.toml workspace
  2. Create git tag: v2.5.4
  3. Push tag: git push origin v2.5.4
  4. Publish to Crates.io: ./scripts/publish_crate.sh
  5. Build Debian package: ./docker/release/build-deb-docker.sh 2.5.4
  6. Publish APT repo: ./scripts/publish_apt.sh 2.5.4
  7. Update Homebrew: ./scripts/homebrew_publish.sh 2.5.4
  8. Publish to PyPI: cd crates/noetlctl && maturin publish

Docker-Based Building

For developers on macOS or Windows who need to build Linux packages:

Debian Package

./docker/release/build-deb-docker.sh 2.5.4

Output: build/deb/noetl_2.5.4-1_amd64.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_amd64.deb &&
noetl --version'

Automation

GitHub Actions

Create workflows for automated publishing:

  • .github/workflows/publish-crates.yml - Publish to crates.io on tag push
  • .github/workflows/build-deb.yml - Build and publish Debian packages
  • .github/workflows/update-homebrew.yml - Update Homebrew tap

Manual Scripts

Located in scripts/:

  • publish_crate.sh - Crates.io publishing with validation
  • build_deb.sh - Native Debian package building
  • publish_apt.sh - APT repository generation
  • homebrew_publish.sh - Homebrew formula SHA256 update

Located in docker/release/:

  • build-deb-docker.sh - Docker-based Debian building
  • Dockerfile.deb - Ubuntu build environment

Troubleshooting

Package Name Confusion

Q: Why is the crate named noetl but directory is noetlctl?
A: For clean cargo install (cargo install noetl) while keeping descriptive directory naming.

Q: Why is PyPI package named noetlctl?
A: To avoid namespace conflicts and be more descriptive ("noetl control").

Version Mismatches

Ensure all packages use the same version from workspace:

# Check workspace version
grep 'version =' Cargo.toml

# Verify crate version
grep 'version' crates/noetlctl/Cargo.toml

# Verify PyPI version
grep 'version' crates/noetlctl/pyproject.toml

Build Failures

Docker build fails on macOS:

  • Ensure Docker Desktop is running
  • Check available disk space
  • Try: docker system prune -a

Rust compilation errors:

  • Update Rust: rustup update
  • Clean build: cargo clean && cargo build

Support Matrix

PlatformArchitecturePackage ManagerStatus
macOSApple SiliconHomebrew, Cargo, PyPI✅ Supported
macOSIntelHomebrew, Cargo, PyPI✅ Supported
Ubuntu 24.04amd64APT, Cargo, PyPI✅ Supported
Ubuntu 22.04amd64APT, Cargo, PyPI✅ Supported
Ubuntu 20.04amd64APT, Cargo, PyPI✅ Supported
Ubuntuarm64APT, Cargo, PyPI🚧 Coming Soon
Debianamd64APT, Cargo, PyPI✅ Supported
Other Linuxamd64Cargo, PyPI✅ Supported
Windowsx86_64PyPI, Cargo⚠️ Limited Testing

Documentation