diff --git a/.github/actions/release-notes/check/action.yml b/.github/actions/release-notes/check/action.yml index ead5ca983c..36f21e12f8 100644 --- a/.github/actions/release-notes/check/action.yml +++ b/.github/actions/release-notes/check/action.yml @@ -6,7 +6,7 @@ runs: steps: - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: 22 + node-version: 24 - name: Install dependencies shell: bash run: yarn workspaces focus @actual-app/ci-actions diff --git a/.github/actions/release-notes/generate/action.yml b/.github/actions/release-notes/generate/action.yml index fa6fc48ee1..92993357f4 100644 --- a/.github/actions/release-notes/generate/action.yml +++ b/.github/actions/release-notes/generate/action.yml @@ -17,7 +17,7 @@ runs: steps: - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: 22 + node-version: 24 - name: Install dependencies shell: bash run: yarn workspaces focus actual @actual-app/ci-actions diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index ed071d134a..072b9ac11c 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -21,7 +21,7 @@ runs: - name: Install node uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: 22 + node-version: 24 package-manager-cache: false - name: Install yarn run: npm install -g yarn diff --git a/.github/workflows/docker-nightly.yml b/.github/workflows/docker-nightly.yml index 6d21a9a431..6c35b43eaf 100644 --- a/.github/workflows/docker-nightly.yml +++ b/.github/workflows/docker-nightly.yml @@ -111,7 +111,7 @@ jobs: context: . push: ${{ github.event_name != 'pull_request' }} file: packages/sync-server/docker/${{ matrix.os }}.Dockerfile - platforms: linux/amd64,linux/arm64,linux/arm/v7${{ matrix.os == 'alpine' && ',linux/arm/v6' || '' }} + platforms: linux/amd64,linux/arm64${{ matrix.os == 'alpine' && ',linux/arm/v7,linux/arm/v6' || '' }} tags: ${{ steps.meta.outputs.tags }} build-args: | GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/docker-release.yml b/.github/workflows/docker-release.yml index 457aab15d5..881f866995 100644 --- a/.github/workflows/docker-release.yml +++ b/.github/workflows/docker-release.yml @@ -110,7 +110,7 @@ jobs: context: . push: true file: packages/sync-server/docker/ubuntu.Dockerfile - platforms: linux/amd64,linux/arm64,linux/arm/v7 + platforms: linux/amd64,linux/arm64 tags: ${{ steps.meta.outputs.tags }} - name: Build alpine image for testing diff --git a/.github/workflows/issues-feature-implemented.yml b/.github/workflows/issues-feature-implemented.yml index d08ec9ad49..0716bf90d6 100644 --- a/.github/workflows/issues-feature-implemented.yml +++ b/.github/workflows/issues-feature-implemented.yml @@ -31,7 +31,7 @@ jobs: persist-credentials: false - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: 22 + node-version: 24 - name: Handle feature requests run: node .github/actions/handle-feature-requests.js env: diff --git a/.nvmrc b/.nvmrc index 32cfab6364..87d8620cc6 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v22.18.0 +v24.18.1 diff --git a/AGENTS.md b/AGENTS.md index 753169f18e..1ba953c64a 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -590,7 +590,7 @@ When running the app for manual testing or demos, use **"View demo"** on the ini ### Gotchas -- The `engines` field requires **Node.js >=22** and **Yarn ^4.9.1**. The `.nvmrc` specifies `v22/*`. +- The `engines` field requires **Node.js >=22** and **Yarn ^4.9.1**. The `.nvmrc` specifies `v24.18.1`. - Pre-commit hook runs `nano-staged` (oxfmt + oxlint, configured in `.nano-staged.json`) via Husky. Run `yarn prepare` once after install to set up hooks. - Lage caches test results in `.lage/`. If tests behave unexpectedly, clear with `rm -rf .lage`. - Native modules (`better-sqlite3`, `bcrypt`) require build tools (`gcc`, `make`, `python3`). These are pre-installed in the Cloud VM. diff --git a/Dockerfile b/Dockerfile index 95ffc59ca9..c5678193b3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,7 +5,7 @@ # you are doing. ################################################### -FROM node:22-bookworm as dev +FROM node:24-bookworm AS dev RUN apt-get update -y && apt-get upgrade -y && apt-get install -y openssl WORKDIR /app CMD ["sh", "./bin/docker-start"] diff --git a/packages/sync-server/docker/alpine.Dockerfile b/packages/sync-server/docker/alpine.Dockerfile index 9866feb955..334cfd168b 100644 --- a/packages/sync-server/docker/alpine.Dockerfile +++ b/packages/sync-server/docker/alpine.Dockerfile @@ -1,8 +1,7 @@ -FROM node:22-alpine AS builder +FROM alpine:3.23 AS builder # Install required packages -RUN apk add --no-cache python3 openssl build-base -RUN corepack enable +RUN apk add --no-cache nodejs python3 openssl build-base WORKDIR /app @@ -10,6 +9,10 @@ COPY .yarn ./.yarn COPY yarn.lock package.json .yarnrc.yml ./ COPY packages ./packages +# Alpine's Node.js package does not include Corepack, so expose the vendored +# Yarn release on PATH. +RUN ln -s /app/.yarn/releases/yarn-*.cjs /usr/local/bin/yarn + # Avoiding memory issues with ARMv7 RUN if [ "$(uname -m)" = "armv7l" ]; then yarn config set taskPoolConcurrency 2; yarn config set networkConcurrency 5; fi @@ -26,7 +29,7 @@ RUN find node_modules/@actual-app -maxdepth 2 -type d \ \( -name src -o -name e2e -o -name __tests__ -o -name __mocks__ -o -name tests -o -name test -o -name build-stats \) \ -exec rm -rf {} + -FROM alpine:3.22 AS prod +FROM alpine:3.23 AS prod # Minimal runtime dependencies RUN apk add --no-cache nodejs tini diff --git a/packages/sync-server/docker/ubuntu.Dockerfile b/packages/sync-server/docker/ubuntu.Dockerfile index d73860f891..931340fab5 100644 --- a/packages/sync-server/docker/ubuntu.Dockerfile +++ b/packages/sync-server/docker/ubuntu.Dockerfile @@ -1,4 +1,4 @@ -FROM node:22-bookworm AS builder +FROM node:24-bookworm AS builder # Install required packages RUN apt-get update && apt-get install -y openssl @@ -25,7 +25,7 @@ RUN find node_modules/@actual-app -maxdepth 2 -type d \ \( -name src -o -name e2e -o -name __tests__ -o -name __mocks__ -o -name tests -o -name test -o -name build-stats \) \ -exec rm -rf {} + -FROM node:22-bookworm-slim AS prod +FROM node:24-bookworm-slim AS prod # Minimal runtime dependencies RUN apt-get update && apt-get install tini && apt-get clean -y && rm -rf /var/lib/apt/lists/* diff --git a/sync-server.Dockerfile b/sync-server.Dockerfile index 8d0560b58b..3b165061d5 100644 --- a/sync-server.Dockerfile +++ b/sync-server.Dockerfile @@ -1,4 +1,4 @@ -FROM node:22-bookworm AS deps +FROM node:24-bookworm AS deps # Install required packages RUN apt-get update && apt-get install -y openssl @@ -50,7 +50,7 @@ RUN rm -rf ./node_modules/@actual-app/web ./node_modules/@actual-app/sync-server COPY ./packages/desktop-client/package.json ./node_modules/@actual-app/web/package.json RUN cp -r ./packages/desktop-client/build ./node_modules/@actual-app/web/build -FROM node:22-bookworm-slim AS prod +FROM node:24-bookworm-slim AS prod # Minimal runtime dependencies RUN apt-get update && apt-get install -y tini && apt-get clean -y && rm -rf /var/lib/apt/lists/* diff --git a/upcoming-release-notes/use-node-24-by-default.md b/upcoming-release-notes/use-node-24-by-default.md new file mode 100644 index 0000000000..395737e354 --- /dev/null +++ b/upcoming-release-notes/use-node-24-by-default.md @@ -0,0 +1,6 @@ +--- +category: Maintenance +authors: [jfdoming] +--- + +\[BREAKING CHANGE\] Update release artifacts to use Node.js 24 by default and drop Ubuntu image support for 32-bit ARM devices