ci(images): publish release and development images #26

Merged
ryan.mcgee merged 2 commits from ci/release-packages into main 2026-10-20 18:58:11 +00:00
Owner

Summary

  • Releases of Traefik Control had no published artifact. The Ecto adapter is chosen at compile time, so a release is one container image per database backend.
  • Follows jellyfin-sso-plugin for versioning (bare x.y.z tags matching the project version, release created by a workflow) and the helm repo for publishing (REGISTRY_TOKEN, skip already-published versions, link each package to the repository).
  • Branches get development images before they are merged; the highest release is tagged latest.

Changes

  • Containerfile: multi-stage mix release on Debian trixie, runs as uid 65534, DB build arg selects sqlite3 or postgres.
  • scripts/images.sh: shared build, push, retag and link logic; a version already in the registry is pulled and retagged, never rebuilt.
  • scripts/release.sh and .github/workflows/release.yml: on a bare version tag that equals the mix.exs version and is on main, publish traefik-control-sqlite3 and traefik-control-postgres, move latest only when the tag is the highest release, link the packages to the repo and create the release.
  • scripts/development.sh and .github/workflows/development.yml: every push to a branch other than main publishes <version>-dev.<sha7> and moves development.
  • .dockerignore and a README section describing the images, tags and release procedure.

Verification

  • PUSH=0 ENGINE=podman builds of both backends; SQLite image booted (migrations, login page and CSS 200, uid 65534); PostgreSQL image booted against a throwaway Postgres (22 migrations, login page 200).
  • Local tag logic: development and -dev.<sha> on both images; latest only on the highest tag; main and mismatched or v-prefixed tags rejected.
  • shellcheck -x and actionlint clean.
  • On the runner: the Development images workflow succeeded for this branch (docker and REGISTRY_TOKEN work), and the CI jobs passed.
  • Not run before merge: the release workflow (needs a tag) and mix precommit (no Elixir changes).
## Summary - Releases of Traefik Control had no published artifact. The Ecto adapter is chosen at compile time, so a release is one container image per database backend. - Follows jellyfin-sso-plugin for versioning (bare `x.y.z` tags matching the project version, release created by a workflow) and the helm repo for publishing (`REGISTRY_TOKEN`, skip already-published versions, link each package to the repository). - Branches get development images before they are merged; the highest release is tagged `latest`. ## Changes - `Containerfile`: multi-stage `mix release` on Debian trixie, runs as uid 65534, `DB` build arg selects `sqlite3` or `postgres`. - `scripts/images.sh`: shared build, push, retag and link logic; a version already in the registry is pulled and retagged, never rebuilt. - `scripts/release.sh` and `.github/workflows/release.yml`: on a bare version tag that equals the `mix.exs` version and is on `main`, publish `traefik-control-sqlite3` and `traefik-control-postgres`, move `latest` only when the tag is the highest release, link the packages to the repo and create the release. - `scripts/development.sh` and `.github/workflows/development.yml`: every push to a branch other than `main` publishes `<version>-dev.<sha7>` and moves `development`. - `.dockerignore` and a README section describing the images, tags and release procedure. ## Verification - `PUSH=0 ENGINE=podman` builds of both backends; SQLite image booted (migrations, login page and CSS 200, uid 65534); PostgreSQL image booted against a throwaway Postgres (22 migrations, login page 200). - Local tag logic: `development` and `-dev.<sha>` on both images; `latest` only on the highest tag; `main` and mismatched or `v`-prefixed tags rejected. - `shellcheck -x` and `actionlint` clean. - On the runner: the Development images workflow succeeded for this branch (docker and `REGISTRY_TOKEN` work), and the CI jobs passed. - Not run before merge: the release workflow (needs a tag) and `mix precommit` (no Elixir changes).
ci(release): publish container images on tags
All checks were successful
CI / format, compile, credo, dialyzer (pull_request) Successful in 1m17s
CI / tests (SQLite) (pull_request) Successful in 2m13s
CI / dependency audit (pull_request) Successful in 42s
CI / tests (PostgreSQL) (pull_request) Successful in 2m1s
418b7d477e
- add a production Containerfile; one image per database backend
  because the Ecto adapter is fixed at compile time
- add scripts/release.sh and a release workflow triggered by bare
  version tags matching mix.exs, as in jellyfin-sso-plugin
- push traefik-control-sqlite3 and traefik-control-postgres to the
  package registry, link them to the repository as the helm repo
  does, and create the release
- document the release procedure
ci(images): publish development images and latest
All checks were successful
CI / format, compile, credo, dialyzer (pull_request) Successful in 1m14s
CI / tests (SQLite) (pull_request) Successful in 2m17s
CI / tests (PostgreSQL) (pull_request) Successful in 2m19s
Development images / images (push) Successful in 6m25s
CI / dependency audit (pull_request) Successful in 1m32s
2e2b361d16
- build both images for every push to a branch other than main,
  versioned <version>-dev.<commit> and tagged development
- tag the highest release as latest; an older point release never
  moves it
- move the shared publishing steps into scripts/images.sh; a version
  already in the registry is pulled and retagged, never rebuilt
ryan.mcgee changed title from ci(release): publish container images on tags to ci(images): publish release and development images 2026-10-20 18:58:10 +00:00
ryan.mcgee deleted branch ci/release-packages 2026-10-20 18:58:11 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
White_Ghost_Cyber_Systems/traefik-control!26
No description provided.