From fa02ac597fdb82b54fe4397bbd5f42a357225a7f Mon Sep 17 00:00:00 2001 From: Marc Mintel Date: Thu, 26 Feb 2026 12:13:35 +0100 Subject: [PATCH] fix: resolve pipeline timeouts, 418 hydration errors, and english category link 404s --- .gitea/workflows/deploy.yml | 94 +++++++----------------- app/[locale]/blog/[slug]/page.tsx | 4 +- app/[locale]/blog/page.tsx | 79 +++++++++++--------- app/[locale]/products/[...slug]/page.tsx | 25 +++++-- app/sitemap.ts | 21 +++++- components/RelatedProducts.tsx | 4 +- components/home/RecentPosts.tsx | 77 +++++++++++-------- docker-compose.yml | 4 +- 8 files changed, 160 insertions(+), 148 deletions(-) diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 9423afba..b85a7334 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -94,6 +94,8 @@ jobs: TRAEFIK_RULE="Host(\"$TRAEFIK_HOST\")" PRIMARY_HOST="$TRAEFIK_HOST" fi + + GATEKEEPER_HOST="gatekeeper.$PRIMARY_HOST" { echo "target=$TARGET" @@ -101,6 +103,7 @@ jobs: echo "env_file=$ENV_FILE" echo "traefik_host=$PRIMARY_HOST" echo "traefik_rule=$TRAEFIK_RULE" + echo "gatekeeper_host=$GATEKEEPER_HOST" echo "next_public_url=https://$PRIMARY_HOST" if [[ "$TARGET" == "production" ]]; then echo "project_name=klz-cablescom" @@ -231,6 +234,7 @@ jobs: PROJECT_NAME: ${{ needs.prepare.outputs.project_name }} NEXT_PUBLIC_BASE_URL: ${{ needs.prepare.outputs.next_public_url }} TRAEFIK_HOST: ${{ needs.prepare.outputs.traefik_host }} + GATEKEEPER_HOST: ${{ needs.prepare.outputs.gatekeeper_host }} # Secrets mapping (Payload CMS) PAYLOAD_SECRET: ${{ secrets.PAYLOAD_SECRET || vars.PAYLOAD_SECRET || 'you-need-to-set-a-payload-secret' }} @@ -282,7 +286,7 @@ jobs: AUTH_MIDDLEWARE_UNPROTECTED="$STD_MW" # Gatekeeper Origin - GATEKEEPER_ORIGIN="$NEXT_PUBLIC_BASE_URL/gatekeeper" + GATEKEEPER_ORIGIN="https://$GATEKEEPER_HOST" { echo "# Generated by CI - $TARGET" @@ -318,6 +322,7 @@ jobs: echo "PROJECT_NAME=$PROJECT_NAME" printf 'TRAEFIK_HOST_RULE=%s\n' "$TRAEFIK_RULE" echo "TRAEFIK_HOST=$TRAEFIK_HOST" + echo "GATEKEEPER_HOST=$GATEKEEPER_HOST" echo "TRAEFIK_ENTRYPOINT=websecure" echo "TRAEFIK_TLS=true" echo "TRAEFIK_CERT_RESOLVER=le" @@ -431,7 +436,21 @@ jobs: - name: Install dependencies id: deps run: pnpm install --frozen-lockfile - - name: 🔍 Install Chromium (for Asset Scan) + - name: 📦 Cache APT Packages + uses: actions/cache@v4 + with: + path: /var/cache/apt/archives + key: apt-cache-${{ runner.os }}-${{ runner.arch }}-chromium + + - name: 💾 Cache Chromium + id: cache-chromium + uses: actions/cache@v4 + with: + path: /usr/bin/chromium + key: ${{ runner.os }}-chromium-native-${{ hashFiles('package.json') }} + + - name: 🔍 Install Chromium (Native & ARM64) + if: steps.cache-chromium.outputs.cache-hit != 'true' run: | rm -f /etc/apt/apt.conf.d/docker-clean apt-get update @@ -502,70 +521,9 @@ jobs: PUPPETEER_EXECUTABLE_PATH: /usr/bin/chromium CHROME_PATH: /usr/bin/chromium run: pnpm check:assets - - # ────────────────────────────────────────────────────────────────────────────── - # JOB 6: Performance & Accessibility (Lighthouse + WCAG) - # ────────────────────────────────────────────────────────────────────────────── - performance: - name: ⚡ Performance & Accessibility - needs: [prepare, post_deploy_checks] - continue-on-error: true - if: needs.post_deploy_checks.result == 'success' && needs.prepare.outputs.target != 'branch' - 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: | - echo "@mintel:registry=https://${{ vars.REGISTRY_HOST || 'npm.infra.mintel.me' }}" > .npmrc - echo "//${{ vars.REGISTRY_HOST || 'npm.infra.mintel.me' }}/:_authToken=${{ secrets.REGISTRY_PASS }}" >> .npmrc - - name: Install dependencies - run: pnpm install --frozen-lockfile - - name: 🔍 Install Chromium (Native & ARM64) - run: | - rm -f /etc/apt/apt.conf.d/docker-clean - apt-get update - apt-get install -y gnupg wget ca-certificates - - # Detect OS - OS_ID=$(. /etc/os-release && echo $ID) - CODENAME=$(. /etc/os-release && echo $VERSION_CODENAME) - - if [ "$OS_ID" = "debian" ]; then - echo "🎯 Debian detected - installing native chromium" - apt-get install -y chromium - else - echo "🎯 Ubuntu detected - adding xtradeb PPA" - mkdir -p /etc/apt/keyrings - KEY_ID="82BB6851C64F6880" - - # Fetch PPA key - wget -qO- "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x$KEY_ID" | gpg --dearmor > /etc/apt/keyrings/xtradeb.gpg - - # Add PPA repository - echo "deb [signed-by=/etc/apt/keyrings/xtradeb.gpg] http://ppa.launchpad.net/xtradeb/apps/ubuntu $CODENAME main" > /etc/apt/sources.list.d/xtradeb-ppa.list - - # PRIORITY PINNING: Force PPA over Snap-dummy - printf "Package: *\nPin: release o=LP-PPA-xtradeb-apps\nPin-Priority: 1001\n" > /etc/apt/preferences.d/xtradeb - - apt-get update - apt-get install -y --allow-downgrades chromium - fi - - # Standardize binary paths - [ -f /usr/bin/chromium ] && ln -sf /usr/bin/chromium /usr/bin/google-chrome - [ -f /usr/bin/chromium ] && ln -sf /usr/bin/chromium /usr/bin/chromium-browser - name: ⚡ Lighthouse CI + if: always() && steps.deps.outcome == 'success' + continue-on-error: true env: NEXT_PUBLIC_BASE_URL: ${{ needs.prepare.outputs.next_public_url }} GATEKEEPER_PASSWORD: ${{ secrets.GATEKEEPER_PASSWORD || 'klz2026' }} @@ -573,6 +531,8 @@ jobs: PAGESPEED_LIMIT: 8 run: pnpm run pagespeed:test - name: ♿ WCAG Audit + if: always() && steps.deps.outcome == 'success' + continue-on-error: true env: NEXT_PUBLIC_BASE_URL: ${{ needs.prepare.outputs.next_public_url }} GATEKEEPER_PASSWORD: ${{ secrets.GATEKEEPER_PASSWORD || 'klz2026' }} @@ -585,7 +545,7 @@ jobs: # ────────────────────────────────────────────────────────────────────────────── notifications: name: 🔔 Notify - needs: [prepare, deploy, post_deploy_checks, performance] + needs: [prepare, deploy, post_deploy_checks] if: always() runs-on: docker container: @@ -596,7 +556,7 @@ jobs: run: | DEPLOY="${{ needs.deploy.result }}" SMOKE="${{ needs.post_deploy_checks.result }}" - PERF="${{ needs.performance.result }}" + PERF="${{ needs.post_deploy_checks.result }}" TARGET="${{ needs.prepare.outputs.target }}" VERSION="${{ needs.prepare.outputs.image_tag }}" URL="${{ needs.prepare.outputs.next_public_url }}" diff --git a/app/[locale]/blog/[slug]/page.tsx b/app/[locale]/blog/[slug]/page.tsx index 4d4894cf..819a0a19 100644 --- a/app/[locale]/blog/[slug]/page.tsx +++ b/app/[locale]/blog/[slug]/page.tsx @@ -105,7 +105,7 @@ export default async function BlogPost({ params }: BlogPostProps) { {post.frontmatter.title}
-