Release & Versioning Strategy

Audience: Maintainers, contributors, and CI/CD operators.

Version Format

EDDI follows Semantic Versioningarrow-up-right:

MAJOR.MINOR.PATCH[-PRERELEASE]
Component
Meaning
Example

MAJOR

Breaking API/config changes

6.0.07.0.0

MINOR

New features, backward-compatible

6.0.06.1.0

PATCH

Bug fixes only

6.0.06.0.1

PRERELEASE

Release candidate or beta

6.0.0-RC1, 6.0.0-RC2

The canonical version lives in pom.xml (<version>6.0.0</version>) and is used for Maven artifacts and CI build tags.


Branching Model

main ─────────────────────────────────────── production

  │  merge when ready

feature/version-6.0.0 ───────────────────── active development
Branch
Purpose
Docker push?

main

Production-ready code

✅ Build tags on every push

feature/version-X.Y.Z

Active development branch

❌ No Docker push

Pull requests → main

Code review, CI validation

❌ Tests + preflight only


Docker Tag Strategy

All images are pushed to Docker Hub: labsai/eddiarrow-up-right.

Trigger
Docker Tags
Purpose

Push to main

labsai/eddi:6.0.0-b<N>

Continuous integration build. <N> is the GitHub Actions run number.

Git tag v6.0.0-RC1

labsai/eddi:6.0.0-RC1 + labsai/eddi:latest

Release candidate

Git tag v6.0.0

labsai/eddi:6.0.0 + labsai/eddi:latest

General availability release

Key rule: latest is only pushed on tag-based releases (RC or GA), never on regular main builds. This ensures docker pull labsai/eddi always gives users a deliberately released version.

Build Tags

Every push to main produces a unique, immutable build tag:

These are useful for:

  • Pinning deployments to a specific build

  • Debugging issues ("which exact build is running?")

  • Rolling back to a known-good build


How to Release

Release Candidate

This produces:

  • labsai/eddi:6.0.0-RC1 — the version-pinned tag

  • labsai/eddi:latest — updated to point to this RC

Subsequent Release Candidates

If RC1 needs fixes:

General Availability Release

Red Hat Certification Release

For Red Hat-certified images, use the separate workflow:

This builds, pushes, and submits the image to Red Hat's preflight certification system.


Skipping Docker Builds

For documentation, config, or non-code commits, add [skip docker] to the commit message:

This skips the Docker build and smoke test jobs, but tests still run.

Commit message
Tests
Docker build
Smoke test

feat: add new API endpoint

docs: update changelog [skip docker]

Any tag push (v6.0.0-RC1)

✅ (always)

[skip docker] is ignored on tag pushes — releases always build Docker images.


CI/CD Pipeline

The entire pipeline lives in a single file: .github/workflows/ci.ymlarrow-up-right.

Job Details

Job
Runs on
Condition
Duration

build-and-test

Every push/PR/tag

Always

~3-5 min

docker

Push to main or tag v*

[skip docker] to skip

~3-4 min

smoke-test

After docker succeeds

Same as docker

~1-2 min

preflight-check

Pull requests only

Always on PRs

~5-7 min

Secrets Required

Configure these in GitHub → Settings → Secrets → Actions:

Secret
Purpose

DOCKER_USERNAME

Docker Hub login

DOCKER_PASSWORD

Docker Hub access token

REDHAT_API_TOKEN

Red Hat certification (only for redhat-certify.yml)

REDHAT_CERT_PROJECT_ID

Red Hat project ID (only for redhat-certify.yml)


Local Preflight Check (Windows)

Run Red Hat certification checks locally without needing Linux:

Requires Docker Desktop for Windows. The preflight tool runs inside a Docker container — no WSL needed.


Version Lifecycle

After a GA Release

After tagging v6.0.0, update pom.xml on the feature branch to the next version:

Last updated

Was this helpful?