This document describes the automated release workflow for the StackOne AI Python SDK. The release process uses release-please to implement semantic versioning based on conventional commits, automatically generating changelogs, updating version numbers, and publishing packages to PyPI.
For detailed configuration of the release-please system, see Release Please Configuration. For the complete release workflow implementation, see Release Workflow. For general CI/CD pipeline information, see CI/CD Pipeline.
The StackOne AI SDK employs a fully automated, zero-touch release process. Releases are triggered by conventional commits to the main branch, which release-please analyzes to determine version bumps and generate release artifacts. The system automatically updates the Python lock file (uv.lock) as part of release pull requests and publishes packages to PyPI upon release creation.
Release Workflow Architecture
Sources: .github/workflows/release.yaml1-67 .release-please-manifest.json1-4
Releases are triggered automatically when commits following the Conventional Commits specification are pushed to the main branch. The release-please-action analyzes commit messages to determine the next version number according to semantic versioning rules.
| Commit Type | Version Impact | Example | Resulting Version Change |
|---|---|---|---|
feat: | Minor version | feat: add semantic search | 2.3.0 → 2.4.0 |
fix: | Patch version | fix: parameter validation | 2.3.0 → 2.3.1 |
BREAKING CHANGE: | Major version | feat!: remove deprecated API | 2.3.0 → 3.0.0 |
chore:, docs:, refactor: | No release | chore: update deps | No version change |
The workflow runs on every push to main but only creates release PRs or releases when relevant commits are detected:
Sources: .github/workflows/release.yaml3-6 CHANGELOG.md1-187
The release workflow operates in two distinct phases: the Release PR Phase and the Release Creation Phase. These phases are controlled by output conditionals from the release-please-action.
Release Phases Flow Diagram
Sources: .github/workflows/release.yaml13-67
When release-please detects conventional commits, it creates or updates a release pull request. This PR contains:
pyproject.tomlCHANGELOG.md with grouped commits.release-please-manifest.jsonThe workflow then performs an additional automation step specific to Python projects:
This ensures that uv.lock reflects the new version specified in pyproject.toml, maintaining lock file consistency across the release.
Sources: .github/workflows/release.yaml22-47
When a release PR is merged, release-please detects the merge and triggers the publication phase:
This phase:
stackone-ai-v2.4.0)uv build (invoked via just build)uv publish with the PYPI_API_TOKEN secretSources: .github/workflows/release.yaml49-67
The project uses a single-package monorepo structure with version tracking in .release-please-manifest.json:
The "." key indicates the root package. The version number follows semantic versioning (MAJOR.MINOR.PATCH) and is synchronized across multiple files during release:
Version Synchronization Points
Sources: .release-please-manifest.json1-4 CHANGELOG.md1-10
The release workflow requires elevated permissions to create releases and update pull requests:
These permissions allow the workflow to:
uv.lock updates)Sources: .github/workflows/release.yaml8-10
The release process integrates with the broader dependency management ecosystem documented in Dependency Management:
Release and Dependency Update Coordination
| Update Type | Frequency | Mechanism | Interaction with Releases |
|---|---|---|---|
Release-triggered uv.lock | Per release | Automatic in release PR | Synchronized with version bump |
| Python dependencies | Weekly (Monday 09:00) | Dependabot PR | Independent, merged before releases |
| Nix flake inputs | Weekly (Monday 09:00) | nix-flake-update workflow | Independent, auto-merged |
| GitHub Actions | Weekly (Monday 09:00) | Dependabot PR | Independent, merged before releases |
The release workflow deliberately uses skip-uv-sync: "true" in the setup-nix action because it explicitly manages uv.lock as part of the release process:
This prevents double synchronization and ensures the workflow has full control over when and how uv.lock is updated during releases.
Sources: .github/workflows/release.yaml29-33 .github/dependabot.yaml1-47 .github/workflows/nix-flake-update.yaml1-64
Each successful release produces the following artifacts:
stackone-ai-vX.Y.Z (e.g., stackone-ai-v2.4.0).tar.gz) and wheel (.whl)Changelog Structure Example
The generated changelog groups commits by conventional type:
Each entry includes:
search:, ci:)Sources: CHANGELOG.md1-30
While releases are normally automatic, maintainers can manually trigger a release by:
Release-As: X.Y.Z in the commit bodyExample:
This bypasses the automatic version calculation and forces a specific version number.
Sources: .github/workflows/release.yaml1-67
The release workflow includes several safeguards:
pr or release_created)uv lock update only commits if changes are detectedPYPI_API_TOKEN)If the release workflow fails:
mainSources: .github/workflows/release.yaml13-67
Refresh this wiki