From 11ac75623936a75653b3b30e97f8ed1a720e5527 Mon Sep 17 00:00:00 2001 From: Marco Acierno Date: Sat, 31 Oct 2026 13:42:35 +0100 Subject: [PATCH 1/2] Upgrade to Node 26 and pin pnpm 12.17.0 The frontend image build failed: without a packageManager field, corepack resolved the newest pnpm and the download broke. Node 25+ images also ship without corepack, so the Dockerfiles now install a pinned pnpm with npm. - Node 26 in every Dockerfile, workflow and .tool-versions - pnpm 12.17.0 pinned via packageManager and in every Dockerfile - pnpm/action-setup reads the version from packageManager - pnpm 12 records itself in frontend/pnpm-lock.yaml; frozen installs fail without that entry --- .github/workflows/claude.yml | 5 +- .github/workflows/frontend-lint.yml | 3 +- .github/workflows/graphql-schema-diff.yml | 2 +- .tool-versions | 2 +- Dockerfile.node.local | 4 +- backend/Dockerfile | 4 +- badge-service/.tool-versions | 2 +- frontend/Dockerfile | 8 +- frontend/package.json | 1 + frontend/pnpm-lock.yaml | 158 ++++++++++++++++++++++ 10 files changed, 174 insertions(+), 15 deletions(-) diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml index 65dc551360..9f0626de66 100644 --- a/.github/workflows/claude.yml +++ b/.github/workflows/claude.yml @@ -83,11 +83,10 @@ jobs: - name: Install pnpm uses: pnpm/action-setup@v6 with: - version: 9 run_install: false - uses: actions/setup-node@v6 with: - node-version: "23.9.0" + node-version: "26.10.0" cache: "pnpm" cache-dependency-path: "frontend/pnpm-lock.yaml" - name: Install frontend dependencies @@ -101,7 +100,7 @@ jobs: claude_args: | --model claude-opus-5 --effort xhigh - --append-system-prompt "CI MODE. You are running in GitHub Actions against a plain checkout, not a developer laptop. Ignore the 'run everything inside docker exec pycon-backend-1' instructions in AGENTS.md: there is no Docker container here. BACKEND: dependencies are already installed via 'uv sync' in ./backend, and Postgres and Redis are running with DATABASE_URL and CELERY_* already exported. Verify with: cd backend && uv run pytest -x -q (add '-n auto' for the full suite), uv run mypy ., uv tool run ruff@0.12.5 check, uv tool run ruff@0.12.5 format --check. Always prefix Python tooling with 'uv run' or 'uv tool run' - bare python, pytest, mypy and ruff are not on PATH and are not permitted. FRONTEND: node 23.9.0 and pnpm 9 are installed and 'pnpm install' has already run in ./frontend. Generated GraphQL types are gitignored, so run 'pnpm codegen' before anything that typechecks (API_URL_SERVER is already exported); 'pnpm build' runs codegen itself. Lint from ./frontend with 'npx @biomejs/biome check .'. There is no 'pnpm test' script - AGENTS.md is wrong about that, do not try it. Run the checks covering your change before you report back, and quote the real output." + --append-system-prompt "CI MODE. You are running in GitHub Actions against a plain checkout, not a developer laptop. Ignore the 'run everything inside docker exec pycon-backend-1' instructions in AGENTS.md: there is no Docker container here. BACKEND: dependencies are already installed via 'uv sync' in ./backend, and Postgres and Redis are running with DATABASE_URL and CELERY_* already exported. Verify with: cd backend && uv run pytest -x -q (add '-n auto' for the full suite), uv run mypy ., uv tool run ruff@0.12.5 check, uv tool run ruff@0.12.5 format --check. Always prefix Python tooling with 'uv run' or 'uv tool run' - bare python, pytest, mypy and ruff are not on PATH and are not permitted. FRONTEND: node 26.10.0 and pnpm 12 are installed and 'pnpm install' has already run in ./frontend. Generated GraphQL types are gitignored, so run 'pnpm codegen' before anything that typechecks (API_URL_SERVER is already exported); 'pnpm build' runs codegen itself. Lint from ./frontend with 'npx @biomejs/biome check .'. There is no 'pnpm test' script - AGENTS.md is wrong about that, do not try it. Run the checks covering your change before you report back, and quote the real output." --allowedTools "Edit,Write,Bash(cd:*),Bash(git:*),Bash(uv:*),Bash(pip:*),Bash(pnpm:*),Bash(node:*),Bash(npx:*),Bash(gh pr view:*),Bash(gh pr diff:*),Bash(gh pr list:*),Bash(gh pr comment:*),Bash(gh issue view:*),Bash(gh issue list:*),Bash(gh search:*)" # The action only logs the init and result JSON; the transcript with the # actual error lives here. Without this, failures are undiagnosable. diff --git a/.github/workflows/frontend-lint.yml b/.github/workflows/frontend-lint.yml index 8e3c11b44b..159e8d22fe 100644 --- a/.github/workflows/frontend-lint.yml +++ b/.github/workflows/frontend-lint.yml @@ -19,11 +19,10 @@ jobs: - uses: pnpm/action-setup@v6 name: Install pnpm with: - version: 9 run_install: false - uses: actions/setup-node@v6 with: - node-version: '23.9.0' + node-version: '26.10.0' cache: 'pnpm' cache-dependency-path: 'frontend/pnpm-lock.yaml' - name: Setup Biome diff --git a/.github/workflows/graphql-schema-diff.yml b/.github/workflows/graphql-schema-diff.yml index 2cdbe56d1d..9cdb6e48af 100644 --- a/.github/workflows/graphql-schema-diff.yml +++ b/.github/workflows/graphql-schema-diff.yml @@ -24,7 +24,7 @@ jobs: - uses: actions/setup-node@v6 with: - node-version: "24" + node-version: "26" - name: Load base schema id: base-schema diff --git a/.tool-versions b/.tool-versions index 0ae7835904..0e2e2fd3f8 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,4 +1,4 @@ -nodejs 21.7.3 +nodejs 26.10.0 terraform 1.3.4 python 3.14.7 rust 1.61.0 diff --git a/Dockerfile.node.local b/Dockerfile.node.local index 26d6bda334..d1b3e23d07 100644 --- a/Dockerfile.node.local +++ b/Dockerfile.node.local @@ -1,4 +1,4 @@ -FROM node:23.9.0 +FROM node:26.10.0 WORKDIR /home/node/app @@ -9,7 +9,7 @@ RUN apt-get install -y python3 python3-pip ENV PNPM_HOME="/usr/local/share/pnpm" ENV PATH="/usr/local/share/pnpm/bin:$PATH" -RUN npm install -g pnpm && \ +RUN npm install -g pnpm@12.17.0 && \ mkdir -p /usr/local/share/pnpm/bin && \ pnpm --version diff --git a/backend/Dockerfile b/backend/Dockerfile index f6dc511d95..5bc4cf1784 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -43,13 +43,13 @@ RUN python manage.py graphql_schema # Build custom admin components -FROM node:23 AS js-stage +FROM node:26 AS js-stage ARG FUNCTION_DIR WORKDIR ${FUNCTION_DIR} -RUN npm install -g pnpm +RUN npm install -g pnpm@12.17.0 COPY custom_admin/package.json custom_admin/pnpm-lock.yaml custom_admin/pnpm-workspace.yaml ./ diff --git a/badge-service/.tool-versions b/badge-service/.tool-versions index 436b537597..994c7b78ab 100644 --- a/badge-service/.tool-versions +++ b/badge-service/.tool-versions @@ -1 +1 @@ -nodejs 21.7.3 +nodejs 26.10.0 diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 292b8a6c52..7509d9ebf6 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -1,4 +1,6 @@ -FROM node:23-alpine AS base +FROM node:26-alpine AS base + +ENV PNPM_VERSION=12.17.0 RUN apk add --no-cache curl @@ -8,7 +10,7 @@ RUN apk add --no-cache libc6-compat WORKDIR /app COPY package.json pnpm-lock.yaml* .npmrc* pnpm-workspace.yaml* ./ -RUN corepack enable pnpm && pnpm i --frozen-lockfile +RUN npm install -g pnpm@${PNPM_VERSION} && pnpm i --frozen-lockfile FROM base AS builder @@ -24,7 +26,7 @@ WORKDIR /app COPY --from=deps /app/node_modules ./node_modules COPY . . -RUN corepack enable pnpm +RUN npm install -g pnpm@${PNPM_VERSION} RUN --mount=type=secret,id=sentry_auth_token,env=SENTRY_AUTH_TOKEN \ pnpm run build diff --git a/frontend/package.json b/frontend/package.json index 48cb6dc610..ada7048560 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -5,6 +5,7 @@ "main": "index.js", "author": "Python Italia", "license": "MIT", + "packageManager": "pnpm@12.17.0", "scripts": { "dev": "concurrently \"npm run codegen:watch\" \"next dev --turbopack\"", "build": "npm run codegen && next build", diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 62d27a5824..140989a05b 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -1,3 +1,161 @@ +--- +lockfileVersion: '9.0' + +importers: + + .: + configDependencies: {} + packageManagerDependencies: + pnpm: + specifier: 12.17.0 + version: 12.17.0 + +packages: + + '@pnpm/exe.android-arm64@12.17.0': + resolution: {integrity: sha512-gwu/F5YyoJp1bIbrIBl7B8JO3rkjkGlKikwQg9s0aVa5xWaBYIqPX+ZJqQ7I4D1YfbdI/Omfze0+6vnYiWHG6A==} + cpu: [arm64] + os: [android] + + '@pnpm/exe.android-x64@12.17.0': + resolution: {integrity: sha512-qUNhCvWyeBrUByNWkqqQ3Koy1gIAQ8UV5HDHXxoo5NUWVTde0Ld2BxweNwWJw8CNKpqEGceCUdjZ506JYpTjJg==} + cpu: [x64] + os: [android] + + '@pnpm/exe.darwin-arm64@12.17.0': + resolution: {integrity: sha512-0nkEqRLIbrm7dWl+p2EPpmyNKyM0bbdPEovdtMhHYbhkO+Vls38S+6emkx8kSTAr75BNXYXkCl4RtGinGG4Erg==} + cpu: [arm64] + os: [darwin] + + '@pnpm/exe.darwin-x64@12.17.0': + resolution: {integrity: sha512-w89cboNi4KCzmt/dSKrE4ijVNKICKiZsE9TcIWf77Tz+VpoDfuhPSmWPZK+iCHBvlI/9dIN+M3HiPPVsFnAx4Q==} + cpu: [x64] + os: [darwin] + + '@pnpm/exe.freebsd-x64@12.17.0': + resolution: {integrity: sha512-DJ0FOaUDXc71icSgiuBFEvqReqoSiS/rmnC6kltoiC3MzPyw3awcGbT/7FnnYzi/ziuoTC7v6vfBh0Vzv7VKOQ==} + cpu: [x64] + os: [freebsd] + + '@pnpm/exe.linux-arm64-musl@12.17.0': + resolution: {integrity: sha512-w5ZwZ4j8S804DGhMYlLLpc+G3Kkc+5GlDO++LLvO/nDIXBTHRhdxPfQBQU08q31k0JYfp3wXCQk0Y7DnsuVF6w==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@pnpm/exe.linux-arm64@12.17.0': + resolution: {integrity: sha512-Cj2nIzWTVm6ZuhQHqL9SiJ11scBnEGxJyNg7tYQPzh9fVF5UVRkv+LbyfwdftnAtJerK/7HDpK/55WeQqp8OkA==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-ppc64@12.17.0': + resolution: {integrity: sha512-Gb//Wm15fXl+qWcxjNQmwlYDjGiJOnLU/A9uRZYmtkyZie2Yx8AHI6XkUIJioQz99TwVDKQ87ywD5Jtk8zcgyg==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-riscv64@12.17.0': + resolution: {integrity: sha512-+kItEcFjdVZEDzODsc7icb8cB+3AouCrEzOCezzxLITRhw86m9t3J/qyPdcFELBjeMnS+IXV8sJaSCQcpSqfgA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-s390x@12.17.0': + resolution: {integrity: sha512-jf5ghD2uDeknWQgK/EsCFNwlyL7BYLWfXe687g5UMVFclPLt524CREZ8Yl5hf4u7p3evCIPBN/m5I1QXUmJpHw==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-x64-musl@12.17.0': + resolution: {integrity: sha512-JGxrGSxkDkqRAUD49T9dOnKyJkQ3bWBeHnYH4o4mvj09R9eUzhWFi8oa6WPNyCO0/7/Max2gsSfgXOHj3QW7ug==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@pnpm/exe.linux-x64@12.17.0': + resolution: {integrity: sha512-vQAusDzMofc/Ee4KOUYjE6FWeHOlMGQyvhR7W39QSamVeJWS16co/n+bhjdjwjI3UFh8IWOpamvTS+b4lvQUog==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.win32-arm64@12.17.0': + resolution: {integrity: sha512-qDQh8rmyK5sxlaCSCADcmPrvytJabMCbxtJ0nCitzRo2j3/8BhzLjlOcWF3C6iPGhR5CbIb+btNy+VCVhd06mQ==} + cpu: [arm64] + os: [win32] + + '@pnpm/exe.win32-x64@12.17.0': + resolution: {integrity: sha512-qCo1OQlE3WrFZIAUK0O5EoupLaQ1fST7zNX8Qd+Tc4ojWgCvYA/ze0uP9hox8mSFC/JPAGRSG5o8gUBSq2rRxw==} + cpu: [x64] + os: [win32] + + pnpm@12.17.0: + resolution: {integrity: sha512-uNIj6+wEtYContIG2qcdG8y2oe4dUu+pXMOw23UnFWHfjw2OLEOt05xewIAYr3qKlRCOcJD5Win4hye3pA/VPQ==} + engines: {node: '>=18'} + hasBin: true + +snapshots: + + '@pnpm/exe.android-arm64@12.17.0': + optional: true + + '@pnpm/exe.android-x64@12.17.0': + optional: true + + '@pnpm/exe.darwin-arm64@12.17.0': + optional: true + + '@pnpm/exe.darwin-x64@12.17.0': + optional: true + + '@pnpm/exe.freebsd-x64@12.17.0': + optional: true + + '@pnpm/exe.linux-arm64-musl@12.17.0': + optional: true + + '@pnpm/exe.linux-arm64@12.17.0': + optional: true + + '@pnpm/exe.linux-ppc64@12.17.0': + optional: true + + '@pnpm/exe.linux-riscv64@12.17.0': + optional: true + + '@pnpm/exe.linux-s390x@12.17.0': + optional: true + + '@pnpm/exe.linux-x64-musl@12.17.0': + optional: true + + '@pnpm/exe.linux-x64@12.17.0': + optional: true + + '@pnpm/exe.win32-arm64@12.17.0': + optional: true + + '@pnpm/exe.win32-x64@12.17.0': + optional: true + + pnpm@12.17.0: + optionalDependencies: + '@pnpm/exe.android-arm64': 12.17.0 + '@pnpm/exe.android-x64': 12.17.0 + '@pnpm/exe.darwin-arm64': 12.17.0 + '@pnpm/exe.darwin-x64': 12.17.0 + '@pnpm/exe.freebsd-x64': 12.17.0 + '@pnpm/exe.linux-arm64': 12.17.0 + '@pnpm/exe.linux-arm64-musl': 12.17.0 + '@pnpm/exe.linux-ppc64': 12.17.0 + '@pnpm/exe.linux-riscv64': 12.17.0 + '@pnpm/exe.linux-s390x': 12.17.0 + '@pnpm/exe.linux-x64': 12.17.0 + '@pnpm/exe.linux-x64-musl': 12.17.0 + '@pnpm/exe.win32-arm64': 12.17.0 + '@pnpm/exe.win32-x64': 12.17.0 + +--- lockfileVersion: '9.0' settings: From 5dfa69c3f446034f013725a48449ee068bda0e85 Mon Sep 17 00:00:00 2001 From: Marco Acierno Date: Sun, 1 Nov 2026 03:32:48 +0100 Subject: [PATCH 2/2] Point pnpm/action-setup at frontend/package.json The action runs at the repository root, where there is no package.json, so it cannot find the packageManager field. --- .github/workflows/claude.yml | 1 + .github/workflows/frontend-lint.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml index 9f0626de66..efd3e829fc 100644 --- a/.github/workflows/claude.yml +++ b/.github/workflows/claude.yml @@ -84,6 +84,7 @@ jobs: uses: pnpm/action-setup@v6 with: run_install: false + package_json_file: frontend/package.json - uses: actions/setup-node@v6 with: node-version: "26.10.0" diff --git a/.github/workflows/frontend-lint.yml b/.github/workflows/frontend-lint.yml index 159e8d22fe..f525cfac22 100644 --- a/.github/workflows/frontend-lint.yml +++ b/.github/workflows/frontend-lint.yml @@ -20,6 +20,7 @@ jobs: name: Install pnpm with: run_install: false + package_json_file: frontend/package.json - uses: actions/setup-node@v6 with: node-version: '26.10.0'