name: Nightly QA on: schedule: - cron: '0 3 * * *' workflow_dispatch: env: TARGET_URL: 'https://testing.klz-cables.com' PROJECT_NAME: 'klz-2026' jobs: smoke: name: 💨 Smoke & Health runs-on: docker container: image: catthehacker/ubuntu:act-latest steps: - uses: actions/checkout@v4 - uses: pnpm/action-setup@v3 with: version: 10 - uses: actions/setup-node@v4 with: node-version: 20 - name: 🔐 Registry Auth run: | echo "@mintel:registry=https://git.infra.mintel.me/api/packages/mmintel/npm" > .npmrc echo "//git.infra.mintel.me/api/packages/mmintel/npm/:_authToken=${{ secrets.NPM_TOKEN }}" >> .npmrc - name: 📦 Cache node_modules uses: actions/cache@v4 id: cache-deps with: path: node_modules key: pnpm-${{ hashFiles('pnpm-lock.yaml') }} - name: Install if: steps.cache-deps.outputs.cache-hit != 'true' run: pnpm install --no-frozen-lockfile - name: 🌐 Install Chrome & Dependencies run: | apt-get update && apt-get install -y libnss3 libnspr4 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 libxext6 libxfixes3 libxrandr2 libgbm1 libasound2t64 libpango-1.0-0 libcairo2 npx puppeteer browsers install chrome - name: 🚀 Run Smoke Test env: NEXT_PUBLIC_BASE_URL: ${{ env.TARGET_URL }} GATEKEEPER_PASSWORD: ${{ secrets.GATEKEEPER_PASSWORD }} run: npx tsx scripts/smoke.ts - name: 🔔 Notify if: always() run: | STATUS="${{ job.status }}" TITLE="💨 ${{ env.PROJECT_NAME }} Nightly Smoke $STATUS" curl -s -k -X POST "${{ secrets.GOTIFY_URL }}/message?token=${{ secrets.GOTIFY_TOKEN }}" \ -F "title=$TITLE" \ -F "message=Status: $STATUS | URL: ${{ env.TARGET_URL }}" \ -F "priority=5" || true