From 25a6a38b30785eee9ac34d004328c92f0c878608 Mon Sep 17 00:00:00 2001 From: Jason Rasmussen Date: Fri, 8 May 2026 15:21:33 -0400 Subject: [PATCH] chore: use mise (#28298) --- .github/workflows/cli.yml | 24 +-- .github/workflows/docs-build.yml | 12 +- .github/workflows/fix-format.yml | 20 +-- .github/workflows/prepare-release.yml | 25 ++- .github/workflows/sdk.yml | 18 +-- .github/workflows/test.yml | 221 ++++++++++++-------------- .github/.nvmrc => .nvmrc | 0 cli/.nvmrc | 1 - cli/mise.toml | 25 ++- cli/package.json | 3 - docs/.nvmrc | 1 - docs/package.json | 3 - e2e/.nvmrc | 1 - e2e/mise.toml | 15 ++ e2e/package.json | 3 - machine-learning/mise.toml | 10 +- open-api/typescript-sdk/.nvmrc | 1 - open-api/typescript-sdk/package.json | 13 +- server/.nvmrc | 1 - server/mise.toml | 15 +- server/package.json | 3 - web/.nvmrc | 1 - web/package.json | 3 - 23 files changed, 202 insertions(+), 217 deletions(-) rename .github/.nvmrc => .nvmrc (100%) delete mode 100644 cli/.nvmrc delete mode 100644 docs/.nvmrc delete mode 100644 e2e/.nvmrc delete mode 100644 open-api/typescript-sdk/.nvmrc delete mode 100644 server/.nvmrc delete mode 100644 web/.nvmrc diff --git a/.github/workflows/cli.yml b/.github/workflows/cli.yml index 8b94ea090b..a1d725296b 100644 --- a/.github/workflows/cli.yml +++ b/.github/workflows/cli.yml @@ -36,30 +36,20 @@ jobs: client-id: ${{ secrets.PUSH_O_MATIC_APP_CLIENT_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - name: Checkout code + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false token: ${{ steps.token.outputs.token }} - - name: Setup pnpm - uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 - - - name: Setup Node - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + - name: Setup Mise + uses: immich-app/devtools/actions/use-mise@01a4d354b70f99a6baf4a1b72827f6d4922e4978 # use-mise-action-v2.0.0 with: - node-version-file: './cli/.nvmrc' - registry-url: 'https://registry.npmjs.org' - cache: 'pnpm' - cache-dependency-path: '**/pnpm-lock.yaml' + github_token: ${{ steps.token.outputs.token }} - - name: Setup typescript-sdk - run: pnpm install && pnpm run build - working-directory: ./open-api/typescript-sdk - - - run: pnpm install --frozen-lockfile - - run: pnpm build - - run: pnpm publish --provenance --no-git-checks + - name: Publish if: ${{ github.event_name == 'release' }} + run: mise run ci-publish docker: name: Docker diff --git a/.github/workflows/docs-build.yml b/.github/workflows/docs-build.yml index 03fae31f11..c6afd7277d 100644 --- a/.github/workflows/docs-build.yml +++ b/.github/workflows/docs-build.yml @@ -64,17 +64,11 @@ jobs: with: persist-credentials: false token: ${{ steps.token.outputs.token }} - fetch-depth: 0 - - name: Setup pnpm - uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 - - - name: Setup Node - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + - name: Setup Mise + uses: immich-app/devtools/actions/use-mise@01a4d354b70f99a6baf4a1b72827f6d4922e4978 # use-mise-action-v2.0.0 with: - node-version-file: './docs/.nvmrc' - cache: 'pnpm' - cache-dependency-path: '**/pnpm-lock.yaml' + github_token: ${{ steps.token.outputs.token }} - name: Run install run: pnpm install diff --git a/.github/workflows/fix-format.yml b/.github/workflows/fix-format.yml index 661b1e18ad..6c90f99bf7 100644 --- a/.github/workflows/fix-format.yml +++ b/.github/workflows/fix-format.yml @@ -14,29 +14,23 @@ jobs: contents: write pull-requests: write steps: - - name: Generate a token - id: generate-token - uses: actions/create-github-app-token@1b10c78c7865c340bc4f6099eb2f838309f1e8c3 # v3.1.1 + - id: token + uses: immich-app/devtools/actions/create-workflow-token@caa599d954228439ea3e8ce1c3328f41ab120ee6 # create-workflow-token-action-v2.0.0 with: client-id: ${{ secrets.PUSH_O_MATIC_APP_CLIENT_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} - - name: 'Checkout' + - name: Checkout code uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: ref: ${{ github.event.pull_request.head.ref }} - token: ${{ steps.generate-token.outputs.token }} persist-credentials: true + token: ${{ steps.token.outputs.token }} - - name: Setup pnpm - uses: pnpm/action-setup@26f6d4f2c533a43e6b5da0b4a5dd983f98f7b49a # v6.0.4 - - - name: Setup Node - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + - name: Setup Mise + uses: immich-app/devtools/actions/use-mise@01a4d354b70f99a6baf4a1b72827f6d4922e4978 # use-mise-action-v2.0.0 with: - node-version-file: './server/.nvmrc' - cache: 'pnpm' - cache-dependency-path: '**/pnpm-lock.yaml' + github_token: ${{ steps.token.outputs.token }} - name: Fix formatting run: pnpm --recursive install && pnpm run --recursive --if-present --parallel format:fix diff --git a/.github/workflows/prepare-release.yml b/.github/workflows/prepare-release.yml index 455b9920a3..82b5925947 100644 --- a/.github/workflows/prepare-release.yml +++ b/.github/workflows/prepare-release.yml @@ -48,33 +48,28 @@ jobs: version: ${{ steps.output.outputs.version }} permissions: {} # No job-level permissions are needed because it uses the app-token steps: - - name: Generate a token - id: generate-token - uses: actions/create-github-app-token@1b10c78c7865c340bc4f6099eb2f838309f1e8c3 # v3.1.1 + - id: token + uses: immich-app/devtools/actions/create-workflow-token@caa599d954228439ea3e8ce1c3328f41ab120ee6 # create-workflow-token-action-v2.0.0 with: client-id: ${{ secrets.PUSH_O_MATIC_APP_CLIENT_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} - - name: Checkout + - name: Checkout code uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: - token: ${{ steps.generate-token.outputs.token }} + token: ${{ steps.token.outputs.token }} persist-credentials: true ref: main + - name: Setup Mise + uses: immich-app/devtools/actions/use-mise@01a4d354b70f99a6baf4a1b72827f6d4922e4978 # use-mise-action-v2.0.0 + with: + github_token: ${{ steps.token.outputs.token }} + + # TODO move to mise - name: Install uv uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 - - name: Setup pnpm - uses: pnpm/action-setup@26f6d4f2c533a43e6b5da0b4a5dd983f98f7b49a # v6.0.4 - - - name: Setup Node - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 - with: - node-version-file: './server/.nvmrc' - cache: 'pnpm' - cache-dependency-path: '**/pnpm-lock.yaml' - - name: Bump version env: SERVER_BUMP: ${{ inputs.serverBump }} diff --git a/.github/workflows/sdk.yml b/.github/workflows/sdk.yml index 4b87606bba..6eb3742e7a 100644 --- a/.github/workflows/sdk.yml +++ b/.github/workflows/sdk.yml @@ -24,24 +24,22 @@ jobs: client-id: ${{ secrets.PUSH_O_MATIC_APP_CLIENT_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - name: Checkout code + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false token: ${{ steps.token.outputs.token }} - - name: Setup pnpm - uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 - - # Setup .npmrc file to publish to npm - - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + - name: Setup Mise + uses: immich-app/devtools/actions/use-mise@01a4d354b70f99a6baf4a1b72827f6d4922e4978 # use-mise-action-v2.0.0 with: - node-version-file: './open-api/typescript-sdk/.nvmrc' - registry-url: 'https://registry.npmjs.org' - cache: 'pnpm' - cache-dependency-path: '**/pnpm-lock.yaml' + github_token: ${{ steps.token.outputs.token }} + - name: Install deps run: pnpm install --frozen-lockfile + - name: Build run: pnpm build + - name: Publish run: pnpm publish --provenance --no-git-checks diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9345f9d0a5..3cc379b7e3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -78,28 +78,14 @@ jobs: persist-credentials: false token: ${{ steps.token.outputs.token }} - - name: Setup pnpm - uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 - - name: Setup Node - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + - name: Setup Mise + uses: immich-app/devtools/actions/use-mise@01a4d354b70f99a6baf4a1b72827f6d4922e4978 # use-mise-action-v2.0.0 with: - node-version-file: './server/.nvmrc' - cache: 'pnpm' - cache-dependency-path: '**/pnpm-lock.yaml' - - name: Run package manager install - run: pnpm install - - name: Run linter - run: pnpm lint - if: ${{ !cancelled() }} - - name: Run formatter - run: pnpm format - if: ${{ !cancelled() }} - - name: Run tsc - run: pnpm check - if: ${{ !cancelled() }} - - name: Run small tests & coverage - run: pnpm test - if: ${{ !cancelled() }} + github_token: ${{ steps.token.outputs.token }} + + - name: Run ci-unit + run: mise run ci-unit + cli-unit-tests: name: Unit Test CLI needs: pre-job @@ -122,31 +108,15 @@ jobs: with: persist-credentials: false token: ${{ steps.token.outputs.token }} - - name: Setup pnpm - uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 - - name: Setup Node - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + + - name: Setup Mise + uses: immich-app/devtools/actions/use-mise@01a4d354b70f99a6baf4a1b72827f6d4922e4978 # use-mise-action-v2.0.0 with: - node-version-file: './cli/.nvmrc' - cache: 'pnpm' - cache-dependency-path: '**/pnpm-lock.yaml' - - name: Setup typescript-sdk - run: pnpm install && pnpm run build - working-directory: ./open-api/typescript-sdk - - name: Install deps - run: pnpm install - - name: Run linter - run: pnpm lint - if: ${{ !cancelled() }} - - name: Run formatter - run: pnpm format - if: ${{ !cancelled() }} - - name: Run tsc - run: pnpm check - if: ${{ !cancelled() }} - - name: Run unit tests & coverage - run: pnpm test - if: ${{ !cancelled() }} + github_token: ${{ steps.token.outputs.token }} + + - name: Run ci-unit + run: mise run ci-unit + cli-unit-tests-win: name: Unit Test CLI (Windows) needs: pre-job @@ -169,26 +139,33 @@ jobs: with: persist-credentials: false token: ${{ steps.token.outputs.token }} + - name: Setup pnpm uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 + - name: Setup Node uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: - node-version-file: './cli/.nvmrc' + node-version-file: '.nvmrc' cache: 'pnpm' cache-dependency-path: '**/pnpm-lock.yaml' - name: Setup typescript-sdk run: pnpm install --frozen-lockfile && pnpm build working-directory: ./open-api/typescript-sdk + - name: Install deps run: pnpm install --frozen-lockfile + # Skip linter & formatter in Windows test. + - name: Run tsc run: pnpm check if: ${{ !cancelled() }} + - name: Run unit tests & coverage run: pnpm test if: ${{ !cancelled() }} + web-lint: name: Lint Web needs: pre-job @@ -216,7 +193,7 @@ jobs: - name: Setup Node uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: - node-version-file: './web/.nvmrc' + node-version-file: '.nvmrc' cache: 'pnpm' cache-dependency-path: '**/pnpm-lock.yaml' - name: Run setup typescript-sdk @@ -260,7 +237,7 @@ jobs: - name: Setup Node uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: - node-version-file: './web/.nvmrc' + node-version-file: '.nvmrc' cache: 'pnpm' cache-dependency-path: '**/pnpm-lock.yaml' - name: Run setup typescript-sdk @@ -298,7 +275,7 @@ jobs: - name: Setup Node uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: - node-version-file: './web/.nvmrc' + node-version-file: '.nvmrc' cache: 'pnpm' cache-dependency-path: '**/pnpm-lock.yaml' - name: Install dependencies @@ -341,30 +318,16 @@ jobs: with: persist-credentials: false token: ${{ steps.token.outputs.token }} - - name: Setup pnpm - uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 - - name: Setup Node - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + + - name: Setup Mise + uses: immich-app/devtools/actions/use-mise@01a4d354b70f99a6baf4a1b72827f6d4922e4978 # use-mise-action-v2.0.0 with: - node-version-file: './e2e/.nvmrc' - cache: 'pnpm' - cache-dependency-path: '**/pnpm-lock.yaml' - - name: Run setup typescript-sdk - run: pnpm install --frozen-lockfile && pnpm build - working-directory: ./open-api/typescript-sdk - if: ${{ !cancelled() }} - - name: Install dependencies - run: pnpm install --frozen-lockfile - if: ${{ !cancelled() }} - - name: Run linter - run: pnpm lint - if: ${{ !cancelled() }} - - name: Run formatter - run: pnpm format - if: ${{ !cancelled() }} - - name: Run tsc - run: pnpm check + github_token: ${{ steps.token.outputs.token }} + + - name: Run ci-unit + run: mise run ci-unit if: ${{ !cancelled() }} + server-medium-tests: name: Medium Tests (Server) needs: pre-job @@ -388,23 +351,16 @@ jobs: persist-credentials: false submodules: 'recursive' token: ${{ steps.token.outputs.token }} - - name: Setup pnpm - uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 - - name: Setup Node - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 - with: - node-version-file: './server/.nvmrc' - cache: 'pnpm' - cache-dependency-path: '**/pnpm-lock.yaml' + - name: Setup Mise uses: immich-app/devtools/actions/use-mise@01a4d354b70f99a6baf4a1b72827f6d4922e4978 # use-mise-action-v2.0.0 with: github_token: ${{ steps.token.outputs.token }} - - name: Run pnpm install - run: SHARP_IGNORE_GLOBAL_LIBVIPS=true pnpm install --frozen-lockfile - - name: Run medium tests - run: pnpm test:medium + + - name: Run ci-medium + run: mise run ci-medium if: ${{ !cancelled() }} + e2e-tests-server-cli: name: End-to-End Tests (Server & CLI) needs: pre-job @@ -431,52 +387,63 @@ jobs: persist-credentials: false submodules: 'recursive' token: ${{ steps.token.outputs.token }} + - name: Setup pnpm uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 + - name: Setup Node uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: - node-version-file: './e2e/.nvmrc' + node-version-file: '.nvmrc' cache: 'pnpm' cache-dependency-path: '**/pnpm-lock.yaml' - name: Run setup typescript-sdk run: pnpm install --frozen-lockfile && pnpm build working-directory: ./open-api/typescript-sdk if: ${{ !cancelled() }} + - name: Run setup web run: pnpm install --frozen-lockfile && pnpm exec svelte-kit sync working-directory: ./web if: ${{ !cancelled() }} + - name: Run setup cli run: pnpm install --frozen-lockfile && pnpm build working-directory: ./cli if: ${{ !cancelled() }} + - name: Install dependencies run: pnpm install --frozen-lockfile if: ${{ !cancelled() }} + - name: Start Docker Compose run: docker compose up -d --build --renew-anon-volumes --force-recreate --remove-orphans --wait --wait-timeout 300 if: ${{ !cancelled() }} + - name: Run e2e tests (api & cli) env: VITEST_DISABLE_DOCKER_SETUP: true run: pnpm test if: ${{ !cancelled() }} + - name: Run e2e tests (maintenance) env: VITEST_DISABLE_DOCKER_SETUP: true run: pnpm test:maintenance if: ${{ !cancelled() }} + - name: Capture Docker logs if: always() run: docker compose logs --no-color > docker-compose-logs.txt working-directory: ./e2e + - name: Archive Docker logs uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 if: always() with: name: e2e-server-docker-logs-${{ matrix.runner }} path: e2e/docker-compose-logs.txt + e2e-tests-web: name: End-to-End Tests (Web) needs: pre-job @@ -503,70 +470,85 @@ jobs: persist-credentials: false submodules: 'recursive' token: ${{ steps.token.outputs.token }} + - name: Setup pnpm uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 + - name: Setup Node uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: - node-version-file: './e2e/.nvmrc' + node-version-file: '.nvmrc' cache: 'pnpm' cache-dependency-path: '**/pnpm-lock.yaml' + - name: Run setup typescript-sdk run: pnpm install --frozen-lockfile && pnpm build working-directory: ./open-api/typescript-sdk + if: ${{ !cancelled() }} - name: Install dependencies run: pnpm install --frozen-lockfile if: ${{ !cancelled() }} + - name: Install Playwright Browsers run: pnpm exec playwright install chromium --only-shell if: ${{ !cancelled() }} + - name: Docker build run: docker compose up -d --build --renew-anon-volumes --force-recreate --remove-orphans --wait --wait-timeout 300 if: ${{ !cancelled() }} + - name: Run e2e tests (web) env: PLAYWRIGHT_DISABLE_WEBSERVER: true run: pnpm test:web if: ${{ !cancelled() }} + - name: Archive e2e test (web) results uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 if: success() || failure() with: name: e2e-web-test-results-${{ matrix.runner }} path: e2e/playwright-report/ + - name: Run ui tests (web) env: PLAYWRIGHT_DISABLE_WEBSERVER: true run: pnpm test:web:ui if: ${{ !cancelled() }} + - name: Archive ui test (web) results uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 if: success() || failure() with: name: e2e-ui-test-results-${{ matrix.runner }} path: e2e/playwright-report/ + - name: Run maintenance tests env: PLAYWRIGHT_DISABLE_WEBSERVER: true run: pnpm test:web:maintenance if: ${{ !cancelled() }} + - name: Archive maintenance tests (web) results uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 if: success() || failure() with: name: e2e-maintenance-isolated-test-results-${{ matrix.runner }} path: e2e/playwright-report/ + - name: Capture Docker logs if: always() run: docker compose logs --no-color > docker-compose-logs.txt working-directory: ./e2e + - name: Archive Docker logs uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 if: always() with: name: e2e-web-docker-logs-${{ matrix.runner }} path: e2e/docker-compose-logs.txt + success-check-e2e: name: End-to-End Tests Success needs: [e2e-tests-server-cli, e2e-tests-web] @@ -613,9 +595,6 @@ jobs: runs-on: ubuntu-latest permissions: contents: read - env: - MISE_CEILING_PATHS: ${{ github.workspace }} - MISE_TRUSTED_CONFIG_PATHS: ${{ github.workspace }}/machine-learning/mise.toml defaults: run: working-directory: ./machine-learning @@ -635,18 +614,10 @@ jobs: uses: immich-app/devtools/actions/use-mise@01a4d354b70f99a6baf4a1b72827f6d4922e4978 # use-mise-action-v2.0.0 with: github_token: ${{ steps.token.outputs.token }} - working_directory: ./machine-learning - - name: Install dependencies - run: mise run install --extra cpu - - name: Lint code - run: mise run lint --output-format=github - - name: Format code - run: mise run format - - name: Run type checking - run: mise run check - - name: Run tests and coverage - run: mise run test + - name: Run ci-unit + run: mise run ci-unit + github-files-formatting: name: .github Files Formatting needs: pre-job @@ -669,19 +640,19 @@ jobs: with: persist-credentials: false token: ${{ steps.token.outputs.token }} - - name: Setup pnpm - uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 - - name: Setup Node - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + + - name: Setup Mise + uses: immich-app/devtools/actions/use-mise@01a4d354b70f99a6baf4a1b72827f6d4922e4978 # use-mise-action-v2.0.0 with: - node-version-file: './.github/.nvmrc' - cache: 'pnpm' - cache-dependency-path: '**/pnpm-lock.yaml' + github_token: ${{ steps.token.outputs.token }} + - name: Run pnpm install run: pnpm install --frozen-lockfile + - name: Run formatter run: pnpm format if: ${{ !cancelled() }} + shellcheck: name: ShellCheck runs-on: ubuntu-latest @@ -720,21 +691,22 @@ jobs: with: persist-credentials: false token: ${{ steps.token.outputs.token }} - - name: Setup pnpm - uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 - - name: Setup Node - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + + - name: Setup Mise + uses: immich-app/devtools/actions/use-mise@01a4d354b70f99a6baf4a1b72827f6d4922e4978 # use-mise-action-v2.0.0 with: - node-version-file: './server/.nvmrc' - cache: 'pnpm' - cache-dependency-path: '**/pnpm-lock.yaml' + github_token: ${{ steps.token.outputs.token }} + - name: Install server dependencies run: SHARP_IGNORE_GLOBAL_LIBVIPS=true pnpm --filter immich install --frozen-lockfile + - name: Build the app run: pnpm --filter immich build + - name: Run API generation run: ./bin/generate-open-api.sh working-directory: open-api + - name: Find file changes uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4 id: verify-changed-files @@ -743,6 +715,7 @@ jobs: mobile/openapi open-api/typescript-sdk open-api/immich-openapi-specs.json + - name: Verify files have not changed if: steps.verify-changed-files.outputs.files_changed == 'true' env: @@ -751,6 +724,7 @@ jobs: echo "ERROR: Generated files not up to date!" echo "Changed files: ${CHANGED_FILES}" exit 1 + sql-schema-up-to-date: name: SQL Schema Checks runs-on: ubuntu-latest @@ -782,31 +756,35 @@ jobs: with: persist-credentials: false token: ${{ steps.token.outputs.token }} - - name: Setup pnpm - uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 - - name: Setup Node - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + + - name: Setup Mise + uses: immich-app/devtools/actions/use-mise@01a4d354b70f99a6baf4a1b72827f6d4922e4978 # use-mise-action-v2.0.0 with: - node-version-file: './server/.nvmrc' - cache: 'pnpm' - cache-dependency-path: '**/pnpm-lock.yaml' + github_token: ${{ steps.token.outputs.token }} + - name: Install server dependencies run: SHARP_IGNORE_GLOBAL_LIBVIPS=true pnpm install --frozen-lockfile + - name: Build the app run: pnpm build + - name: Run existing migrations run: pnpm migrations:run + - name: Test npm run schema:reset command works run: pnpm schema:reset + - name: Generate new migrations continue-on-error: true run: pnpm migrations:generate src/TestMigration + - name: Find file changes uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4 id: verify-changed-files with: files: | server/src + - name: Verify migration files have not changed if: steps.verify-changed-files.outputs.files_changed == 'true' env: @@ -816,16 +794,19 @@ jobs: echo "Changed files: ${CHANGED_FILES}" cat ./src/*-TestMigration.ts exit 1 + - name: Run SQL generation run: pnpm sync:sql env: DB_URL: postgres://postgres:postgres@localhost:5432/immich + - name: Find file changes uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4 id: verify-changed-sql-files with: files: | server/src/queries + - name: Verify SQL files have not changed if: steps.verify-changed-sql-files.outputs.files_changed == 'true' env: diff --git a/.github/.nvmrc b/.nvmrc similarity index 100% rename from .github/.nvmrc rename to .nvmrc diff --git a/cli/.nvmrc b/cli/.nvmrc deleted file mode 100644 index 5bf4400f22..0000000000 --- a/cli/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -24.15.0 diff --git a/cli/mise.toml b/cli/mise.toml index 740184e03d..28d5e1858f 100644 --- a/cli/mise.toml +++ b/cli/mise.toml @@ -7,7 +7,7 @@ run = "vite build" [tasks.test] env._.path = "./node_modules/.bin" -run = "vite" +run = "vitest" [tasks.lint] env._.path = "./node_modules/.bin" @@ -27,3 +27,26 @@ run = "prettier --write ." [tasks.check] env._.path = "./node_modules/.bin" run = "tsc --noEmit" + +[tasks.ci-publish] +depends = ["//:sdk:install", "//:sdk:build"] +run = [ + { task = ":install" }, + { task = ":build" }, + "pnpm publish --provenance --no-git-checks", +] + +[tasks.ci-unit] +depends = ["//:sdk:install", "//:sdk:build"] +run = [ + { task = ":install" }, + { task = ":format" }, + { task = ":lint" }, + { task = ":check" }, + { task = ":test --run" }, +] + +[tasks.checklist] +run = [ + { task = ":ci-unit" }, +] diff --git a/cli/package.json b/cli/package.json index 7b42f77ff1..8035639a2a 100644 --- a/cli/package.json +++ b/cli/package.json @@ -66,8 +66,5 @@ "fastq": "^1.17.1", "lodash-es": "^4.17.21", "micromatch": "^4.0.8" - }, - "volta": { - "node": "24.15.0" } } diff --git a/docs/.nvmrc b/docs/.nvmrc deleted file mode 100644 index 5bf4400f22..0000000000 --- a/docs/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -24.15.0 diff --git a/docs/package.json b/docs/package.json index d469d1ffef..e1d26532db 100644 --- a/docs/package.json +++ b/docs/package.json @@ -56,8 +56,5 @@ }, "engines": { "node": ">=20" - }, - "volta": { - "node": "24.15.0" } } diff --git a/e2e/.nvmrc b/e2e/.nvmrc deleted file mode 100644 index 5bf4400f22..0000000000 --- a/e2e/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -24.15.0 diff --git a/e2e/mise.toml b/e2e/mise.toml index c298115e40..99056f9ead 100644 --- a/e2e/mise.toml +++ b/e2e/mise.toml @@ -27,3 +27,18 @@ run = { task = "lint --fix" } [tasks.check] env._.path = "./node_modules/.bin" run = "tsc --noEmit" + + +[tasks.ci-setup] +depends = ["//:sdk:install", "//:sdk:build", "//cli:install", "//cli:build"] +run = { task = ":install" } + + +[tasks.ci-unit] +depends = ["//:sdk:install", "//:sdk:build"] +run = [ + { task = ":install" }, + { task = ":format" }, + { task = ":lint" }, + { task = ":check" }, +] diff --git a/e2e/package.json b/e2e/package.json index a58c709a6d..00868d001d 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -56,8 +56,5 @@ "utimes": "^5.2.1", "vite-tsconfig-paths": "^6.1.1", "vitest": "^4.0.0" - }, - "volta": { - "node": "24.15.0" } } diff --git a/machine-learning/mise.toml b/machine-learning/mise.toml index eceaa6f35d..e5e30c4fc2 100644 --- a/machine-learning/mise.toml +++ b/machine-learning/mise.toml @@ -17,6 +17,15 @@ run = "uv run ruff format immich_ml" [tasks.check] run = "uv run mypy --strict immich_ml/" +[tasks.ci-unit] +run = [ + { task = ":install --extra cpu" }, + { task = ":format" }, + { task = ":lint --output-format=github" }, + { task = ":check" }, + { task = ":test" }, +] + [tasks.checklist] run = [ { task = ":install" }, @@ -25,4 +34,3 @@ run = [ { task = ":check" }, { task = ":test" }, ] - diff --git a/open-api/typescript-sdk/.nvmrc b/open-api/typescript-sdk/.nvmrc deleted file mode 100644 index 5bf4400f22..0000000000 --- a/open-api/typescript-sdk/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -24.15.0 diff --git a/open-api/typescript-sdk/package.json b/open-api/typescript-sdk/package.json index 7e212bcfbf..eca4bab946 100644 --- a/open-api/typescript-sdk/package.json +++ b/open-api/typescript-sdk/package.json @@ -2,6 +2,11 @@ "name": "@immich/sdk", "version": "2.7.5", "description": "Auto-generated TypeScript SDK for the Immich API", + "repository": { + "type": "git", + "url": "git+https://github.com/immich-app/immich.git", + "directory": "open-api/typescript-sdk" + }, "type": "module", "main": "./build/index.js", "types": "./build/index.d.ts", @@ -21,13 +26,5 @@ "devDependencies": { "@types/node": "^24.12.2", "typescript": "^6.0.0" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/immich-app/immich.git", - "directory": "open-api/typescript-sdk" - }, - "volta": { - "node": "24.15.0" } } diff --git a/server/.nvmrc b/server/.nvmrc deleted file mode 100644 index 5bf4400f22..0000000000 --- a/server/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -24.15.0 diff --git a/server/mise.toml b/server/mise.toml index d2240c4289..95230b6d04 100644 --- a/server/mise.toml +++ b/server/mise.toml @@ -55,12 +55,23 @@ run = [ env._.path = "./node_modules/.bin" run = "email dev -p 3050 --dir src/emails" -[tasks.checklist] +[tasks.ci-unit] run = [ { task = ":install" }, { task = ":format" }, { task = ":lint" }, { task = ":check" }, - { task = ":test-medium --run" }, { task = ":test --run" }, ] + +[tasks.ci-medium] +run = [ + { task = ":install" }, + { task = ":test-medium --run" }, +] + +[tasks.checklist] +run = [ + { task = ":ci-unit" }, + { task = ":ci-medium" }, +] diff --git a/server/package.json b/server/package.json index 1d3a8588cd..904fda4637 100644 --- a/server/package.json +++ b/server/package.json @@ -167,9 +167,6 @@ "vite-tsconfig-paths": "^6.0.0", "vitest": "^3.0.0" }, - "volta": { - "node": "24.15.0" - }, "overrides": { "sharp": "^0.34.5" } diff --git a/web/.nvmrc b/web/.nvmrc deleted file mode 100644 index 5bf4400f22..0000000000 --- a/web/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -24.15.0 diff --git a/web/package.json b/web/package.json index daaa74d9e9..5812ac42f5 100644 --- a/web/package.json +++ b/web/package.json @@ -111,8 +111,5 @@ "typescript-eslint": "^8.45.0", "vite": "^8.0.0", "vitest": "^4.0.0" - }, - "volta": { - "node": "24.15.0" } }