push als String statt Boolean, dazu ein Diagnoseschritt #6
No files matched your search
@@ -28,16 +28,37 @@ on:
|
|||||||
required: false
|
required: false
|
||||||
default: '0'
|
default: '0'
|
||||||
type: string
|
type: string
|
||||||
|
# Bewusst `type: string` und nicht `boolean` — siehe Issue #4. Auf dieser
|
||||||
|
# Gitea-Version (gemessen an 1.27.0) kommt eine boolesche
|
||||||
|
# workflow_call-Eingabe im aufgerufenen Workflow gar nicht an: weder ihre
|
||||||
|
# Vorgabe noch ein ausdruecklich uebergebenes `push: true`. `inputs.push`
|
||||||
|
# war in beiden Faellen leer, der Baustein baute immer im Pruefmodus und
|
||||||
|
# meldete dabei Erfolg. Alle Eingaben vom Typ string desselben Laufs
|
||||||
|
# (platforms, registry, image-owner, container-name) kamen korrekt an;
|
||||||
|
# push war die einzige boolesche und die einzige, die versagte.
|
||||||
|
#
|
||||||
|
# Wer das beim naechsten Aufraeumen "korrekt" auf boolean zurueckstellt,
|
||||||
|
# holt den Fehler still zurueck: nichts wird veroeffentlicht, und der
|
||||||
|
# Lauf bleibt gruen.
|
||||||
|
#
|
||||||
|
# Die Bedingung `inputs.push && inputs.push != 'false'` musste dafuer
|
||||||
|
# nicht angefasst werden. Sie wurde seinerzeit ausdruecklich so gebaut,
|
||||||
|
# dass sie Boolean und String vertraegt (Begruendung am
|
||||||
|
# 1Password-Schritt), und traegt die Umstellung unveraendert: 'true' ist
|
||||||
|
# truthy und ungleich 'false', 'false' ist truthy aber gleich 'false'.
|
||||||
push:
|
push:
|
||||||
description: >-
|
description: >-
|
||||||
Whether the built image is pushed. With push: false no credentials are
|
Whether the built image is pushed, as the string 'true' or 'false'.
|
||||||
fetched from 1Password and no registry login happens, so the workflow
|
Deliberately a string, not a boolean: boolean workflow_call inputs do
|
||||||
doubles as a build check. Caveat: the checkout token comes from the
|
not reach the called workflow on this Gitea version (see issue #4).
|
||||||
same 1Password step, so without push the checkout falls back to the
|
With push: 'false' no credentials are fetched from 1Password and no
|
||||||
job token — which cannot clone private submodules.
|
registry login happens, so the workflow doubles as a build check.
|
||||||
|
Caveat: the checkout token comes from the same 1Password step, so
|
||||||
|
without push the checkout falls back to the job token — which cannot
|
||||||
|
clone private submodules.
|
||||||
required: false
|
required: false
|
||||||
default: true
|
default: 'true'
|
||||||
type: boolean
|
type: string
|
||||||
container-name:
|
container-name:
|
||||||
required: true
|
required: true
|
||||||
type: string
|
type: string
|
||||||
@@ -113,6 +134,24 @@ jobs:
|
|||||||
# gesetzt, bleibt die Variable leer und Docker nutzt seinen Default.
|
# gesetzt, bleibt die Variable leer und Docker nutzt seinen Default.
|
||||||
DOCKER_HOST: ${{ vars.DOCKER_HOST }}
|
DOCKER_HOST: ${{ vars.DOCKER_HOST }}
|
||||||
steps:
|
steps:
|
||||||
|
# Issue #4 blieb so lange unbemerkt, weil nirgends sichtbar war, was
|
||||||
|
# ueberhaupt ankommt — und weil ein Lauf ohne Push genauso gruen aussieht
|
||||||
|
# wie einer mit. Der Schritt macht beides sichtbar: den rohen Wert der
|
||||||
|
# Eingabe und den daraus abgeleiteten Modus. Gleiches Muster wie
|
||||||
|
# "Docker-Socket ermitteln": rein informativ, mit `|| true` abgesichert,
|
||||||
|
# damit er den Job unter keinen Umstaenden scheitern laesst.
|
||||||
|
#
|
||||||
|
# Der Wert wird ueber die Umgebung gereicht statt in die Kommandozeile
|
||||||
|
# interpoliert; so bleibt er auch dann harmlos, wenn ein Aufrufer etwas
|
||||||
|
# Unerwartetes uebergibt.
|
||||||
|
- name: Eingaben melden
|
||||||
|
env:
|
||||||
|
PUSH_ROH: ${{ inputs.push }}
|
||||||
|
PUSH_MODUS: ${{ (inputs.push && inputs.push != 'false') && 'veroeffentlichen' || 'nur bauen' }}
|
||||||
|
run: |
|
||||||
|
echo "push (roh): '${PUSH_ROH}'" || true
|
||||||
|
echo "Modus: ${PUSH_MODUS}" || true
|
||||||
|
|
||||||
# Der Token, den Gitea jedem Job stellt, taugt fuer zwei Dinge nicht:
|
# Der Token, den Gitea jedem Job stellt, taugt fuer zwei Dinge nicht:
|
||||||
# Er gilt nur fuer das ausfuehrende Repository, waehrend die Submodule in
|
# Er gilt nur fuer das ausfuehrende Repository, waehrend die Submodule in
|
||||||
# eigenen, privaten Repositories liegen — deren Klon scheitert an
|
# eigenen, privaten Repositories liegen — deren Klon scheitert an
|
||||||
@@ -135,6 +174,12 @@ jobs:
|
|||||||
# Strings sind truthy), `inputs.push == 'true'` waere beim echten Boolean
|
# Strings sind truthy), `inputs.push == 'true'` waere beim echten Boolean
|
||||||
# true falsch (ein Vergleich ueber Typgrenzen laeuft ueber Zahlen, 'true'
|
# true falsch (ein Vergleich ueber Typgrenzen laeuft ueber Zahlen, 'true'
|
||||||
# wird dabei zu NaN). Die Kombination aus beidem deckt alle vier Faelle ab.
|
# wird dabei zu NaN). Die Kombination aus beidem deckt alle vier Faelle ab.
|
||||||
|
#
|
||||||
|
# Genau deshalb blieb sie bei der Umstellung von push auf `type: string`
|
||||||
|
# (Issue #4) unveraendert: sie war von Anfang an fuer beide Schreibweisen
|
||||||
|
# gebaut. 'true' ergibt wahr, 'false' ergibt falsch, ein leerer Wert
|
||||||
|
# ergibt falsch — und die Boolean-Faelle gelten unveraendert weiter,
|
||||||
|
# falls ein Aufrufer doch einmal ein YAML-Boolean uebergibt.
|
||||||
- name: Zugangsdaten aus 1Password laden
|
- name: Zugangsdaten aus 1Password laden
|
||||||
id: op-secrets
|
id: op-secrets
|
||||||
if: ${{ inputs.push && inputs.push != 'false' }}
|
if: ${{ inputs.push && inputs.push != 'false' }}
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ Gepusht wird unter fünf Tags:
|
|||||||
Der Checkout holt Submodule mit; die Zugangsdaten dafür und für die Registry
|
Der Checkout holt Submodule mit; die Zugangsdaten dafür und für die Registry
|
||||||
kommen zur Laufzeit aus 1Password Connect.
|
kommen zur Laufzeit aus 1Password Connect.
|
||||||
|
|
||||||
Mit `push: false` entfällt der Push — der Baustein baut dann nur. Damit nutzt
|
Mit `push: 'false'` entfällt der Push — der Baustein baut dann nur. Damit nutzt
|
||||||
die CI eines Projekts dieselbe Bau-Logik wie das Deployment, statt sie zu
|
die CI eines Projekts dieselbe Bau-Logik wie das Deployment, statt sie zu
|
||||||
duplizieren. Siehe [Prüfmodus](#prüfmodus-ohne-push).
|
duplizieren. Siehe [Prüfmodus](#prüfmodus-ohne-push).
|
||||||
|
|
||||||
@@ -37,7 +37,7 @@ duplizieren. Siehe [Prüfmodus](#prüfmodus-ohne-push).
|
|||||||
| `dockerfile` | ja | — | Pfad zum Dockerfile |
|
| `dockerfile` | ja | — | Pfad zum Dockerfile |
|
||||||
| `docker-context` | ja | — | Build-Kontext |
|
| `docker-context` | ja | — | Build-Kontext |
|
||||||
| `image-owner` | ja | — | Eigentümer-Segment des Images, also der mittlere Teil von `<registry>/<owner>/<name>` |
|
| `image-owner` | ja | — | Eigentümer-Segment des Images, also der mittlere Teil von `<registry>/<owner>/<name>` |
|
||||||
| `push` | nein | `true` | Ob das Image gepusht wird. Bei `false` werden keine Zugangsdaten aus 1Password geholt und es findet kein Registry-Login statt — siehe [Prüfmodus](#prüfmodus-ohne-push) |
|
| `push` | nein | `'true'` | Zeichenkette `'true'` oder `'false'`. Ob das Image gepusht wird. Bei `'false'` werden keine Zugangsdaten aus 1Password geholt und es findet kein Registry-Login statt — siehe [Prüfmodus](#prüfmodus-ohne-push) |
|
||||||
| `registry` | nein | `git.jk-dev.de` | Registry, für die getaggt und — beim Push — bei der angemeldet wird |
|
| `registry` | nein | `git.jk-dev.de` | Registry, für die getaggt und — beim Push — bei der angemeldet wird |
|
||||||
| `version-number` | nein | `0.0.0` | Vollständige Version, wird als Tag gesetzt |
|
| `version-number` | nein | `0.0.0` | Vollständige Version, wird als Tag gesetzt |
|
||||||
| `version-number-major` | nein | `0` | Major-Anteil für die mitwandernden Tags |
|
| `version-number-major` | nein | `0` | Major-Anteil für die mitwandernden Tags |
|
||||||
@@ -52,6 +52,23 @@ ist je Projekt verschieden und soll nie stillschweigend geraten werden — genau
|
|||||||
das war der Fehler des früher fest verdrahteten `suer`, unter dem die Images
|
das war der Fehler des früher fest verdrahteten `suer`, unter dem die Images
|
||||||
aller Projekte landeten. Die Registry ist dagegen praktisch immer dieselbe.
|
aller Projekte landeten. Die Registry ist dagegen praktisch immer dieselbe.
|
||||||
|
|
||||||
|
`push` ist eine Zeichenkette und kein Boolean — und das ist Absicht. Auf dieser
|
||||||
|
Gitea-Version (gemessen an 1.27.0) werden **boolesche `workflow_call`-Eingaben
|
||||||
|
nicht an den aufgerufenen Workflow durchgereicht**: Weder ihre Vorgabe noch ein
|
||||||
|
ausdrücklich übergebenes `push: true` kamen an, `inputs.push` blieb leer, und
|
||||||
|
der Baustein baute immer im Prüfmodus — bei grünem Lauf. Alle Eingaben vom Typ
|
||||||
|
`string` kamen im selben Lauf korrekt an. Details in
|
||||||
|
[Issue #4](https://git.jk-dev.de/workflow-util/pipelines/issues/4).
|
||||||
|
|
||||||
|
Deshalb bitte immer in Anführungszeichen schreiben: `push: 'true'` bzw.
|
||||||
|
`push: 'false'`. Ein unquotiertes `push: false` ist im YAML ein Boolean und
|
||||||
|
wird verschluckt.
|
||||||
|
|
||||||
|
> **Brechende Änderung gegenüber `v1`.** Aufrufer, die `push` als YAML-Boolean
|
||||||
|
> übergeben, müssen auf `@v2` wechseln und dabei auf die Schreibweise mit
|
||||||
|
> Anführungszeichen umstellen. Wer `@v1` weiterverwendet, behält das alte
|
||||||
|
> Verhalten samt Fehler.
|
||||||
|
|
||||||
Die vier Versionsangaben dienen ausschließlich der Tag-Liste. Sie sind keine
|
Die vier Versionsangaben dienen ausschließlich der Tag-Liste. Sie sind keine
|
||||||
Pflicht mehr, damit ein Prüflauf keine Platzhalter erfinden muss; wer pusht,
|
Pflicht mehr, damit ein Prüflauf keine Platzhalter erfinden muss; wer pusht,
|
||||||
übergibt sie wie bisher. Ihre Vorgabe ist bewusst `0.0.0` und nicht leer — die
|
übergibt sie wie bisher. Ihre Vorgabe ist bewusst `0.0.0` und nicht leer — die
|
||||||
@@ -63,7 +80,7 @@ Tag-Liste wird auch ohne Push gebildet, und ein leerer Wert ergäbe das ungülti
|
|||||||
```yaml
|
```yaml
|
||||||
jobs:
|
jobs:
|
||||||
image:
|
image:
|
||||||
uses: workflow-util/pipelines/.gitea/workflows/docker-build-push.yml@v1
|
uses: workflow-util/pipelines/.gitea/workflows/docker-build-push.yml@v2
|
||||||
with:
|
with:
|
||||||
version-number: 2026.09.1
|
version-number: 2026.09.1
|
||||||
version-number-major: '2026'
|
version-number-major: '2026'
|
||||||
@@ -73,6 +90,7 @@ jobs:
|
|||||||
dockerfile: ./Dockerfile
|
dockerfile: ./Dockerfile
|
||||||
docker-context: .
|
docker-context: .
|
||||||
image-owner: bekemeyer-klein
|
image-owner: bekemeyer-klein
|
||||||
|
push: 'true'
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -81,7 +99,7 @@ dem aufrufenden Repository.
|
|||||||
|
|
||||||
#### Prüfmodus ohne Push
|
#### Prüfmodus ohne Push
|
||||||
|
|
||||||
Mit `push: false` baut der Baustein nur und veröffentlicht nichts. Es werden
|
Mit `push: 'false'` baut der Baustein nur und veröffentlicht nichts. Es werden
|
||||||
dann keine Zugangsdaten aus 1Password geholt und es findet kein Registry-Login
|
dann keine Zugangsdaten aus 1Password geholt und es findet kein Registry-Login
|
||||||
statt. Die CI eines Projekts nutzt damit dieselbe Bau-Logik wie das Deployment,
|
statt. Die CI eines Projekts nutzt damit dieselbe Bau-Logik wie das Deployment,
|
||||||
statt sie zu duplizieren.
|
statt sie zu duplizieren.
|
||||||
@@ -91,15 +109,21 @@ Weder Secrets noch Versionsangaben sind dafür nötig:
|
|||||||
```yaml
|
```yaml
|
||||||
jobs:
|
jobs:
|
||||||
build-check:
|
build-check:
|
||||||
uses: workflow-util/pipelines/.gitea/workflows/docker-build-push.yml@v1
|
uses: workflow-util/pipelines/.gitea/workflows/docker-build-push.yml@v2
|
||||||
with:
|
with:
|
||||||
container-name: bk-dev-website
|
container-name: bk-dev-website
|
||||||
dockerfile: ./Dockerfile
|
dockerfile: ./Dockerfile
|
||||||
docker-context: .
|
docker-context: .
|
||||||
image-owner: bekemeyer-klein
|
image-owner: bekemeyer-klein
|
||||||
push: false
|
push: 'false'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Die Anführungszeichen sind nicht kosmetisch: `push: false` ohne sie ist ein
|
||||||
|
YAML-Boolean und kommt im Baustein nicht an (siehe oben). Es griffe dann die
|
||||||
|
Vorgabe `'true'`, der Lauf versuchte also trotz `push: false` zu
|
||||||
|
veröffentlichen — sofern Gitea die Typabweichung nicht ohnehin als Fehler
|
||||||
|
zurückweist.
|
||||||
|
|
||||||
> **Private Submodule funktionieren in diesem Modus nicht.**
|
> **Private Submodule funktionieren in diesem Modus nicht.**
|
||||||
> Der Checkout-Token stammt aus demselben 1Password-Schritt, der ohne Push
|
> Der Checkout-Token stammt aus demselben 1Password-Schritt, der ohne Push
|
||||||
> übersprungen wird. Der Checkout fällt deshalb auf den Standard-Token des Jobs
|
> übersprungen wird. Der Checkout fällt deshalb auf den Standard-Token des Jobs
|
||||||
@@ -129,7 +153,7 @@ und müssen in Gitea nicht hinterlegt werden.
|
|||||||
Aufrufe bitte immer an einen Tag binden:
|
Aufrufe bitte immer an einen Tag binden:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
uses: workflow-util/pipelines/.gitea/workflows/docker-build-push.yml@v1 # so
|
uses: workflow-util/pipelines/.gitea/workflows/docker-build-push.yml@v2 # so
|
||||||
uses: workflow-util/pipelines/.gitea/workflows/docker-build-push.yml@main # nicht so
|
uses: workflow-util/pipelines/.gitea/workflows/docker-build-push.yml@main # nicht so
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -140,3 +164,8 @@ im jeweiligen Projekt.
|
|||||||
|
|
||||||
Änderungen hier bekommen deshalb einen neuen Tag. Bricht eine Änderung
|
Änderungen hier bekommen deshalb einen neuen Tag. Bricht eine Änderung
|
||||||
bestehende Aufrufe, wird der Major-Anteil erhöht.
|
bestehende Aufrufe, wird der Major-Anteil erhöht.
|
||||||
|
|
||||||
|
`v2` ist genau so ein Fall: Die Umstellung von `push` auf `type: string` bricht
|
||||||
|
Aufrufe, die den Wert als YAML-Boolean übergeben. `v1` bleibt unverändert
|
||||||
|
stehen; wer umstellt, wechselt auf `@v2` und schreibt `push: 'true'` bzw.
|
||||||
|
`push: 'false'`.
|
||||||
Reference in new issue
Block a user