For the complete documentation index, see llms.txt. This page is also available as Markdown.

Release & Versioning Strategy

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

Version Format

EDDI follows Semantic Versioning:

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/eddi.

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.yml.

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:


Release Signing

All Docker images pushed by CI are cryptographically signed using Sigstore cosign with keyless OIDC signing. This ensures that users can verify any image was built by the official labsai/EDDI GitHub Actions pipeline.

For full details on how signing works and how to verify images, see Release Signing & Verification.

Signed Git Tags

When creating release tags, use signed tags:

Last updated

Was this helpful?