fix(ci): publish GHCR :dev on version-bump so image matches tip

Branch pushes skipped [version-bump] builds and labeled images from the
feature commit (VERSION N), so :dev stayed one patch behind git tip (#401).
Build only on version-bump commits; AIO :dev is amd64-only to avoid 6h cancels.

Refs #401

Thanks: INSOLVE (Honorary); Marco Jakobs (@jacotec); MyNameisStitch (@MyNameisStitch); Redspin (@playerumpknow)
This commit is contained in:
UNITRONIX
2026-09-03 21:30:35 +02:00
parent 1b04161e52
commit 792a67d51d
4 changed files with 33 additions and 10 deletions
+28 -8
View File
@@ -12,8 +12,14 @@
# - git tag v* / GitHub Release (stable): semver, v*, major.minor, latest
# - workflow_dispatch: latest + VERSION when tag empty/latest; else custom tag
#
# Skip: branch pushes whose head commit message contains [version-bump].
# Tag pushes and release/dispatch always build (even when the tagged commit is a bump).
# Branch pushes (main/dev): build ONLY on [version-bump] commits so GHCR image
# VERSION matches tip (auto-bump runs after the feature commit; building the
# feature SHA left :dev/:latest one patch behind — #401). Feature commits skip.
# Tag pushes, release, and workflow_dispatch always build.
#
# AIO on dev branch pushes: linux/amd64 only (multi-arch AIO often hit the 6h
# Actions limit). Console/server stay multi-arch; main/tags/release/dispatch
# keep full amd64+arm64 for AIO.
#
# Triggers: push main/dev (path-filtered), push tag v*, release published, manual
# =============================================================================
@@ -68,13 +74,12 @@ jobs:
build-server:
needs: read-version
# Build on release/dispatch always; on push build tags always; on branch
# push skip [version-bump] commits only.
# Release/dispatch/tags always; branch pushes only on [version-bump] (#401).
if: |
github.event_name == 'workflow_dispatch' ||
github.event_name == 'release' ||
(github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')) ||
(github.event_name == 'push' && !contains(github.event.head_commit.message, '[version-bump]'))
(github.event_name == 'push' && contains(github.event.head_commit.message, '[version-bump]'))
runs-on: ubuntu-latest
permissions:
contents: read
@@ -162,11 +167,12 @@ jobs:
build-console:
needs: read-version
# Release/dispatch/tags always; branch pushes only on [version-bump] (#401).
if: |
github.event_name == 'workflow_dispatch' ||
github.event_name == 'release' ||
(github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')) ||
(github.event_name == 'push' && !contains(github.event.head_commit.message, '[version-bump]'))
(github.event_name == 'push' && contains(github.event.head_commit.message, '[version-bump]'))
runs-on: ubuntu-latest
permissions:
contents: read
@@ -219,12 +225,15 @@ jobs:
build-allinone:
needs: read-version
# Release/dispatch/tags always; branch pushes only on [version-bump] (#401).
if: |
github.event_name == 'workflow_dispatch' ||
github.event_name == 'release' ||
(github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')) ||
(github.event_name == 'push' && !contains(github.event.head_commit.message, '[version-bump]'))
(github.event_name == 'push' && contains(github.event.head_commit.message, '[version-bump]'))
runs-on: ubuntu-latest
# Multi-arch AIO on dev has hit the 6h Actions limit (#401); fail sooner if stuck.
timeout-minutes: 240
permissions:
contents: read
packages: write
@@ -242,6 +251,17 @@ jobs:
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Resolve AIO platforms
id: plats
run: |
# Dev branch pushes: amd64 only (faster :dev republish). Full multi-arch
# on main, tags, release, and workflow_dispatch.
if [ "${{ github.event_name }}" = "push" ] && [ "${{ github.ref }}" = "refs/heads/dev" ]; then
echo "platforms=linux/amd64" >> "$GITHUB_OUTPUT"
else
echo "platforms=linux/amd64,linux/arm64" >> "$GITHUB_OUTPUT"
fi
- name: Extract metadata
id: meta
uses: docker/metadata-action@v6
@@ -273,7 +293,7 @@ jobs:
BETTERDESK_PRODUCT_VERSION=${{ needs.read-version.outputs.version }}
cache-from: type=gha
cache-to: type=gha,mode=max
platforms: linux/amd64,linux/arm64
platforms: ${{ steps.plats.outputs.platforms }}
update-description:
needs: [build-server, build-console, build-allinone]
+3
View File
@@ -1,5 +1,8 @@
## [Unreleased]
### Fixed
- **GHCR `:dev` product version lag behind git tip (#401):** `docker-publish.yml` built images from the feature commit (VERSION N) then skipped the following `[version-bump]` commit (N+1), so pulled `:dev` images showed a stale semver. Branch pushes now publish only on `[version-bump]` commits so the baked VERSION matches tip. All-in-one `:dev` builds use `linux/amd64` only (multi-arch AIO was hitting the 6h Actions limit and cancelling); console/server stay multi-arch.
### Changed
- _(none yet)_
+1 -1
View File
@@ -97,7 +97,7 @@ When the console runs from `ghcr.io/.../betterdesk-console` (see `docker-compose
After pulling new images, recreate containers so the console picks up the embedded commit from the new image tag.
**GHCR tags:** prefer pinning `BETTERDESK_IMAGE_TAG` to a release semver (compose / `install.sh` default). `latest` is the rolling tip of the last successful **stable** image publish (Release / `main`); `dev` tracks development branch builds. See [DOCKER_QUICKSTART.md](../docker/DOCKER_QUICKSTART.md) and [#387](https://github.com/UNITRONIX/BetterDesk/issues/387).
**GHCR tags:** prefer pinning `BETTERDESK_IMAGE_TAG` to a release semver (compose / `install.sh` default). `latest` is the rolling tip of the last successful **stable** image publish (Release / `main`); `dev` tracks development branch builds and is published on each `[version-bump]` commit so the image VERSION matches git tip (#401). See [DOCKER_QUICKSTART.md](../docker/DOCKER_QUICKSTART.md), [#387](https://github.com/UNITRONIX/BetterDesk/issues/387), and [#401](https://github.com/UNITRONIX/BetterDesk/issues/401).
## Update channel (stable / development)
+1 -1
View File
@@ -115,7 +115,7 @@ UPDATE_GITHUB_BRANCH=dev # development
| `version-bump-main.yml` | PR merged to `main` | Minor bump, tag, GitHub Release |
| `version-verify.yml` | Push/PR touching version files | Fail if files disagree |
| `release-server.yml` | Tag `v*` | Go server binaries |
| `docker-publish.yml` | Tag, release, push to `main`/`dev` | GHCR images: `latest` on stable release/main; `dev` on `dev` pushes; semver on `v*` / Release |
| `docker-publish.yml` | Tag, release, push to `main`/`dev` | GHCR images: on **branch** pushes, builds only `[version-bump]` commits so image VERSION matches tip (#401); tags/release/dispatch always build. `latest` on stable release/main; `dev` on `dev` bumps; semver on `v*` / Release. AIO `:dev` is amd64-only; multi-arch on main/release/dispatch |
## First stable release note