Skip to content

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

.\run-on-release-push.ps1

Version Format

The version is generated automatically from the current timestamp:

yyyy.MM.dd.HH.mm

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 keycloak image 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-material and mkdocs-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               ║
  ║                                                                      ║
  ╚══════════════════════════════════════════════════════════════════════╝