name: CI on: push: branches: - main - master tags: - "v*" pull_request: branches: - main - master workflow_dispatch: env: UV_THREADPOOL_SIZE: 1 NODE_OPTIONS: "--max-old-space-size=1536" SKIP_ENV_VALIDATION: 1 NODE_ENV: test DATABASE_URL: "mysql://test:test@localhost:3306/test?charset=utf8mb4" REDIS_URL: "redis://127.0.0.1:6379?connect_timeout=2" AUTH_SECRET: "ci-test-secret-key-that-is-long-enough" BCRYPT_ROUNDS: 4 jobs: check: runs-on: ubuntu-latest steps: - name: Check out repository code uses: actions/checkout@v4 with: repository: ${{ gitea.repository }} token: ${{ gitea.token }} fetch-depth: 1 - name: Install pnpm run: | corepack enable corepack prepare pnpm@11.25.0 --activate - name: pnpm install run: pnpm install --frozen-lockfile --jobs 1 - name: Lint (Biome) run: pnpm biome:lint --workers 1 - name: Typecheck run: pnpm typecheck - name: Test run: pnpm test --maxWorkers=1 deploy: needs: check if: gitea.event_name == 'push' && (gitea.ref_name == 'main' || gitea.ref_name == 'master') runs-on: self-hosted steps: - name: Check out repository code for deploy uses: actions/checkout@v4 with: repository: ${{ gitea.repository }} token: ${{ gitea.token }} - name: Build and Deploy Container run: | set -e echo "--- Start Docker Build & Deploy ---" DOCKER_BUILDKIT=1 docker build \ --build-arg NODE_OPTIONS="--max-old-space-size=1536" \ --cache-from epicnext-cms:latest \ -t epicnext-cms:latest . docker stop epicnext-cms-app 2>/dev/null || true docker rm epicnext-cms-app 2>/dev/null || true docker run -d \ --name epicnext-cms-app \ --restart always \ --net=host \ epicnext-cms:latest docker image prune -f echo "--- Wachten op health check ---" for i in $(seq 1 30); do BODY="$(curl -sf --max-time 5 http://127.0.0.1:3002/api/health 2>/dev/null || true)" if echo "${BODY}" | grep -q '"database":true'; then echo "Health OK" exit 0 fi echo "Health attempt ${i}/30, retrying..." sleep 3 done echo "ERROR: Health check failed!" >&2 docker logs epicnext-cms-app --tail 50 >&2 || true exit 1