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