All checks were successful
Container-Image bauen und veröffentlichen / build-and-push (push) Successful in 2m22s
Der Workflow bricht weiter mit ENOSPC ab, jetzt in beiden npm-Stufen gleichzeitig nach 8,2 Sekunden - der Datentraeger ist praktisch voll. - prisma-cli baut auf deps statt auf base auf. Damit laufen die beiden npm-Installationen nacheinander statt parallel, was den gleichzeitigen Platzbedarf halbiert. Die deps-Schicht liegt ohnehin vor. - Der Workflow protokolliert vor dem Bauen Belegung, Inodes und docker system df. ENOSPC heisst auch "keine Inodes frei", was df -h nicht zeigt - beim naechsten Fehlschlag stehen die Zahlen im Log. - Ungenutzter Build-Cache aelter als 24h wird vor dem Bauen freigegeben. Jeder abgebrochene Versuch hinterlaesst sonst Schichten und macht es beim naechsten Mal enger. Betrifft nur Cache, keine Images, Volumes oder Container. Geprueft: Image baut mit serialisierten Stufen, Container startet, Migrationen laufen, Healthcheck gruen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
83 lines
2.7 KiB
YAML
83 lines
2.7 KiB
YAML
name: Container-Image bauen und veröffentlichen
|
||
|
||
on:
|
||
push:
|
||
branches: [main]
|
||
tags: ["v*"]
|
||
workflow_dispatch:
|
||
|
||
env:
|
||
REGISTRY: git.jfritzsche.de
|
||
IMAGE_NAME: jf/syncova-policies
|
||
|
||
jobs:
|
||
build-and-push:
|
||
runs-on: ubuntu-latest
|
||
|
||
steps:
|
||
- name: Quellcode auschecken
|
||
uses: actions/checkout@v4
|
||
|
||
- name: Image-Tags bestimmen
|
||
id: meta
|
||
run: |
|
||
IMAGE="${REGISTRY}/${IMAGE_NAME}"
|
||
SHA_TAG="${IMAGE}:$(echo "${GITHUB_SHA}" | cut -c1-7)"
|
||
TAGS="-t ${SHA_TAG}"
|
||
|
||
case "${GITHUB_REF}" in
|
||
refs/tags/v*)
|
||
VERSION="${GITHUB_REF#refs/tags/}"
|
||
TAGS="${TAGS} -t ${IMAGE}:${VERSION} -t ${IMAGE}:latest"
|
||
;;
|
||
refs/heads/main)
|
||
TAGS="${TAGS} -t ${IMAGE}:latest"
|
||
;;
|
||
esac
|
||
|
||
echo "tags=${TAGS}" >> "$GITHUB_OUTPUT"
|
||
echo "primary=${SHA_TAG}" >> "$GITHUB_OUTPUT"
|
||
echo "Tags: ${TAGS}"
|
||
|
||
# Der Token liegt als Actions-Secret REGISTRY_TOKEN im Repository,
|
||
# nicht im Klartext in dieser Datei.
|
||
- name: An der Registry anmelden
|
||
run: |
|
||
echo "${{ secrets.REGISTRY_TOKEN }}" \
|
||
| docker login "${REGISTRY}" -u "${{ gitea.actor }}" --password-stdin
|
||
|
||
# Der Build ist mehrfach mit ENOSPC abgebrochen. Damit im Fehlerfall die
|
||
# Zahlen im Log stehen: Plattenplatz UND Inodes – ENOSPC bedeutet auch
|
||
# "keine Inodes mehr frei", was `df -h` nicht zeigt.
|
||
- name: Plattenplatz vor dem Bauen
|
||
run: |
|
||
echo "── Belegung ──"; df -h /var/lib/docker / 2>/dev/null || df -h
|
||
echo "── Inodes ──"; df -i /var/lib/docker / 2>/dev/null || df -i
|
||
echo "── Docker ──"; docker system df
|
||
|
||
# Jeder abgebrochene Build lässt seine Schichten im Cache zurück; ohne
|
||
# Aufräumen wird es mit jedem Versuch enger. Entfernt wird ausschließlich
|
||
# ungenutzter Build-Cache – keine Images, keine Volumes, keine Container.
|
||
- name: Ungenutzten Build-Cache freigeben
|
||
run: |
|
||
docker builder prune --force --filter until=24h || true
|
||
echo "── Docker nach dem Aufräumen ──"; docker system df
|
||
|
||
- name: Image bauen
|
||
run: docker build ${{ steps.meta.outputs.tags }} .
|
||
|
||
- name: Plattenplatz nach dem Bauen
|
||
if: always()
|
||
run: df -h / 2>/dev/null; docker system df || true
|
||
|
||
- name: Image veröffentlichen
|
||
run: |
|
||
for tag in $(echo "${{ steps.meta.outputs.tags }}" | tr ' ' '\n' | grep -v '^-t$'); do
|
||
echo "Push ${tag}"
|
||
docker push "${tag}"
|
||
done
|
||
|
||
- name: Abmelden
|
||
if: always()
|
||
run: docker logout "${REGISTRY}" || true
|