A GitHub Action written in Go that creates release PRs with automated version bumping for VERSION files, Helm charts, and any YAML configuration.
Maintaining version consistency across a project is surprisingly difficult, especially when deploying containerized applications with Helm charts. Common pain points include:
-
Chart versions drift from image versions: When you release a new version of your application, the Helm chart's
appVersion,image.tag, and chartversionneed to stay in sync. This is often forgotten or done inconsistently. -
Manual version bumps are error-prone: Developers frequently forget to update all the places where versions live, leading to mismatched deployments.
-
Release automation gaps: Tools like Renovate handle dependency updates well, but don't solve the problem of coordinating your own application's version across multiple files.
-
Documentation gets out of sync: Helm chart documentation (via helm-docs) needs regenerating when versions change, but this step is often missed.
This problem is well-documented in projects like ToolHive, where the release flow required manual intervention to bump chart versions after image releases, causing CI failures and forgotten updates.
Releaseo automates the entire version bump workflow:
- Bump the version in your
VERSIONfile (single source of truth) - Propagate that version to any YAML files you specify (Chart.yaml, values.yaml, etc.)
- Optionally run helm-docs to regenerate chart documentation
- Create a release PR with all changes ready for review
No more forgotten version bumps. No more mismatched chart and image versions.
- Semantic version bumping (major, minor, patch)
- Updates
VERSIONfile as single source of truth - Updates any YAML file at any path (Chart.yaml version, appVersion, values.yaml image.tag, etc.)
- Optional helm-docs integration for chart documentation
- Creates release branch and PR automatically
- Validates version is increasing
- Preserves YAML formatting and comments
name: Release
on:
workflow_dispatch:
inputs:
bump_type:
description: 'Version bump type'
required: true
type: choice
options:
- patch
- minor
- major
permissions:
contents: write
pull-requests: write
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Create Release PR
uses: stacklok/releaseo@v1
with:
releaseo_version: v1.0.0
bump_type: ${{ inputs.bump_type }}
token: ${{ secrets.GITHUB_TOKEN }}- name: Create Release PR
uses: stacklok/releaseo@v1
with:
releaseo_version: v1.0.0
bump_type: ${{ inputs.bump_type }}
token: ${{ secrets.GITHUB_TOKEN }}
version_files: |
- file: deploy/charts/myapp/Chart.yaml
path: version
- file: deploy/charts/myapp/Chart.yaml
path: appVersion
- file: deploy/charts/myapp/values.yaml
path: image.tag
prefix: "v"- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: '1.23'
- name: Install helm-docs
run: go install github.com/norwoodj/helm-docs/cmd/helm-docs@latest
- name: Create Release PR
uses: stacklok/releaseo@v1
with:
releaseo_version: v1.0.0
bump_type: ${{ inputs.bump_type }}
token: ${{ secrets.GITHUB_TOKEN }}
version_files: |
- file: deploy/charts/myapp/Chart.yaml
path: version
- file: deploy/charts/myapp/Chart.yaml
path: appVersion
helm_docs_args: --chart-search-root=deploy/charts/myapp --template-files=README.md.gotmpl- name: Create Release PR
id: release
uses: stacklok/releaseo@v1
with:
releaseo_version: v1.0.0
bump_type: ${{ inputs.bump_type }}
token: ${{ secrets.GITHUB_TOKEN }}
- name: Print PR URL
run: |
echo "Created PR #${{ steps.release.outputs.pr_number }}"
echo "URL: ${{ steps.release.outputs.pr_url }}"
echo "New version: ${{ steps.release.outputs.version }}"| Input | Description | Required | Default |
|---|---|---|---|
releaseo_version |
Version of releaseo to use (e.g., v1.0.0) |
Yes | - |
bump_type |
Version bump type (major, minor, patch) |
Yes | - |
version_file |
Path to VERSION file | No | VERSION |
version_files |
YAML list of files with paths to update (see below) | No | - |
helm_docs_args |
Arguments to pass to helm-docs (if provided, helm-docs runs) | No | - |
token |
GitHub token for creating PR | Yes | - |
base_branch |
Base branch for the PR | No | main |
The version_files input accepts a YAML list where each entry specifies:
file: Path to the YAML filepath: Dot-notation path to the value (e.g.,image.tag,metadata.version)prefix: Optional prefix to prepend to the version (e.g.,vforv1.0.0)
version_files: |
- file: deploy/charts/myapp/Chart.yaml
path: version
- file: deploy/charts/myapp/Chart.yaml
path: appVersion
- file: deploy/charts/myapp/values.yaml
path: image.tag
prefix: "v"
- file: config/version.yaml
path: spec.version| Output | Description |
|---|---|
version |
The new version number |
pr_number |
The created PR number |
pr_url |
The created PR URL |
- Reads current version from
VERSIONfile - Calculates new version based on bump type:
major:1.0.0→2.0.0minor:1.0.0→1.1.0patch:1.0.0→1.0.1
- Validates new version is greater than current
- Updates
VERSIONfile - Updates all specified
version_filesat their configured paths - Runs helm-docs if
helm_docs_argsis provided - Creates branch
release/v{version} - Commits all changes
- Creates pull request with release label
go build -o releaseo .go test ./...export GITHUB_TOKEN=your_token
export GITHUB_REPOSITORY=owner/repo
./releaseo \
--bump-type=patch \
--version-file=VERSION \
--version-files='[{"file":"deploy/charts/myapp/Chart.yaml","path":"version"}]'- ToolHive: Better Chart Release Flow - The original motivation for this tool
Apache License 2.0 - see LICENSE for details.