diff --git a/.gitea/workflows/qa.yml b/.gitea/workflows/qa.yml index 53e5a4d..f20b9ea 100644 --- a/.gitea/workflows/qa.yml +++ b/.gitea/workflows/qa.yml @@ -2,268 +2,103 @@ name: Nightly QA (Inlined) on: schedule: - - cron: '0 2 * * *' # Every night at 2:00 AM - push: - branches: - - main - - fix/nightly-qa-stabilization + - cron: '0 2 * * *' # Every night at 02:00 workflow_dispatch: jobs: - prepare: - name: ๐Ÿ—๏ธ Prepare & Install + qa: + name: ๐Ÿงช Quality Assurance runs-on: docker container: image: catthehacker/ubuntu:act-latest + env: + NEXT_PUBLIC_BASE_URL: https://testing.mb-grid-solutions.com + GATEKEEPER_PASSWORD: ${{ secrets.GATEKEEPER_PASSWORD }} 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 + - name: ๐Ÿ›‘ Cleanup Workspace 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 + - name: ๐Ÿ“ฅ Checkout Repository uses: actions/checkout@v4 - - name: Setup pnpm - uses: pnpm/action-setup@v3 - with: - version: 10 - - name: Setup Node.js + + - 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: ๐Ÿ› ๏ธ Fix @mintel/cli Syntax Error + echo "//$REGISTRY/:_authToken=${{ secrets.NPM_TOKEN || secrets.GITEA_PAT || secrets.MINTEL_PRIVATE_TOKEN || secrets.REGISTRY_PASS }}" >> .npmrc + + - name: ๐Ÿ—๏ธ Install Dependencies + run: pnpm install --frozen-lockfile + + - name: ๐Ÿ› ๏ธ Patch @mintel/cli 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 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: ๐Ÿ•ท๏ธ Install Puppeteer Chrome - run: pnpm dlx puppeteer browsers install chrome || true # Fallback if apt version is used - - name: ๐Ÿ–ผ๏ธ Asset Scan - env: - NEXT_PUBLIC_BASE_URL: 'https://testing.mb-grid-solutions.com' - GATEKEEPER_PASSWORD: ${{ secrets.GATEKEEPER_PASSWORD || vars.GATEKEEPER_PASSWORD || 'lassmichrein' }} - PUPPETEER_EXECUTABLE_PATH: /usr/bin/chromium-browser - CHROME_PATH: /usr/bin/chromium-browser - 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 + - name: ๐Ÿ” Static Analysis + id: static 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 + echo "Running Lint..." + pnpm run lint + echo "Running Depcheck..." + 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,@payloadcms/ui,@commitlint/*" + + - name: โ™ฟ Accessibility Audit + id: a11y continue-on-error: true - env: - NEXT_PUBLIC_BASE_URL: 'https://testing.mb-grid-solutions.com' - GATEKEEPER_PASSWORD: ${{ secrets.GATEKEEPER_PASSWORD || vars.GATEKEEPER_PASSWORD || 'lassmichrein' }} - CHROME_PATH: /usr/bin/chromium-browser - PUPPETEER_EXECUTABLE_PATH: /usr/bin/chromium-browser 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 + - name: ๐Ÿ”— Link Checker + id: links + continue-on-error: true 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,@payloadcms/ui,@commitlint/*" - - name: ๐Ÿ”— Lychee Link Check - uses: lycheeverse/lychee-action@v2 - with: - args: --accept 200,204,429 --timeout 15 app/ public/ - fail: true - failIfEmpty: false + curl -sLO https://github.com/lycheeverse/lychee/releases/download/v0.14.3/lychee-v0.14.3-x86_64-unknown-linux-gnu.tar.gz + tar -xzf lychee-v0.14.3-x86_64-unknown-linux-gnu.tar.gz + mv lychee /usr/local/bin/ + lychee --accept 200,429,999 --exclude-mail --exclude "https://www.linkedin.com/.*" --exclude "https://fonts.gstatic.com/.*" https://testing.mb-grid-solutions.com - 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' }} - CHROME_PATH: /usr/bin/chromium-browser - PUPPETEER_EXECUTABLE_PATH: /usr/bin/chromium-browser + - name: ๐ŸŽญ Performance & Lighthouse + id: perf 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' }} - CHROME_PATH: /usr/bin/chromium-browser - PUPPETEER_EXECUTABLE_PATH: /usr/bin/chromium-browser - 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 + - name: ๐Ÿ”” Notify Status + if: always() 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." + STATUS="success" + if [[ "${{ steps.static.outcome }}" != "success" || "${{ steps.perf.outcome }}" != "success" ]]; then + STATUS="failure" 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 + + PAYLOAD=$(cat <