Files
cactoz.su/.gitea/workflows/deploy.yml
T

56 lines
2.5 KiB
YAML

name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
# actions/checkout скачивает свой код с github.com и берёт URL из
# внутреннего server_url Gitea — оба варианта требуют сети, которой
# у джоб-контейнера раннера нет. Клонируем напрямую по внутреннему
# адресу Gitea в docker-сети раннера.
- name: Checkout
run: git clone --depth=1 --branch main http://gitea:3000/cacto/cactoz.su.git repo
# Runner уже на cacto-homelab и имеет доступ к docker.sock хоста,
# поэтому образ собирается прямо на месте — без registry и без SSH.
- name: Sync to deploy directory
run: |
rm -rf /data/docker/compose/cactoz
mkdir -p /data/docker/compose/cactoz
cp -a repo/. /data/docker/compose/cactoz/
rm -rf /data/docker/compose/cactoz/.git
- name: Build and restart
working-directory: /data/docker/compose/cactoz
run: |
docker compose -f docker-compose.prod.yml build
docker compose -f docker-compose.prod.yml up -d
# Если сборка/подъём упали — шаг упадёт, а старые контейнеры продолжат
# работать (up -d не выполнился). Проверяем, что новое поднялось по
# healthcheck'ам обоих сервисов, и что nginx реально отдаёт главную.
- name: Smoke check
working-directory: /data/docker/compose/cactoz
run: |
n=starting
g=starting
for i in $(seq 1 30); do
n=$(docker inspect -f '{{.State.Health.Status}}' cactoz-nginx 2>/dev/null || echo starting)
g_id=$(docker compose -f docker-compose.prod.yml ps -q gameserver)
g=$([ -n "$g_id" ] && docker inspect -f '{{.State.Health.Status}}' "$g_id" 2>/dev/null || echo starting)
if [ "$n" = "healthy" ] && [ "$g" = "healthy" ]; then break; fi
sleep 3
done
docker compose -f docker-compose.prod.yml ps
[ "$n" = "healthy" ]
[ "$g" = "healthy" ]
docker exec cactoz-nginx wget -qO /dev/null http://127.0.0.1/
- name: Prune dangling images
working-directory: /data/docker/compose/cactoz
run: docker image prune -f