mainbranch: Development branch for new featuresrelease/<major>.<minor>.xbranches: Used for releases and patches- All releases are built from release branches
- Changelog is maintained through GitHub Releases
- For major/minor releases: RC versions and the actual release are created on main, then release branch is created from the final release tag
For major/minor releases (e.g., 1.1.0, 2.0.0):
- Ensure all features are merged to
main - Set RC version in
mainbranch:mvn versions:set -DgenerateBackupPoms=false # Enter version like: 1.1.0-RC1 - Run
mvn clean package -DskipTests -P '!sonarqube'to update NOTICE.txt files - Build, test, commit with message
Release 1.1.0-RC1 - Tag:
git tag 1.1.0-RC1 -m "Release 1.1.0-RC1" -a - Push tag and test RC
git push origin 1.1.0-RC1. For example by running e2e tests in Staging Cloud. - Create additional RCs (RC2, RC3) as needed
- Go to GitHub -> Releases -> "Draft new release" -> "Generate release notes" -> uncheck "latest release" -> check "pre-release"-> OK
- Test the RC1 image from Harbor(for example in e2e tests in Staging Cloud)
Still on main branch:
-
Set the release version:
mvn versions:set -DgenerateBackupPoms=false # Enter version like: 1.1.0 -
Update NOTICE.txt files:
mvn clean package -DskipTests -P '!sonarqube' -
Build Docker Image Locally:
Run the automated build script:
./build-local-docker.sh
This script will:
- Build the project with Maven (including all tests)
- Prepare build artifacts in
build-output/ - Build Docker image using the main
Dockerfile - Create image tagged as
axual/ksml:local
-
Test the Release:
- Modify
run.shanddocker-compose.ymlto useaxual/ksml:local - Start environment:
docker compose up -d - Verify data generator:
docker compose logs example-producer -f - Execute
./examples/run.shand verify:- Correct version appears:
Starting KSML Runner x.x.x (2025-...) - Wait ~2 minutes for examples to run without errors
- Stop the script after verification
- Correct version appears:
- Modify
-
Update
docs/release-notes.md:- Add the new version entry (e.g.
## 1.1.0 (YYYY-MM-DD)) at the top of the list - Add the version to the table of contents
- Summarize the key changes
- Add the new version entry (e.g.
-
Commit changes:
git add **/pom.xml **/NOTICE.txt docs/release-notes.md git commit -m "Release 1.1.0"
-
Create and push tag:
git tag 1.1.0 -m "Release 1.1.0" -a git push origin 1.1.0
After the release tag is created on main:
-
Create release branch from release tag:
git checkout -b release/1.1.x 1.1.0
Important: The release branch is created from the final release tag (e.g., 1.1.0), not from any RC tag. This ensures the release branch contains all fixes and changes made during the RC process.
-
Update GitHub Actions on the release branch:
a. Update
.github/workflows/build-push-docker.yml:- Change Docker tags from
snapshotto<major>.<minor>-snapshot - Update helm-chart-release job:
app-version: <major>.<minor>-snapshot,version: <major>.<minor>.0-snapshot
b. Update
.github/workflows/package-push-helm.yml:- Change default
versionparameter to<major>.<minor>.0-snapshotin both workflow_dispatch and workflow_call
c. Update
.github/workflows/release-push-docker.yml:- Add
<major>.<minor>tag to all Docker registries (axual/ksml, ghcr.io, registry.axual.io)
- Change Docker tags from
-
Commit and push the release branch:
git add .github/workflows/*.yml git commit -m "Update GitHub Actions for release/<major>.<minor>.x branch" git push origin release/<major>.<minor>.x
- Go to GitHub -> Releases -> "Draft new release"
- Select the new tag (e.g.,
1.1.0) - Set previous tag for comparison (e.g.,
1.0.8) - Click "Generate release notes"
- Structure the release notes:
- "What's Changed": Write concise summary of key changes
- "Full Changelog": Keep auto-generated commit list
- Publish the release
- Upload ksml-language-spec.json
- Go to GitHub -> Actions -> Monitor release workflow
- Ensure the build completes successfully
After the build completes, verify the Docker image and Helm chart are published:
# Check Docker image tags
skopeo list-tags docker://registry.axual.io/opensource/images/axual/ksml
# Inspect the specific release image
skopeo inspect --override-os linux docker://registry.axual.io/opensource/images/axual/ksml:1.1.0
# Check Helm chart tags
skopeo list-tags docker://registry.axual.io/opensource/charts/ksml-
In release branch:
git checkout release/1.1.x mvn versions:set -DgenerateBackupPoms=false # Enter next patch snapshot: 1.1.1-SNAPSHOT mvn clean package -DskipTests # To generate NOTICE.TXT
Update
packaging/helm-charts/ksml/Chart.yamlversion and appVersion, i.e. "version: 1.1.1-SNAPSHOT" and "appVersion: "1.1.1-snapshot"" Add:git add **/pom.xml **/NOTICE.txt **/Chart.yamlCommit:git commit -m "Prepare for next development iteration"Push:git push origin release/1.1.x -
In main branch:
git checkout main mvn versions:set -DgenerateBackupPoms=false # Enter next minor/major snapshot: 1.2.0-SNAPSHOT mvn clean package -DskipTests # To generate NOTICE.TXT
Update
packaging/helm-charts/ksml/Chart.yamlversion and appVersion, i.e. "version: 1.2.0-SNAPSHOT" and "appVersion: "1.2.0-snapshot"" Add:git add **/pom.xml **/NOTICE.txt **/Chart.yamlCommit:git commit -m "Prepare for next development iteration"Push:git push origin main
When doing a patch release (e.g., 1.0.9, 1.1.1):
Note: GitHub Actions do not need to be updated for patch releases as they already contain the correct snapshot versions for the release branch.
-
Checkout existing release branch:
git checkout release/1.0.x
-
Apply fixes by either:
- Cherry-picking from main:
git cherry-pick <commit-hash> - Creating fixes directly in release branch
- Cherry-picking from main:
-
Set Maven version:
mvn versions:set -DgenerateBackupPoms=false # Enter version like: 1.0.9 -
Update
packaging/helm-charts/ksml/Chart.yamlversion and appVersion to the release version, i.e.version: 1.0.9andappVersion: "1.0.9"
- Update NOTICE.txt files:
mvn clean package -DskipTests
Run the automated build script:
./build-local-docker.shThis script will:
- Build the project with Maven (including all tests)
- Prepare build artifacts in
build-output/ - Build Docker image using the main
Dockerfile - Create image tagged as
axual/ksml:local
- Modify
run.shanddocker-compose.ymlto useaxual/ksml:local - Start environment:
docker compose up -d - Verify data generator:
docker compose logs example-producer -f - Execute
./run.shand verify:- Correct version appears:
Starting KSML Runner x.x.x (2025-...) - Wait ~2 minutes for examples to run without errors
- Stop the script after verification
- Correct version appears:
Update docs/release-notes.md:
- Add the new version entry (e.g.
## 1.0.9 (YYYY-MM-DD)) at the top of the list - Add the version to the table of contents
- Summarize the key changes
git add **/pom.xml **/NOTICE.txt packaging/helm-charts/ksml/Chart.yaml docs/release-notes.md
git commit -m "Release 1.0.9"git tag 1.0.9 -m "Release 1.0.9" -a
git push origin 1.0.9- Go to GitHub -> Releases -> "Draft new release"
- Select the new tag (e.g.,
1.0.9) - Set previous tag for comparison (e.g.,
1.0.8) - Click "Generate release notes"
- Structure the release notes:
- "What's Changed": Write concise summary of key changes
- "Full Changelog": Keep auto-generated commit list
- Publish the release
- Upload ksml-language-spec.json
- Go to GitHub -> Actions -> Monitor release workflow
- Only after successful build, push the branch:
git push origin release/1.0.x
After the build completes, verify the Docker image and Helm chart are published:
# Check Docker image tags
skopeo list-tags docker://registry.axual.io/opensource/images/axual/ksml
# Inspect the specific release image
skopeo inspect --override-os linux docker://registry.axual.io/opensource/images/axual/ksml:1.0.9
# Check Helm chart tags
skopeo list-tags docker://registry.axual.io/opensource/charts/ksml-
Switch to main branch:
git checkout main
-
Set the next patch snapshot version:
mvn versions:set -DgenerateBackupPoms=false # Enter next patch snapshot, e.g.: 1.0.10-SNAPSHOT -
Update NOTICE.txt files:
mvn clean package -DskipTests
-
Update
packaging/helm-charts/ksml/Chart.yaml:- Set
version: 1.0.10-SNAPSHOT - Set
appVersion: "1.0.10-snapshot"
- Set
-
Commit and push to main:
git add **/pom.xml **/NOTICE.txt packaging/helm-charts/ksml/Chart.yaml git commit -m "Prepare for next development iteration" git push origin main
- Major: Breaking changes
- Minor: New features (backward compatible)
- Patch: Bug fixes
- Snapshot: Development versions (
-SNAPSHOT) - RC: Release candidates (
-RC<number>)
Important: The Helm Chart version and appVersion are always aligned with the Docker image tag:
-
Released versions: Both set to the same version (e.g.,
1.1.1)- Helm chart version:
1.1.1 - Helm chart appVersion:
1.1.1 - Docker image tag:
axual/ksml:1.1.1
- Helm chart version:
-
Snapshot builds:
- Main branch:
0.0.0-snapshotfor both - Release branches:
<major>.<minor>.<patch>-snapshotfor both
- Main branch:
The CI/CD pipeline enforces this alignment by overriding Chart.yaml values during helm package execution. The Chart.yaml file in the repository serves as a template and its values are replaced during builds.
If issues found after tagging but before release build:
- Delete remote tag:
git push origin :refs/tags/<version> - Delete local tag:
git tag -d <version> - Fix issues and restart from appropriate step