All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 2m32s
De testsuite controleert alleen of een sjabloon geldige YAML oplevert. Een depends_on in de verkeerde vorm of network_mode naast networks is prima YAML en een kapotte stack — dat merkte je pas als iemand de app installeerde. - tools/render_voor_validatie.py rendert elk sjabloon naar echte compose-bestanden; sjablonen met schakelbare onderdelen leveren meerdere varianten op (standaard, alles aan, met en zonder VPN), zodat ook de conditionele blokken langskomen die met alleen de standaardwaarden nooit gerenderd worden - Nieuwe stap in build.yml, deploy.yml en deploy-prod.yml die er `docker compose config` overheen haalt. Renderen gebeurt in de python-container, valideren op de runner zelf: Python en Docker staan in CI niet op dezelfde plek 145 bestanden uit 142 sjablonen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q9eqpADJSRs49SoGGr4NAy
132 lines
4.9 KiB
YAML
132 lines
4.9 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: 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
|