Releaseo
A GitHub Action written in Go that creates release PRs with automated version bumping for VERSION files, Helm charts, and any YAML configuration.
Why Releaseo?
The Problem
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 chart version need 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.
The Solution
Releaseo automates the entire version bump workflow:
- Bump the version in your
VERSION file (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.
Features
- Semantic version bumping (major, minor, patch)
- Updates
VERSION file 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
Usage
Basic Usage
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 }}
With Helm Chart Version Sync
- 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"
With helm-docs Integration
- 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
Using Outputs
- 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 file
path: Dot-notation path to the value (e.g., image.tag, metadata.version)
prefix: Optional prefix to prepend to the version (e.g., v for v1.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
Outputs
| Output |
Description |
version |
The new version number |
pr_number |
The created PR number |
pr_url |
The created PR URL |
How It Works
- Reads current version from
VERSION file
- Calculates new version based on bump type:
major: 1.0.0 → 2.0.0
minor: 1.0.0 → 1.1.0
patch: 1.0.0 → 1.0.1
- Validates new version is greater than current
- Updates
VERSION file
- Updates all specified
version_files at their configured paths
- Runs helm-docs if
helm_docs_args is provided
- Creates branch
release/v{version}
- Commits all changes
- Creates pull request with release label
Development
Building
go build -o releaseo .
Testing
go test ./...
Running Locally
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"}]'
License
Apache License 2.0 - see LICENSE for details.