85 lines
3.3 KiB
YAML
85 lines
3.3 KiB
YAML
# Deployment per Gitea Actions auf den Docker-Host, auf dem auch der Runner läuft.
|
||
# push auf main -> Images bauen, in die Gitea-Registry pushen, Test-Stack aktualisieren
|
||
# Tag v* -> dieselben (bereits getesteten) Images als Release taggen, Prod-Stack aktualisieren
|
||
# Konfiguration/Secrets liegen auf dem Host in /home/jannis/familyplanner/{test,prod}.env (siehe deploy/env.*.example).
|
||
# Runner läuft als Container: Job-Container brauchen Docker-Socket und /home/jannis/familyplanner – siehe docs/deploy-runner.md.
|
||
name: Deploy
|
||
|
||
on:
|
||
push:
|
||
branches: [main]
|
||
tags: ["v*"]
|
||
|
||
concurrency:
|
||
group: deploy-${{ github.ref }}
|
||
cancel-in-progress: false
|
||
|
||
env:
|
||
CONFIG_DIR: /home/jannis/familyplanner
|
||
SERVICES: migrations api web
|
||
|
||
jobs:
|
||
test:
|
||
if: github.ref_type == 'branch'
|
||
runs-on: ubuntu-latest
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
with:
|
||
fetch-depth: 0
|
||
|
||
- name: Registry-Login
|
||
run: echo "${{ secrets.REGISTRY_TOKEN }}" | docker login "${{ vars.REGISTRY_HOST }}" -u "${{ secrets.REGISTRY_USER }}" --password-stdin
|
||
|
||
- name: Images bauen und pushen
|
||
working-directory: deploy
|
||
env:
|
||
TAG: ${{ github.sha }}
|
||
run: |
|
||
export APP_VERSION="$(git describe --tags --always)"
|
||
docker compose --env-file "$CONFIG_DIR/test.env" build $SERVICES
|
||
docker compose --env-file "$CONFIG_DIR/test.env" push $SERVICES
|
||
|
||
- name: Test-Stack aktualisieren
|
||
working-directory: deploy
|
||
env:
|
||
TAG: ${{ github.sha }}
|
||
run: |
|
||
docker network inspect edge >/dev/null 2>&1 || docker network create edge
|
||
docker compose -p familyplanner-test --env-file "$CONFIG_DIR/test.env" pull $SERVICES
|
||
docker compose -p familyplanner-test --env-file "$CONFIG_DIR/test.env" up -d --remove-orphans --wait
|
||
|
||
prod:
|
||
if: github.ref_type == 'tag'
|
||
runs-on: ubuntu-latest
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
|
||
- name: Registry-Login
|
||
run: echo "${{ secrets.REGISTRY_TOKEN }}" | docker login "${{ vars.REGISTRY_HOST }}" -u "${{ secrets.REGISTRY_USER }}" --password-stdin
|
||
|
||
- name: Getestete Images zum Release befördern (kein Neubau)
|
||
env:
|
||
REGISTRY: ${{ vars.REGISTRY_HOST }}/${{ vars.REGISTRY_OWNER }}/
|
||
run: |
|
||
for svc in migrations api web; do
|
||
docker pull "${REGISTRY}familyplanner-$svc:${{ github.sha }}"
|
||
docker tag "${REGISTRY}familyplanner-$svc:${{ github.sha }}" "${REGISTRY}familyplanner-$svc:${{ github.ref_name }}"
|
||
docker push "${REGISTRY}familyplanner-$svc:${{ github.ref_name }}"
|
||
done
|
||
|
||
- name: Backup vor dem Update
|
||
working-directory: deploy
|
||
run: |
|
||
cp "$CONFIG_DIR/prod.env" .env
|
||
docker compose -p familyplanner-prod ps sql --status running -q | grep -q . && COMPOSE_PROJECT_NAME=familyplanner-prod sh scripts/backup.sh || echo "Erster Start, kein Backup"
|
||
rm -f .env
|
||
|
||
- name: Prod-Stack aktualisieren
|
||
working-directory: deploy
|
||
env:
|
||
TAG: ${{ github.ref_name }}
|
||
run: |
|
||
docker network inspect edge >/dev/null 2>&1 || docker network create edge
|
||
docker compose -p familyplanner-prod --env-file "$CONFIG_DIR/prod.env" pull $SERVICES
|
||
docker compose -p familyplanner-prod --env-file "$CONFIG_DIR/prod.env" up -d --remove-orphans --wait
|