name: Nightly QA (Inlined) on: schedule: - cron: '0 2 * * *' # Every night at 2:00 AM push: branches: - main paths: - '.gitea/workflows/qa.yml' workflow_dispatch: jobs: prepare: name: ๐Ÿ—๏ธ Prepare & Install runs-on: docker container: image: catthehacker/ubuntu:act-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 20 - name: Setup pnpm uses: pnpm/action-setup@v3 with: version: 10 - name: ๐Ÿ” Registry Auth run: | REGISTRY="${{ vars.REGISTRY_HOST || 'npm.infra.mintel.me' }}" echo "@mintel:registry=https://$REGISTRY" > .npmrc echo "//$REGISTRY/:_authToken=${{ secrets.NPM_TOKEN || secrets.GITEA_PAT || secrets.MINTEL_PRIVATE_TOKEN }}" >> .npmrc - name: Install dependencies run: | rm -rf .next .turbo node_modules || true pnpm install --frozen-lockfile --reporter=append-only static: name: ๐Ÿ” Static Analysis needs: prepare runs-on: docker container: image: catthehacker/ubuntu:act-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Setup pnpm uses: pnpm/action-setup@v3 with: version: 10 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 20 - name: ๐Ÿ” Registry Auth run: | REGISTRY="${{ vars.REGISTRY_HOST || 'npm.infra.mintel.me' }}" echo "@mintel:registry=https://$REGISTRY" > .npmrc echo "//$REGISTRY/:_authToken=${{ secrets.NPM_TOKEN || secrets.GITEA_PAT || secrets.MINTEL_PRIVATE_TOKEN }}" >> .npmrc - name: Install dependencies run: pnpm install --no-frozen-lockfile env: NPM_TOKEN: ${{ secrets.NPM_TOKEN || secrets.MINTEL_PRIVATE_TOKEN }} - name: ๐Ÿ› ๏ธ Fix @mintel/cli Syntax Error run: | CLI_PATH=$(find node_modules -name index.js | grep "@mintel/cli/dist/index.js" | head -n 1) if [ -n "$CLI_PATH" ] && [ -f "$CLI_PATH" ]; then echo "Patching CLI at $CLI_PATH" sed -i '2{/^#!\/usr\/bin\/env node/d;}' "$CLI_PATH" fi - name: ๐ŸŒ HTML Validation env: NEXT_PUBLIC_BASE_URL: 'https://testing.mb-grid-solutions.com' GATEKEEPER_PASSWORD: ${{ secrets.GATEKEEPER_PASSWORD || vars.GATEKEEPER_PASSWORD || 'lassmichrein' }} run: pnpm run check:html - name: ๐Ÿ” Install Browser Libs run: | sudo apt-get update sudo apt-get install -y libnss3 libnspr4 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 libxrandr2 libgbm1 libasound2 - name: ๐Ÿ•ท๏ธ Install Puppeteer Chrome run: pnpm dlx puppeteer browsers install chrome - name: ๐Ÿ–ผ๏ธ Asset Scan env: NEXT_PUBLIC_BASE_URL: 'https://testing.mb-grid-solutions.com' GATEKEEPER_PASSWORD: ${{ secrets.GATEKEEPER_PASSWORD || vars.GATEKEEPER_PASSWORD || 'lassmichrein' }} run: pnpm run check:assets accessibility: name: โ™ฟ Accessibility needs: prepare runs-on: docker container: image: catthehacker/ubuntu:act-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Setup pnpm uses: pnpm/action-setup@v3 with: version: 10 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 20 - name: ๐Ÿ” Registry Auth run: | REGISTRY="${{ vars.REGISTRY_HOST || 'npm.infra.mintel.me' }}" echo "@mintel:registry=https://$REGISTRY" > .npmrc echo "//$REGISTRY/:_authToken=${{ secrets.NPM_TOKEN || secrets.GITEA_PAT || secrets.MINTEL_PRIVATE_TOKEN }}" >> .npmrc - name: Install dependencies run: pnpm install --no-frozen-lockfile env: NPM_TOKEN: ${{ secrets.NPM_TOKEN || secrets.MINTEL_PRIVATE_TOKEN }} - name: ๐ŸŒ Install Chromium run: | sudo apt-get update sudo apt-get install -y software-properties-common gnupg wget ca-certificates sudo add-apt-repository -y ppa:xtradeb/apps sudo apt-get update || true sudo apt-get install -y chromium-browser || sudo apt-get install -y chromium sudo ln -sf /usr/bin/chromium-browser /usr/bin/google-chrome || sudo ln -sf /usr/bin/chromium /usr/bin/google-chrome - name: โ™ฟ WCAG Scan continue-on-error: true env: NEXT_PUBLIC_BASE_URL: 'https://testing.mb-grid-solutions.com' GATEKEEPER_PASSWORD: ${{ secrets.GATEKEEPER_PASSWORD || vars.GATEKEEPER_PASSWORD || 'lassmichrein' }} run: pnpm run check:wcag analysis: name: ๐Ÿงช Maintenance & Links needs: prepare runs-on: docker container: image: catthehacker/ubuntu:act-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Setup pnpm uses: pnpm/action-setup@v3 with: version: 10 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 20 - name: ๐Ÿ” Registry Auth run: | REGISTRY="${{ vars.REGISTRY_HOST || 'npm.infra.mintel.me' }}" echo "@mintel:registry=https://$REGISTRY" > .npmrc echo "//$REGISTRY/:_authToken=${{ secrets.NPM_TOKEN || secrets.GITEA_PAT || secrets.MINTEL_PRIVATE_TOKEN }}" >> .npmrc - name: Install dependencies run: pnpm install --no-frozen-lockfile env: NPM_TOKEN: ${{ secrets.NPM_TOKEN || secrets.MINTEL_PRIVATE_TOKEN }} - name: ๐Ÿ“ฆ Depcheck run: | pnpm dlx depcheck . --ignores="framer-motion,lucide-react,next-intl,vitest,@testing-library/jest-dom,@testing-library/react,@vitejs/plugin-react,autoprefixer,axios,cheerio,eslint-config-next,happy-dom,html-validate,husky,jsdom,lint-staged,pa11y-ci,pino-pretty,postcss,prettier,puppeteer,tailwindcss,tsx,typescript,@mintel/eslint-config,@mintel/husky-config,@mintel/tsconfig,@tailwindcss/postcss,@types/node,@types/nodemailer,@types/react,@types/react-dom" - name: ๐Ÿ”— Lychee Link Check uses: lycheeverse/lychee-action@v2 with: args: --accept 200,204,429 --timeout 15 app/ public/ fail: true failIfEmpty: false performance: name: ๐ŸŽญ Lighthouse needs: prepare runs-on: docker container: image: catthehacker/ubuntu:act-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 20 - name: Setup pnpm uses: pnpm/action-setup@v3 with: version: 10 - name: ๐Ÿ” Registry Auth run: | REGISTRY="${{ vars.REGISTRY_HOST || 'npm.infra.mintel.me' }}" echo "@mintel:registry=https://$REGISTRY" > .npmrc echo "//$REGISTRY/:_authToken=${{ secrets.NPM_TOKEN || secrets.GITEA_PAT || secrets.MINTEL_PRIVATE_TOKEN }}" >> .npmrc - name: Install dependencies run: pnpm install --no-frozen-lockfile env: NPM_TOKEN: ${{ secrets.NPM_TOKEN || secrets.MINTEL_PRIVATE_TOKEN }} - name: ๐ŸŒ Install Chromium run: | sudo apt-get update sudo apt-get install -y software-properties-common gnupg wget ca-certificates sudo add-apt-repository -y ppa:xtradeb/apps sudo apt-get update || true sudo apt-get install -y chromium-browser || sudo apt-get install -y chromium sudo ln -sf /usr/bin/chromium-browser /usr/bin/google-chrome || sudo ln -sf /usr/bin/chromium /usr/bin/google-chrome - name: ๐Ÿ› ๏ธ Fix @mintel/cli Syntax Error run: | CLI_PATH=$(find node_modules -name index.js | grep "@mintel/cli/dist/index.js" | head -n 1) if [ -n "$CLI_PATH" ] && [ -f "$CLI_PATH" ]; then echo "Patching CLI at $CLI_PATH" sed -i '2{/^#!\/usr\/bin\/env node/d;}' "$CLI_PATH" fi - name: ๐ŸŽญ LHCI Desktop env: LHCI_URL: 'https://testing.mb-grid-solutions.com' GATEKEEPER_PASSWORD: ${{ secrets.GATEKEEPER_PASSWORD || vars.GATEKEEPER_PASSWORD || 'lassmichrein' }} run: pnpm exec mintel pagespeed test -- --collect.settings.preset=desktop - name: ๐Ÿ“ฑ LHCI Mobile env: LHCI_URL: 'https://testing.mb-grid-solutions.com' GATEKEEPER_PASSWORD: ${{ secrets.GATEKEEPER_PASSWORD || vars.GATEKEEPER_PASSWORD || 'lassmichrein' }} run: pnpm exec mintel pagespeed test -- --collect.settings.preset=mobile notifications: name: ๐Ÿ”” Notify needs: [prepare, static, accessibility, analysis, performance] if: always() runs-on: docker container: image: catthehacker/ubuntu:act-latest steps: - name: ๐Ÿ”” Gotify shell: bash run: | PREPARE="${{ needs.prepare.result }}" STATIC="${{ needs.static.result }}" A11Y="${{ needs.accessibility.result }}" ANALYSIS="${{ needs.analysis.result }}" PERF="${{ needs.performance.result }}" PROJECT="mb-grid-solutions" URL="https://testing.mb-grid-solutions.com" if [[ "$PREPARE" != "success" || "$STATIC" != "success" || "$PERF" != "success" ]]; then PRIORITY=8 EMOJI="๐Ÿšจ" STATUS_LINE="Nightly QA Failed! Action required." else PRIORITY=2 EMOJI="โœ…" STATUS_LINE="Nightly QA Passed." fi TITLE="$EMOJI $PROJECT Nightly QA" MESSAGE="$STATUS_LINE Prepare: $PREPARE | Static: $STATIC | A11y: $A11Y Analysis: $ANALYSIS | Perf: $PERF $URL" curl -s -k -X POST "${{ secrets.GOTIFY_URL }}/message?token=${{ secrets.GOTIFY_TOKEN }}" \ -F "title=$TITLE" \ -F "message=$MESSAGE" \ -F "priority=$PRIORITY" || true