name: Docker Deploy Test on: push: branches: [main] pull_request: branches: [main] concurrency: group: deploy-test-${{ github.ref }} cancel-in-progress: true jobs: docker-deploy-test: name: Fresh-Linux Docker Deploy runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Create minimal .env run: | cat <<'EOF' > .env NEXTAUTH_URL=http://localhost:3100 NEXTAUTH_SECRET=ci-test-secret-minimum-32-chars-xx PGADMIN_PASSWORD=ci-pgadmin EOF - name: Start infrastructure (postgres + redis) run: docker compose up -d postgres redis - name: Wait for postgres run: | for i in $(seq 1 20); do docker compose exec -T postgres pg_isready -U capakraken -d capakraken && break sleep 3 done - name: Build and start app (full profile) run: docker compose --profile full up -d --build app - name: Wait for /api/health (up to 3 minutes) run: | for i in $(seq 1 36); do STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:3100/api/health || echo "000") echo "Attempt $i: HTTP $STATUS" if [ "$STATUS" = "200" ]; then exit 0; fi sleep 5 done echo "Health check timed out" docker compose logs app --tail=50 exit 1 - name: Verify health response contains status ok run: | BODY=$(curl -sf http://localhost:3100/api/health) echo "$BODY" echo "$BODY" | grep '"status":"ok"' - name: Show logs on failure if: failure() run: docker compose logs --tail=100