Release Push¶
Pipeline script executed when pushing to the release branch. Creates a full production release with versioned artifacts, Docker images, documentation, and a GitHub Release.
Usage¶
Version Format¶
The version is generated automatically from the current timestamp:
Example: 2026.01.31.18.45
This version is used for the JAR manifest, Docker image tags, Git tag, and GitHub Release title.
Pipeline Steps¶
The script executes 6 steps sequentially. Step 1 is disabled in the script and recorded as passed: release.yml only runs the script after its Verify Develop Run job has found a successful Develop workflow run whose tested tree is identical to the tree being released (see Testing → CI/CD Integration). Steps 3–6 are skipped if any previous step failed.
| Step | Name | Description |
|---|---|---|
| 1 | Run All Tests (with Coverage) | Disabled — kept in the script for reference; marked as passed |
| 2 | Package Versioned JAR | Runs mvn package -DskipTests -Drevision=<version> to produce target/kete.jar with the version imprinted in META-INF/MANIFEST.MF, then runs run-jar-check.ps1 to make sure every bundled class is relocated |
| 3 | Build and Push Versioned Docker Images | Auto-discovers images from quick-starts/$images/, builds each with Docker, tags as :<version> and :latest, pushes only the :<version> tag to ghcr.io/fortunen/kete |
| 4 | Build Documentation Site | Runs python -m mkdocs build --strict to validate and build the documentation site |
| 5 | Create Git Tag and GitHub Release | Creates an annotated Git tag, pushes it to origin, then creates a GitHub Release via gh release create --generate-notes with the JAR attached |
| 6 | Move :latest Image Tags |
Pushes the :latest tag of every image — only after the Git tag and GitHub Release exist, so :latest never points at an unreleased build |
Coverage Badge¶
The script does not produce the badge. run-on-develop-push.ps1 generates coverage-badge.json and the Develop workflow uploads it as the coverage-badge artifact; release.yml downloads that artifact from the Develop run that tested the released tree and publishes it with the documentation site at https://fortunen.github.io/kete/coverage-badge.json, which the README badge reads. If the artifact is unavailable, the committed coverage-badge.json is published instead.
Docker Image Discovery¶
Images are discovered automatically from the quick-starts/$images/ directory. Each subdirectory becomes an image named quick-start-<subdirectory>.
- Registry:
ghcr.io/fortunen/kete - Tags per image:
:<version>(pushed in step 3) and:latest(pushed in step 6) - The
keycloakimage uses the repository root as its build context (for multi-stage Maven builds); all other images use their own directory as context
GitHub Release¶
The release is created using the GitHub CLI (gh):
- Tag name: the generated version (e.g.,
2026.01.31.18.45) - Title: same as tag name
- Attachment:
target/kete.jar - Notes: generated by GitHub from the commits and pull requests since the previous release (
--generate-notes)
Exit Codes¶
| Code | Meaning |
|---|---|
0 |
All 6 steps completed successfully |
1 |
One or more steps failed |
Prerequisites¶
- PowerShell 7+
- Java 21
- Maven
- Docker
- Python with
mkdocs-materialandmkdocs-include-markdown-plugin - GitHub CLI (
gh) authenticated - Push access to
ghcr.io/fortunen/kete - Push access to the Git repository
Sample Output¶
══════════════════════════════════════════════════════════════════════════════════
KETE │ Release Push
Creating production release 2026.01.31.18.45
══════════════════════════════════════════════════════════════════════════════════
┌──────────────────────────────────────────────────────────────────────────┐
│ STEP 2 of 6 │ PACKAGE VERSIONED JAR │
└──────────────────────────────────────────────────────────────────────────┘
✓ kete.jar (12.45 MB)
┌──────────────────────────────────────────────────────────────────────────┐
│ STEP 3 of 6 │ BUILD AND PUSH DOCKER IMAGES │
└──────────────────────────────────────────────────────────────────────────┘
✓ quick-start-keycloak [:2026.01.31.18.45]
✓ quick-start-activemq-artemis [:2026.01.31.18.45]
✓ quick-start-mosquitto [:2026.01.31.18.45]
...47 more images...
✓ quick-start-zeromq-subscriber [:2026.01.31.18.45]
┌──────────────────────────────────────────────────────────────────────────┐
│ STEP 4 of 6 │ BUILD DOCUMENTATION SITE │
└──────────────────────────────────────────────────────────────────────────┘
✓ Documentation site built successfully
┌──────────────────────────────────────────────────────────────────────────┐
│ STEP 5 of 6 │ CREATE GIT TAG AND GITHUB RELEASE │
└──────────────────────────────────────────────────────────────────────────┘
✓ Git tag 2026.01.31.18.45
✓ GitHub Release 2026.01.31.18.45
┌──────────────────────────────────────────────────────────────────────────┐
│ STEP 6 of 6 │ MOVE :LATEST IMAGE TAGS │
└──────────────────────────────────────────────────────────────────────────┘
✓ quick-start-keycloak [:latest]
...49 more images...
══════════════════════════════════════════════════════════════════════════════════
RELEASE SUMMARY │ 2026.01.31.18.45
══════════════════════════════════════════════════════════════════════════════════
Release Artifact:
kete.jar (2026.01.31.18.45)
Docker Images Published:
ghcr.io/fortunen/kete/quick-start-keycloak:2026.01.31.18.45
ghcr.io/fortunen/kete/quick-start-activemq-artemis:2026.01.31.18.45
...and 48 more images (50 in total)
GitHub Release:
https://github.com/FortuneN/kete/releases/tag/2026.01.31.18.45
╔══════════════════════════════════════════════════════════════════════╗
║ ║
║ ✓ RELEASE 2026.01.31.18.45 PUBLISHED SUCCESSFULLY ║
║ ║
╚══════════════════════════════════════════════════════════════════════╝