CI: docker.yaml tags-Liste trigger-abhängig machen (Dev-Dispatch clobbert :latest/:canary) #2

Open
opened 2026-06-24 16:59:55 +02:00 by tobias · 0 comments
Owner

Problem

docker.yaml setzt in der build-push-action tags: unbedingt :${version} + :latest (+ :canary) — bei JEDEM Trigger. Da ein workflow_dispatch mit version-Input existiert, überschreibt ein manueller Dev-Build damit auch :latest/:canary mit unreleased Code → liefert ungetesteten Stand an alle :latest-GWs / Watchtower-Consumer.

Gefunden 2026-06-24 in WeckRuf (desktop-gw hing auf stale :dev, Release v0.6.0 kam nie an). Dieselbe Template-Struktur in allen TEC-Docker-Repos → Fleet-weit.

Lösung (umgesetzt + verifiziert in WeckRuf v0.7.1)

Tag-Liste TRIGGER-abhängig machen. :dev wird bewusst on-demand per workflow_dispatch-Klick gebaut — kein Auto-Build bei main-Push (ein voller Multi-Arch-Build amd64/arm64/arm/v7 pro main-Push wäre zu teuer; der Entwickler entscheidet selbst, wann ein Dev-Image entsteht).

1. Trigger (on:) unverändert lassen — KEIN branches: [main]

on:
  push:
    tags:
      - 'v*'
  workflow_dispatch:
    inputs:
      version:
        description: 'Image tag for on-demand dev build (e.g., dev, 1.4.0-rc1)'
        required: true
        default: 'dev'

2. Step einfügen, der Version + Tags trigger-abhängig bestimmt

- name: Determine version and tags
  id: meta
  run: |
    IMG="${REGISTRY}/${IMAGE_NAME}"
    if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
      # On-demand Dev-Build → NUR der angegebene Tag, nie :latest/:canary
      VERSION="${{ github.event.inputs.version }}"
      TAGS="${IMG}:${VERSION}"
    else
      # v*-Tag-Push = Release → :${version} + :latest + :canary
      VERSION="${GITHUB_REF_NAME#v}"
      TAGS="${IMG}:${VERSION},${IMG}:latest,${IMG}:canary"
    fi
    echo "version=${VERSION}" >> $GITHUB_OUTPUT
    echo "tags=${TAGS}" >> $GITHUB_OUTPUT
    echo "Building version: ${VERSION}"
    echo "Pushing tags: ${TAGS}"

Hinweis: workflow_dispatch MUSS zuerst über github.event_name abgefangen werden (nicht über $GITHUB_REF), sonst landet ein Dispatch vom main-Branch fälschlich im Release-Zweig. Die Release-/Dev-Unterscheidung der übrigen Fälle läuft über das Event, nicht über github.ref_type (in Forgejo nicht zuverlässig gesetzt).

3. build-push-action auf den Step-Output umstellen (hartes :latest/:canary entfernen)

- name: Build and push multi-arch image
  uses: docker/build-push-action@v6
  with:
    context: .
    push: true
    platforms: linux/amd64,linux/arm64,linux/arm/v7
    build-args: VERSION=${{ steps.meta.outputs.version }}
    tags: ${{ steps.meta.outputs.tags }}

(Falls der bestehende Workflow einen separaten Determine version-Step hat, in diesen meta-Step zusammenführen und alte steps.version.*-Referenzen auf steps.meta.* umstellen.)

Akzeptanz

  • Ein workflow_dispatch-Dev-Build pusht nur den angegebenen Tag (default :dev), nicht :latest/:canary
  • v*-Tag pusht weiterhin :${version} + :latest + :canary
  • Bewusst NICHT umgesetzt: kein Auto-:dev bei main-Push — :dev bleibt on-demand per Dispatch

Referenz

  • Umsetzung + Verifikation: WeckRuf docker.yaml, Release v0.7.1 (Commits 6f791f3, 9d44ab2, dcdc31f) — alle drei Tags :0.7.1/:latest/:canary als identisches Multi-Arch-Manifest verifiziert.
  • Pattern: ai-vault/memory/patterns/2026-06-24-docker-tag-list-trigger-dependent.md
## Problem `docker.yaml` setzt in der build-push-action `tags:` **unbedingt** `:${version}` + `:latest` (+ `:canary`) — bei JEDEM Trigger. Da ein `workflow_dispatch` mit `version`-Input existiert, überschreibt ein **manueller Dev-Build** damit auch `:latest`/`:canary` mit **unreleased** Code → liefert ungetesteten Stand an alle `:latest`-GWs / Watchtower-Consumer. Gefunden 2026-06-24 in **WeckRuf** (desktop-gw hing auf stale `:dev`, Release v0.6.0 kam nie an). Dieselbe Template-Struktur in allen TEC-Docker-Repos → Fleet-weit. ## Lösung (umgesetzt + verifiziert in WeckRuf v0.7.1) **Tag-Liste TRIGGER-abhängig machen. `:dev` wird bewusst _on-demand_ per `workflow_dispatch`-Klick gebaut — kein Auto-Build bei main-Push** (ein voller Multi-Arch-Build amd64/arm64/arm/v7 pro main-Push wäre zu teuer; der Entwickler entscheidet selbst, wann ein Dev-Image entsteht). ### 1. Trigger (`on:`) unverändert lassen — KEIN `branches: [main]` ```yaml on: push: tags: - 'v*' workflow_dispatch: inputs: version: description: 'Image tag for on-demand dev build (e.g., dev, 1.4.0-rc1)' required: true default: 'dev' ``` ### 2. Step einfügen, der Version + Tags trigger-abhängig bestimmt ```yaml - name: Determine version and tags id: meta run: | IMG="${REGISTRY}/${IMAGE_NAME}" if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then # On-demand Dev-Build → NUR der angegebene Tag, nie :latest/:canary VERSION="${{ github.event.inputs.version }}" TAGS="${IMG}:${VERSION}" else # v*-Tag-Push = Release → :${version} + :latest + :canary VERSION="${GITHUB_REF_NAME#v}" TAGS="${IMG}:${VERSION},${IMG}:latest,${IMG}:canary" fi echo "version=${VERSION}" >> $GITHUB_OUTPUT echo "tags=${TAGS}" >> $GITHUB_OUTPUT echo "Building version: ${VERSION}" echo "Pushing tags: ${TAGS}" ``` > Hinweis: `workflow_dispatch` MUSS zuerst über `github.event_name` abgefangen werden (nicht über `$GITHUB_REF`), sonst landet ein Dispatch vom `main`-Branch fälschlich im Release-Zweig. Die Release-/Dev-Unterscheidung der übrigen Fälle läuft über das Event, nicht über `github.ref_type` (in Forgejo nicht zuverlässig gesetzt). ### 3. build-push-action auf den Step-Output umstellen (hartes `:latest`/`:canary` entfernen) ```yaml - name: Build and push multi-arch image uses: docker/build-push-action@v6 with: context: . push: true platforms: linux/amd64,linux/arm64,linux/arm/v7 build-args: VERSION=${{ steps.meta.outputs.version }} tags: ${{ steps.meta.outputs.tags }} ``` (Falls der bestehende Workflow einen separaten `Determine version`-Step hat, in diesen `meta`-Step zusammenführen und alte `steps.version.*`-Referenzen auf `steps.meta.*` umstellen.) ## Akzeptanz - [ ] Ein `workflow_dispatch`-Dev-Build pusht **nur** den angegebenen Tag (default `:dev`), nicht `:latest`/`:canary` - [ ] `v*`-Tag pusht weiterhin `:${version}` + `:latest` + `:canary` - [ ] **Bewusst NICHT umgesetzt:** kein Auto-`:dev` bei main-Push — `:dev` bleibt on-demand per Dispatch ## Referenz - Umsetzung + Verifikation: WeckRuf `docker.yaml`, Release **v0.7.1** (Commits `6f791f3`, `9d44ab2`, `dcdc31f`) — alle drei Tags `:0.7.1`/`:latest`/`:canary` als identisches Multi-Arch-Manifest verifiziert. - Pattern: `ai-vault/memory/patterns/2026-06-24-docker-tag-list-trigger-dependent.md`
Sign in to join this conversation.
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
TEC/ntfy-user-provisioner#2
No description provided.