server-up/.forgejo/workflows/build.yml
Ramon 42bd87047a
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 12m38s
v0.8.20-beta - Prometheus startte niet, en 23 apps erbij
- apps/prometheus was kapot: het koppelde een lege map op /etc/prometheus en
  startte met --config.file naar een bestand dat er nooit kwam. Er zit nu een
  startconfiguratie bij, met koppelvelden naar node-exporter en cAdvisor
- De meeste apps van deze ronde zijn de ontbrekende helft van wat er al stond:
  node-exporter, cAdvisor en Alertmanager maken Prometheus bruikbaar; Loki en
  Alloy bewaren logs waar Dozzle alleen live meekijkt; Unbound zoekt DNS zelf op
  in plaats van door te vragen aan Google of Cloudflare
- Domeinen die ontbraken: evcc (energie), Healthchecks (cronbewaking),
  Infisical (geheimen voor applicaties), Music Assistant, pgAdmin
- Verder Crafty, Manyfold, ErsatzTV, FitTrackee, ComfyUI, Omada, en de zwaardere
  Zabbix, Graylog, Wazuh, NetBox, Seafile en OpenCloud. Van 218 naar 241 apps
- Nieuw tools/controleer_images.py: controleert of elk image echt bestaat. De
  ad-hoc versie draaide met zestien verzoeken tegelijk en meldde negen
  ontbrekende images die alle negen wel bestonden -- registries knijpen af, en
  dat is niet te onderscheiden van een ontbrekend image. Nu vier tegelijk met
  opnieuw proberen, en als stap in de drie workflows

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9eqpADJSRs49SoGGr4NAy
2026-08-01 04:06:26 +02:00

146 lines
5.5 KiB
YAML

# Forgejo Actions — bouw het image en push het naar de container-registry.
#
# Dit image is wat de "Nu bijwerken"-knop in Server Up ophaalt. Draait bij elke
# v*-tag, zodat elke release (en pre-release) een image krijgt met dezelfde tag
# als de release zelf: v0.5.10 → server-up:0.5.10.
#
# Vereisten (Repository → Settings):
# Variables → REGISTRY = git.example.com (host van je Forgejo)
# OWNER = bes-r (gebruiker/organisatie)
# Secrets → PACKAGE_TOKEN = <token met write:package>
#
# Zie docs/updates.md voor de complete instelling.
name: Build en push image (handmatig)
# Alleen handmatig. Bij een v*-tag bouwt en pusht deploy-prod.yml het image al
# in dezelfde job — zo kan er geen wachtrij ontstaan waarin de deploy op een
# build wacht die zelf nog in de rij staat.
on:
workflow_dispatch:
inputs:
tag:
description: "Versie om te bouwen (bv. 0.5.10). Leeg = VERSION-bestand"
required: false
jobs:
build:
runs-on: [self-hosted, prod]
timeout-minutes: 30
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Versie en tags bepalen
id: meta
run: |
set -euo pipefail
VERSION="${{ inputs.tag }}"
if [ -z "$VERSION" ]; then
VERSION="$(tr -d '[:space:]' < VERSION)"
fi
IMAGE="${{ vars.REGISTRY }}/${{ vars.OWNER }}/server-up"
echo "VERSION=${VERSION}" >> "$GITHUB_ENV"
echo "IMAGE=${IMAGE}" >> "$GITHUB_ENV"
# Pre-release (tag met een streepje, bv. v0.5.10-beta1) krijgt géén
# 'latest'-tag: die hoort bij het stable-kanaal.
if [[ "$VERSION" == *-* ]]; then
echo "EXTRA_TAG=beta" >> "$GITHUB_ENV"
else
echo "EXTRA_TAG=latest" >> "$GITHUB_ENV"
fi
echo "Bouwen: ${IMAGE}:${VERSION}"
- name: Tests draaien
run: |
set -euo pipefail
# In een container in plaats van een venv op de runner: die heeft
# geen python3-venv, en zo draaien de tests bovendien op exact de
# Python-versie waarop de app in productie draait.
# PYTHONDONTWRITEBYTECODE + no:cacheprovider voorkomen dat er
# root-eigen bestanden in de werkmap achterblijven.
docker run --rm \
-v "$PWD:/w" -w /w \
-v su-pip-cache:/root/.cache/pip \
-e PYTHONDONTWRITEBYTECODE=1 \
python:3.12-slim \
sh -c "pip install -q -r server-up/requirements.txt pytest \
&& python -m pytest tests -q -p no:cacheprovider"
- name: Compose-bestanden valideren
run: |
set -euo pipefail
# De testsuite controleert of de sjablonen geldige YAML opleveren.
# Of `docker compose` ze ook accepteert is een andere vraag: een
# depends_on in de verkeerde vorm of network_mode naast networks is
# prima YAML en een kapotte stack. Dat merk je anders pas als iemand
# de app installeert.
#
# Renderen kan alleen waar Python staat (in de container), valideren
# alleen waar Docker staat (op de runner). Vandaar twee helften.
docker run --rm \
-v "$PWD:/w" -w /w \
-v su-pip-cache:/root/.cache/pip \
-e PYTHONDONTWRITEBYTECODE=1 \
python:3.12-slim \
sh -c "pip install -q -r server-up/requirements.txt \
&& python tools/render_voor_validatie.py .compose-check \
&& chown -R $(id -u):$(id -g) .compose-check"
fouten=0
for f in .compose-check/*/docker-compose.yml; do
if ! uitvoer=$(docker compose -f "$f" config -q 2>&1); then
echo "✖ $(basename "$(dirname "$f")")"
echo "$uitvoer" | sed 's/^/ /'
fouten=$((fouten + 1))
fi
done
rm -rf .compose-check
if [ "$fouten" -ne 0 ]; then
echo "$fouten sjablo(o)n(en) leveren een compose-bestand op dat docker weigert"
exit 1
fi
echo "Alle compose-bestanden zijn geldig"
- name: Images controleren
run: |
set -euo pipefail
# Een image dat niet meer bestaat merk je anders pas als iemand op
# installeren drukt. Zo verdween Huntarr nadat dat project offline
# ging, en wezen Forgejo, Planka en Baby Buddy naar tags die er niet
# zijn. Draait bewust rustig: registries knijpen af, en een afgeknepen
# verzoek is niet te onderscheiden van een ontbrekend image.
docker run --rm \
-v "$PWD:/w" -w /w \
-e PYTHONDONTWRITEBYTECODE=1 \
python:3.12-slim \
python tools/controleer_images.py
- name: Inloggen op de registry
run: |
set -euo pipefail
echo "${{ secrets.PACKAGE_TOKEN }}" \
| docker login "${{ vars.REGISTRY }}" \
-u "${{ vars.OWNER }}" --password-stdin
- name: Bouwen
run: |
set -euo pipefail
docker build \
--pull \
--build-arg "SU_VERSION=${VERSION}" \
-t "${IMAGE}:${VERSION}" \
-t "${IMAGE}:${EXTRA_TAG}" \
.
- name: Pushen
run: |
set -euo pipefail
docker push "${IMAGE}:${VERSION}"
docker push "${IMAGE}:${EXTRA_TAG}"
echo "Gepusht: ${IMAGE}:${VERSION} en ${IMAGE}:${EXTRA_TAG}"
- name: Uitloggen
if: always()
run: docker logout "${{ vars.REGISTRY }}" || true