This document describes how the Galaxy Helm chart is versioned, released, and published. The process is fully automated via GitHub Actions and gated by a manual approval step, so a release happens only when a maintainer intends it to.
dev (development) ──PR──▶ master ──merge triggers──▶ Release workflow
│
┌───────────────────────────────────┤
▼ ▼ ▼
bump Chart.yaml package & publish tag + GitHub release
│ to CloudVE/helm-charts │
▼ ▼
merge master ──▶ dev notify Slack + trigger
galaxy-k8s-boot update
The chart version (the Helm chart version) is bumped automatically by
the release workflow — never edit it by hand on dev. The appVersion (the
Galaxy application version) is maintained by hand and should be updated
together with the Galaxy image tag in galaxy/values.yaml whenever Galaxy
itself is upgraded.
| Branch | Purpose | Protection |
|---|---|---|
dev |
Integration branch; all work lands here | Relaxed — status checks required, direct pushes allowed for maintainers |
master |
Release branch; every merge is a release | Strict — PR + approval + status checks, no direct pushes (except the release GitHub App) |
All release PRs must originate from dev and target master. This is
enforced by .github/workflows/pr-validation.yaml.
-
Develop on
dev. Land all changes for the release intodevvia normal PRs. Make sureappVersioningalaxy/Chart.yamland the Galaxy imagetagingalaxy/values.yamlreflect the Galaxy version you are shipping. -
Open a release PR
dev→master. The PR must carry exactly one version-bump label that determines the new chart version:Label Effect on chart versionExample majorX.0.06.7.3 → 7.0.0minorx.Y.06.7.3 → 6.8.0patchx.y.Z6.7.3 → 6.7.4pr-validation.yamlfails the PR if the source branch is notdevor if the label count is not exactly one. -
Pass checks and get approval. The
lintingandteststatus checks (fromtest.yaml) must pass. Approve the PR via a normal review, or comment/approve(maintainers with write access only — seeauto-approve.yaml). On approval, auto-merge is enabled (enable-auto-merge.yaml). -
Merge to
master. Merging the PR triggersrelease.yaml, which:- Re-runs the smoke test (
test.yaml). - Calculates the new chart
versionfrom the PR label. - Waits at the
releaseenvironment approval gate — a maintainer must approve the deployment in the GitHub UI for the release to proceed. - Bumps
version:ingalaxy/Chart.yaml, commits, and pushes tomaster. - Packages the chart and pushes the
.tgz+ updatedindex.yamltoCloudVE/helm-charts. - Creates a
v<version>git tag and a GitHub release with generated notes. - Merges
masterback intodevso the version bump is reflected there. - Triggers a
repository_dispatchtogalaxyproject/galaxy-k8s-bootto update its pinned chart version, and posts a Slack notification.
- Re-runs the smoke test (
The release workflow can also be started by hand via
Actions → Release → Run workflow (workflow_dispatch), choosing the
major/minor/patch bump explicitly. The same approval gate applies.
- Chart
version(galaxy/Chart.yaml) — bumped only by the release workflow. Do not edit it ondev; if you change it locally for testing, revert before committing. appVersion(galaxy/Chart.yaml) — the Galaxy release being shipped (e.g.26.0.0). Update by hand when upgrading Galaxy.- Galaxy image
tag(galaxy/values.yaml,image.tag) — must match theappVersion. Confirm the tag exists on quay.io/galaxyproject/galaxy-min before releasing.
These are configured once per repository. If the GitHub App and secrets below
are not set up, the release job will fail (e.g. token generation or the push
to master/helm-charts will be denied).
- Branch protection rulesets — see
REPOSITORY_RULESETS_GUIDE.md. Status checkslintingandtestmust match the job names intest.yaml. releaseenvironment — a GitHub Environment namedreleasewith required reviewers, providing the manual approval gate.- Repository secrets (Settings → Secrets and variables → Actions):
HELM_UPDATER_APP_ID— the GitHub App's App ID (a number).HELM_UPDATER_PKEY— the GitHub App's private key (the full contents of the downloaded.pemfile, including the-----BEGIN/END-----lines).K8S_SLACK_WEBHOOK_URL— Slack incoming webhook for release notifications.
The release workflow uses a GitHub App (rather than the default GITHUB_TOKEN)
because it must bypass branch protection to push the version-bump commit and
tag to master, publish to another repository, and trigger a downstream repo.
The default GITHUB_TOKEN cannot do these things.
-
Create the App. Go to the organization's Settings → Developer settings → GitHub Apps → New GitHub App (an org-owned App is recommended over a personal one so ownership survives maintainer changes). Set:
- GitHub App name: e.g.
galaxy-helm-release-bot. - Homepage URL: the repo URL (any valid URL works).
- Webhook: uncheck Active — this App does not need to receive webhooks.
- GitHub App name: e.g.
-
Set repository permissions. Under Permissions → Repository permissions, grant the minimum the workflows need:
Permission Access Why Contents Read and write Push the version bump + tag to master, create the GitHub release, push the packaged chart toCloudVE/helm-charts, and send therepository_dispatchtogalaxy-k8s-bootPull requests Read and write Approve PRs and enable auto-merge ( auto-approve.yaml,enable-auto-merge.yaml)Issues Read and write Add the comment + reaction when /approveis used (PR comments are issues)Metadata Read-only Mandatory; selected automatically Leave everything else as No access.
-
Create the App, then generate a private key (App settings → Private keys → Generate a private key). This downloads a
.pemfile — its contents become theHELM_UPDATER_PKEYsecret. Note the App ID shown at the top of the App settings page — that becomesHELM_UPDATER_APP_ID. -
Install the App on the repositories it touches (App settings → Install App → choose the account → Only select repositories):
galaxyproject/galaxy-helmgalaxyproject/galaxy-k8s-bootCloudVE/helm-charts
Cross-organization note:
release.yamlrequests a token forgalaxy-helm,helm-charts,galaxy-k8s-boot.helm-chartslives in the CloudVE org while the others are under galaxyproject, so the App must be installed in both organizations. A single installation token only covers repositories owned by one account, so if a future change can't seeCloudVE/helm-charts, confirm the App is installed in the CloudVE org and thatactions/create-github-app-tokenis requesting the right owner. -
Add the App to the branch-protection ruleset bypass list so it can push to protected
master. SeeREPOSITORY_RULESETS_GUIDE.md— setactor_idto the App's integration ID (gh api /appafter authenticating as the App, or read it from the ruleset guide's instructions) andactor_typetoIntegration. -
Verify. Trigger a dry run via Actions → Release → Run workflow (
workflow_dispatch) with apatchbump and watch thereleasejob. If the App is misconfigured the failure will surface at the Generate GitHub App token step or the firstgit push.
The notify job sends a success message only when the release job
succeeds, and a distinct failure message otherwise (including when the
release is skipped because an earlier job failed). A failed or skipped release
will therefore not post a "has been released" message.
| Workflow | Trigger | Purpose |
|---|---|---|
.github/workflows/test.yaml |
push/PR to master/dev, called by release |
Helm lint + full K3s deploy smoke test (verifies appVersion matches the running Galaxy API) |
.github/workflows/pr-validation.yaml |
PR to master |
Enforces source branch dev and exactly one version label |
.github/workflows/auto-approve.yaml |
/approve PR comment |
Lets write-access maintainers approve + enable auto-merge |
.github/workflows/enable-auto-merge.yaml |
PR review approved | Enables auto-merge once a PR to master is approved |
.github/workflows/release.yaml |
PR to master merged, or manual |
Bump, package, publish, tag, merge-back, notify, downstream dispatch |
A successful release dispatches an update-galaxy-chart event to
galaxyproject/galaxy-k8s-boot, which updates its pinned galaxy_chart_version
and opens a PR there for review. See the galaxy-k8s-boot repository for that
side of the integration.