Der Weg vom Job-Container zur oeffentlichen Domain ist auf dem VPS zu: Gitea laeuft auf demselben Host, das Paket geht an die oeffentliche IP und findet nicht zurueck (NAT-Hairpin). Der Umweg ueber host-gateway scheitert zusaetzlich an der Firewall (curl: Connection timed out). actions/checkout bekommt daher github-server-url auf die interne Adresse. Der Job-Container haengt im Netz gitea-ci und erreicht Gitea dort unter seinem Containernamen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
50 lines
1.4 KiB
YAML
50 lines
1.4 KiB
YAML
name: Build & Deploy
|
|
|
|
on:
|
|
push:
|
|
tags:
|
|
- 'v*'
|
|
|
|
jobs:
|
|
deploy:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
# Intern klonen statt ueber die oeffentliche Domain: Gitea laeuft auf
|
|
# demselben Host, der Weg ueber die oeffentliche IP findet nicht
|
|
# zurueck (NAT-Hairpin). Der Job-Container erreicht Gitea ueber das
|
|
# Netz gitea-ci unter seinem Containernamen.
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
github-server-url: http://gitea:3000
|
|
|
|
- uses: actions/setup-node@v4
|
|
with:
|
|
node-version: '24'
|
|
|
|
- run: npm ci
|
|
|
|
- run: npm run build
|
|
|
|
# Gate: rote Tests -> kein Deploy. Die Tests sichern die beiden
|
|
# nicht verhandelbaren Punkte ab (UTC statt TZID, kein RRULE).
|
|
- run: npm test
|
|
|
|
- name: Tag ermitteln
|
|
run: echo "IMAGE_TAG=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
|
|
|
|
# Das Repo-Secret DOTENV enthaelt den kompletten .env-Inhalt (mehrzeilig).
|
|
# Ueber env: statt direkter Interpolation, damit Anfuehrungszeichen,
|
|
# Backticks und $ in den Werten nicht vom Shell-Parser angefasst werden.
|
|
- name: .env aus Secret erzeugen
|
|
env:
|
|
DOTENV: ${{ secrets.DOTENV }}
|
|
run: |
|
|
umask 077
|
|
echo "$DOTENV" > .env
|
|
|
|
- name: Deployen
|
|
run: docker compose up -d --build --remove-orphans
|
|
|
|
- name: Alte Layer aufraeumen
|
|
run: docker image prune -f
|