@ -4,13 +4,10 @@ on:
pull_request:
pull_request:
push:
push:
branches : [ main]
branches : [ main]
concurrency:
concurrency:
group : ${{ github.workflow }}-${{ github.ref }}
group : ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress : true
cancel-in-progress : true
permissions : {}
permissions : {}
jobs:
jobs:
pre-job:
pre-job:
runs-on : ubuntu-latest
runs-on : ubuntu-latest
@ -32,7 +29,6 @@ jobs:
uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
with:
persist-credentials : false
persist-credentials : false
- id : found_paths
- id : found_paths
uses : dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
uses : dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
with:
with:
@ -58,11 +54,9 @@ jobs:
- '.github/workflows/test.yml'
- '.github/workflows/test.yml'
.github:
.github:
- '.github/**'
- '.github/**'
- name : Check if we should force jobs to run
- name : Check if we should force jobs to run
id : should_force
id : should_force
run : echo "should_force=${{ steps.found_paths.outputs.workflow == 'true' || github.event_name == 'workflow_dispatch' }}" >> "$GITHUB_OUTPUT"
run : echo "should_force=${{ steps.found_paths.outputs.workflow == 'true' || github.event_name == 'workflow_dispatch' }}" >> "$GITHUB_OUTPUT"
server-unit-tests:
server-unit-tests:
name : Test & Lint Server
name : Test & Lint Server
needs : pre-job
needs : pre-job
@ -73,39 +67,33 @@ jobs:
defaults:
defaults:
run:
run:
working-directory : ./server
working-directory : ./server
steps:
steps:
- name : Checkout code
- name : Checkout code
uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
with:
persist-credentials : false
persist-credentials : false
- name : Setup pnpm
uses : pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name : Setup Node
- name : Setup Node
uses : actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
uses : actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
with:
node-version-file : './server/.nvmrc'
node-version-file : './server/.nvmrc'
cache : 'npm'
cache : 'pnpm'
cache-dependency-path : '**/package-lock.json'
cache-dependency-path : '**/pnpm-lock.yaml'
- name : Run package manager install
- name : Run npm install
run : pnpm install
run : npm ci
- name : Run linter
- name : Run linter
run : npm run lint
run : pnpm lint
if : ${{ !cancelled() }}
if : ${{ !cancelled() }}
- name : Run formatter
- name : Run formatter
run : npm run format
run : p npm format
if : ${{ !cancelled() }}
if : ${{ !cancelled() }}
- name : Run tsc
- name : Run tsc
run : npm run check
run : p npm check
if : ${{ !cancelled() }}
if : ${{ !cancelled() }}
- name : Run small tests & coverage
- name : Run small tests & coverage
run : npm test
run : p npm test
if : ${{ !cancelled() }}
if : ${{ !cancelled() }}
cli-unit-tests:
cli-unit-tests:
name : Unit Test CLI
name : Unit Test CLI
needs : pre-job
needs : pre-job
@ -116,43 +104,36 @@ jobs:
defaults:
defaults:
run:
run:
working-directory : ./cli
working-directory : ./cli
steps:
steps:
- name : Checkout code
- name : Checkout code
uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
with:
persist-credentials : false
persist-credentials : false
- name : Setup pnpm
uses : pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name : Setup Node
- name : Setup Node
uses : actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
uses : actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
with:
node-version-file : './cli/.nvmrc'
node-version-file : './cli/.nvmrc'
cache : 'npm'
cache : 'pnpm'
cache-dependency-path : '**/package-lock.json'
cache-dependency-path : '**/pnpm-lock.yaml'
- name : Setup typescript-sdk
- name : Setup typescript-sdk
run : npm c i && npm run build
run : p npm install && p npm run build
working-directory : ./open-api/typescript-sdk
working-directory : ./open-api/typescript-sdk
- name : Install deps
- name : Install deps
run : npm ci
run : pnpm install
- name : Run linter
- name : Run linter
run : npm run lint
run : p npm lint
if : ${{ !cancelled() }}
if : ${{ !cancelled() }}
- name : Run formatter
- name : Run formatter
run : npm run format
run : p npm format
if : ${{ !cancelled() }}
if : ${{ !cancelled() }}
- name : Run tsc
- name : Run tsc
run : npm run check
run : p npm check
if : ${{ !cancelled() }}
if : ${{ !cancelled() }}
- name : Run unit tests & coverage
- name : Run unit tests & coverage
run : npm run test
run : p npm test
if : ${{ !cancelled() }}
if : ${{ !cancelled() }}
cli-unit-tests-win:
cli-unit-tests-win:
name : Unit Test CLI (Windows)
name : Unit Test CLI (Windows)
needs : pre-job
needs : pre-job
@ -163,36 +144,31 @@ jobs:
defaults:
defaults:
run:
run:
working-directory : ./cli
working-directory : ./cli
steps:
steps:
- name : Checkout code
- name : Checkout code
uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
with:
persist-credentials : false
persist-credentials : false
- name : Setup pnpm
uses : pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name : Setup Node
- name : Setup Node
uses : actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
uses : actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
with:
node-version-file : './cli/.nvmrc'
node-version-file : './cli/.nvmrc'
cache : 'npm'
cache : 'pnpm'
cache-dependency-path : '**/package-lock.json'
cache-dependency-path : '**/pnpm-lock.yaml'
- name : Setup typescript-sdk
- name : Setup typescript-sdk
run : npm ci && npm run build
run : p npm install --frozen-lo ckf ile && p npm build
working-directory : ./open-api/typescript-sdk
working-directory : ./open-api/typescript-sdk
- name : Install deps
- name : Install deps
run : npm ci
run : pnpm install --frozen-lockfile
# Skip linter & formatter in Windows test.
# Skip linter & formatter in Windows test.
- name : Run tsc
- name : Run tsc
run : npm run check
run : p npm check
if : ${{ !cancelled() }}
if : ${{ !cancelled() }}
- name : Run unit tests & coverage
- name : Run unit tests & coverage
run : npm run test
run : p npm test
if : ${{ !cancelled() }}
if : ${{ !cancelled() }}
web-lint:
web-lint:
name : Lint Web
name : Lint Web
needs : pre-job
needs : pre-job
@ -203,39 +179,33 @@ jobs:
defaults:
defaults:
run:
run:
working-directory : ./web
working-directory : ./web
steps:
steps:
- name : Checkout code
- name : Checkout code
uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
with:
persist-credentials : false
persist-credentials : false
- name : Setup pnpm
uses : pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name : Setup Node
- name : Setup Node
uses : actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
uses : actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
with:
node-version-file : './web/.nvmrc'
node-version-file : './web/.nvmrc'
cache : 'npm'
cache : 'pnpm'
cache-dependency-path : '**/package-lock.json'
cache-dependency-path : '**/pnpm-lock.yaml'
- name : Run setup typescript-sdk
- name : Run setup typescript-sdk
run : npm ci && npm run build
run : p npm install --frozen-lo ckf ile && p npm build
working-directory : ./open-api/typescript-sdk
working-directory : ./open-api/typescript-sdk
- name : Run pnpm install
- name : Run npm install
run : pnpm rebuild && pnpm install --frozen-lockfile
run : npm ci
- name : Run linter
- name : Run linter
run : npm run lint:p
run : pnpm lint:p
if : ${{ !cancelled() }}
if : ${{ !cancelled() }}
- name : Run formatter
- name : Run formatter
run : npm run format
run : p npm format
if : ${{ !cancelled() }}
if : ${{ !cancelled() }}
- name : Run svelte checks
- name : Run svelte checks
run : npm run check:svelte
run : p npm check:svelte
if : ${{ !cancelled() }}
if : ${{ !cancelled() }}
web-unit-tests:
web-unit-tests:
name : Test Web
name : Test Web
needs : pre-job
needs : pre-job
@ -246,35 +216,30 @@ jobs:
defaults:
defaults:
run:
run:
working-directory : ./web
working-directory : ./web
steps:
steps:
- name : Checkout code
- name : Checkout code
uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
with:
persist-credentials : false
persist-credentials : false
- name : Setup pnpm
uses : pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name : Setup Node
- name : Setup Node
uses : actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
uses : actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
with:
node-version-file : './web/.nvmrc'
node-version-file : './web/.nvmrc'
cache : 'npm'
cache : 'pnpm'
cache-dependency-path : '**/package-lock.json'
cache-dependency-path : '**/pnpm-lock.yaml'
- name : Run setup typescript-sdk
- name : Run setup typescript-sdk
run : npm ci && npm run build
run : p npm install --frozen-lo ckf ile && p npm build
working-directory : ./open-api/typescript-sdk
working-directory : ./open-api/typescript-sdk
- name : Run npm install
- name : Run npm install
run : npm ci
run : pnpm install --frozen-lockfile
- name : Run tsc
- name : Run tsc
run : npm run check:typescript
run : p npm check:typescript
if : ${{ !cancelled() }}
if : ${{ !cancelled() }}
- name : Run unit tests & coverage
- name : Run unit tests & coverage
run : npm run test
run : p npm test
if : ${{ !cancelled() }}
if : ${{ !cancelled() }}
i18n-tests:
i18n-tests:
name : Test i18n
name : Test i18n
needs : pre-job
needs : pre-job
@ -287,27 +252,24 @@ jobs:
uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
with:
persist-credentials : false
persist-credentials : false
- name : Setup pnpm
uses : pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name : Setup Node
- name : Setup Node
uses : actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
uses : actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
with:
node-version-file : './web/.nvmrc'
node-version-file : './web/.nvmrc'
cache : 'npm'
cache : 'pnpm'
cache-dependency-path : '**/package-lock.json'
cache-dependency-path : '**/pnpm-lock.yaml'
- name : Install dependencies
- name : Install dependencies
run : npm --prefix=web ci
run : pnpm --filter=immich-web install --frozen-lockfile
- name : Format
- name : Format
run : npm --prefix=web run format:i18n
run : pnpm --filter=immich-web format:i18n
- name : Find file changes
- name : Find file changes
uses : tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
uses : tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
id : verify-changed-files
id : verify-changed-files
with:
with:
files : |
files : |
i18n/**
i18n/**
- name : Verify files have not changed
- name : Verify files have not changed
if : steps.verify-changed-files.outputs.files_changed == 'true'
if : steps.verify-changed-files.outputs.files_changed == 'true'
env:
env:
@ -316,7 +278,6 @@ jobs:
echo "ERROR: i18n files not up to date!"
echo "ERROR: i18n files not up to date!"
echo "Changed files: ${CHANGED_FILES}"
echo "Changed files: ${CHANGED_FILES}"
exit 1
exit 1
e2e-tests-lint:
e2e-tests-lint:
name : End-to-End Lint
name : End-to-End Lint
needs : pre-job
needs : pre-job
@ -327,41 +288,35 @@ jobs:
defaults:
defaults:
run:
run:
working-directory : ./e2e
working-directory : ./e2e
steps:
steps:
- name : Checkout code
- name : Checkout code
uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
with:
persist-credentials : false
persist-credentials : false
- name : Setup pnpm
uses : pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name : Setup Node
- name : Setup Node
uses : actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
uses : actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
with:
node-version-file : './e2e/.nvmrc'
node-version-file : './e2e/.nvmrc'
cache : 'npm'
cache : 'pnpm'
cache-dependency-path : '**/package-lock.json'
cache-dependency-path : '**/pnpm-lock.yaml'
- name : Run setup typescript-sdk
- name : Run setup typescript-sdk
run : npm ci && npm run build
run : p npm install --frozen-lo ckf ile && p npm build
working-directory : ./open-api/typescript-sdk
working-directory : ./open-api/typescript-sdk
if : ${{ !cancelled() }}
if : ${{ !cancelled() }}
- name : Install dependencies
- name : Install dependencies
run : npm ci
run : p npm install --frozen-lo ckf ile
if : ${{ !cancelled() }}
if : ${{ !cancelled() }}
- name : Run linter
- name : Run linter
run : npm run lint
run : p npm lint
if : ${{ !cancelled() }}
if : ${{ !cancelled() }}
- name : Run formatter
- name : Run formatter
run : npm run format
run : p npm format
if : ${{ !cancelled() }}
if : ${{ !cancelled() }}
- name : Run tsc
- name : Run tsc
run : npm run check
run : p npm check
if : ${{ !cancelled() }}
if : ${{ !cancelled() }}
server-medium-tests:
server-medium-tests:
name : Medium Tests (Server)
name : Medium Tests (Server)
needs : pre-job
needs : pre-job
@ -372,27 +327,24 @@ jobs:
defaults:
defaults:
run:
run:
working-directory : ./server
working-directory : ./server
steps:
steps:
- name : Checkout code
- name : Checkout code
uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
with:
persist-credentials : false
persist-credentials : false
- name : Setup pnpm
uses : pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name : Setup Node
- name : Setup Node
uses : actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
uses : actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
with:
node-version-file : './server/.nvmrc'
node-version-file : './server/.nvmrc'
cache : 'npm'
cache : 'pnpm'
cache-dependency-path : '**/package-lock.json'
cache-dependency-path : '**/pnpm-lock.yaml'
- name : Run pnpm install
- name : Run npm install
run : SHARP_IGNORE_GLOBAL_LIBVIPS=true pnpm install --frozen-lockfile
run : npm ci
- name : Run medium tests
- name : Run medium tests
run : npm run test:medium
run : pnpm test:medium
if : ${{ !cancelled() }}
if : ${{ !cancelled() }}
e2e-tests-server-cli:
e2e-tests-server-cli:
name : End-to-End Tests (Server & CLI)
name : End-to-End Tests (Server & CLI)
needs : pre-job
needs : pre-job
@ -406,43 +358,41 @@ jobs:
strategy:
strategy:
matrix:
matrix:
runner : [ ubuntu-latest, ubuntu-24.04-arm]
runner : [ ubuntu-latest, ubuntu-24.04-arm]
steps:
steps:
- name : Checkout code
- name : Checkout code
uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
with:
persist-credentials : false
persist-credentials : false
submodules : 'recursive'
submodules : 'recursive'
- name : Setup pnpm
uses : pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name : Setup Node
- name : Setup Node
uses : actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
uses : actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
with:
node-version-file : './e2e/.nvmrc'
node-version-file : './e2e/.nvmrc'
cache : 'npm'
cache : 'pnpm'
cache-dependency-path : '**/package-lock.json'
cache-dependency-path : '**/pnpm-lock.yaml'
- name : Run setup typescript-sdk
- name : Run setup typescript-sdk
run : npm ci && npm run build
run : p npm install --frozen-lo ckf ile && p npm build
working-directory : ./open-api/typescript-sdk
working-directory : ./open-api/typescript-sdk
if : ${{ !cancelled() }}
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
- name : Run setup cli
run : npm ci && npm run build
run : p npm install --frozen-lo ckf ile && p npm build
working-directory : ./cli
working-directory : ./cli
if : ${{ !cancelled() }}
if : ${{ !cancelled() }}
- name : Install dependencies
- name : Install dependencies
run : npm ci
run : p npm install --frozen-lo ckf ile
if : ${{ !cancelled() }}
if : ${{ !cancelled() }}
- name : Docker build
- name : Docker build
run : docker compose build
run : docker compose build
if : ${{ !cancelled() }}
if : ${{ !cancelled() }}
- name : Run e2e tests (api & cli)
- name : Run e2e tests (api & cli)
run : npm run test
run : p npm test
if : ${{ !cancelled() }}
if : ${{ !cancelled() }}
e2e-tests-web:
e2e-tests-web:
name : End-to-End Tests (Web)
name : End-to-End Tests (Web)
needs : pre-job
needs : pre-job
@ -456,42 +406,36 @@ jobs:
strategy:
strategy:
matrix:
matrix:
runner : [ ubuntu-latest, ubuntu-24.04-arm]
runner : [ ubuntu-latest, ubuntu-24.04-arm]
steps:
steps:
- name : Checkout code
- name : Checkout code
uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
with:
persist-credentials : false
persist-credentials : false
submodules : 'recursive'
submodules : 'recursive'
- name : Setup pnpm
uses : pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name : Setup Node
- name : Setup Node
uses : actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
uses : actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
with:
node-version-file : './e2e/.nvmrc'
node-version-file : './e2e/.nvmrc'
cache : 'npm'
cache : 'pnpm'
cache-dependency-path : '**/package-lock.json'
cache-dependency-path : '**/pnpm-lock.yaml'
- name : Run setup typescript-sdk
- name : Run setup typescript-sdk
run : npm ci && npm run build
run : p npm install --frozen-lo ckf ile && p npm build
working-directory : ./open-api/typescript-sdk
working-directory : ./open-api/typescript-sdk
if : ${{ !cancelled() }}
if : ${{ !cancelled() }}
- name : Install dependencies
- name : Install dependencies
run : npm ci
run : p npm install --frozen-lo ckf ile
if : ${{ !cancelled() }}
if : ${{ !cancelled() }}
- name : Install Playwright Browsers
- name : Install Playwright Browsers
run : npx playwright install chromium --only-shell
run : npx playwright install chromium --only-shell
if : ${{ !cancelled() }}
if : ${{ !cancelled() }}
- name : Docker build
- name : Docker build
run : docker compose build
run : docker compose build
if : ${{ !cancelled() }}
if : ${{ !cancelled() }}
- name : Run e2e tests (web)
- name : Run e2e tests (web)
run : npx playwright test
run : npx playwright test
if : ${{ !cancelled() }}
if : ${{ !cancelled() }}
success-check-e2e:
success-check-e2e:
name : End-to-End Tests Success
name : End-to-End Tests Success
needs : [ e2e-tests-server-cli, e2e-tests-web]
needs : [ e2e-tests-server-cli, e2e-tests-web]
@ -502,7 +446,6 @@ jobs:
- uses : immich-app/devtools/actions/success-check@68f10eb389bb02a3cf9d1156111964c549eb421b # 0.0.4
- uses : immich-app/devtools/actions/success-check@68f10eb389bb02a3cf9d1156111964c549eb421b # 0.0.4
with:
with:
needs : ${{ toJSON(needs) }}
needs : ${{ toJSON(needs) }}
mobile-unit-tests:
mobile-unit-tests:
name : Unit Test Mobile
name : Unit Test Mobile
needs : pre-job
needs : pre-job
@ -514,21 +457,19 @@ jobs:
- uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
with:
persist-credentials : false
persist-credentials : false
- name : Setup Flutter SDK
- name : Setup Flutter SDK
uses : subosito/flutter-action@fd55f4c5af5b953cc57a2be44cb082c8f6635e8e # v2.21.0
uses : subosito/flutter-action@fd55f4c5af5b953cc57a2be44cb082c8f6635e8e # v2.21.0
with:
with:
channel : 'stable'
channel : 'stable'
flutter-version-file : ./mobile/pubspec.yaml
flutter-version-file : ./mobile/pubspec.yaml
- name : Setup pnpm
uses : pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name : Generate translation file
- name : Generate translation file
run : make translation
run : make translation
working-directory : ./mobile
working-directory : ./mobile
- name : Run tests
- name : Run tests
working-directory : ./mobile
working-directory : ./mobile
run : flutter test -j 1
run : flutter test -j 1
ml-unit-tests:
ml-unit-tests:
name : Unit Test ML
name : Unit Test ML
needs : pre-job
needs : pre-job
@ -543,7 +484,6 @@ jobs:
- uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
with:
persist-credentials : false
persist-credentials : false
- name : Install uv
- name : Install uv
uses : astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2
uses : astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2
- uses : actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
- uses : actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
@ -566,7 +506,6 @@ jobs:
- name : Run tests and coverage
- name : Run tests and coverage
run : |
run : |
uv run pytest --cov=immich_ml --cov-report term-missing
uv run pytest --cov=immich_ml --cov-report term-missing
github-files-formatting:
github-files-formatting:
name : .github Files Formatting
name : .github Files Formatting
needs : pre-job
needs : pre-job
@ -577,27 +516,24 @@ jobs:
defaults:
defaults:
run:
run:
working-directory : ./.github
working-directory : ./.github
steps:
steps:
- name : Checkout code
- name : Checkout code
uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
with:
persist-credentials : false
persist-credentials : false
- name : Setup pnpm
uses : pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name : Setup Node
- name : Setup Node
uses : actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
uses : actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
with:
node-version-file : './.github/.nvmrc'
node-version-file : './.github/.nvmrc'
cache : 'npm'
cache : 'pnpm'
cache-dependency-path : '**/package-lock.json'
cache-dependency-path : '**/pnpm-lock.yaml'
- name : Run pnpm install
- name : Run npm install
run : pnpm install --frozen-lockfile
run : npm ci
- name : Run formatter
- name : Run formatter
run : npm run format
run : pnpm format
if : ${{ !cancelled() }}
if : ${{ !cancelled() }}
shellcheck:
shellcheck:
name : ShellCheck
name : ShellCheck
runs-on : ubuntu-latest
runs-on : ubuntu-latest
@ -607,15 +543,11 @@ jobs:
- uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
with:
persist-credentials : false
persist-credentials : false
- name : Run ShellCheck
- name : Run ShellCheck
uses : ludeeus/action-shellcheck@00cae500b08a931fb5698e11e79bfbd38e612a38 # 2.0.0
uses : ludeeus/action-shellcheck@00cae500b08a931fb5698e11e79bfbd38e612a38 # 2.0.0
with:
with:
ignore_paths : >-
ignore_paths : >-
**/open-api/**
**/open-api/** **/openapi** **/node_modules/**
**/openapi**
**/node_modules/**
generated-api-up-to-date:
generated-api-up-to-date:
name : OpenAPI Clients
name : OpenAPI Clients
runs-on : ubuntu-latest
runs-on : ubuntu-latest
@ -626,23 +558,20 @@ jobs:
uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
with:
persist-credentials : false
persist-credentials : false
- name : Setup pnpm
uses : pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name : Setup Node
- name : Setup Node
uses : actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
uses : actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
with:
node-version-file : './server/.nvmrc'
node-version-file : './server/.nvmrc'
cache : 'npm'
cache : 'pnpm'
cache-dependency-path : '**/package-lock.json'
cache-dependency-path : '**/pnpm-lock.yaml'
- name : Install server dependencies
- name : Install server dependencies
run : npm --prefix=server ci
run : SHARP_IGNORE_GLOBAL_LIBVIPS=true pnpm --filter immich install --frozen-lockfile
- name : Build the app
- name : Build the app
run : npm --prefix=server run build
run : pnpm --filter immich build
- name : Run API generation
- name : Run API generation
run : make open-api
run : make open-api
- name : Find file changes
- name : Find file changes
uses : tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
uses : tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
id : verify-changed-files
id : verify-changed-files
@ -651,7 +580,6 @@ jobs:
mobile/openapi
mobile/openapi
open-api/typescript-sdk
open-api/typescript-sdk
open-api/immich-openapi-specs.json
open-api/immich-openapi-specs.json
- name : Verify files have not changed
- name : Verify files have not changed
if : steps.verify-changed-files.outputs.files_changed == 'true'
if : steps.verify-changed-files.outputs.files_changed == 'true'
env:
env:
@ -660,7 +588,6 @@ jobs:
echo "ERROR: Generated files not up to date!"
echo "ERROR: Generated files not up to date!"
echo "Changed files: ${CHANGED_FILES}"
echo "Changed files: ${CHANGED_FILES}"
exit 1
exit 1
sql-schema-up-to-date:
sql-schema-up-to-date:
name : SQL Schema Checks
name : SQL Schema Checks
runs-on : ubuntu-latest
runs-on : ubuntu-latest
@ -674,45 +601,36 @@ jobs:
POSTGRES_USER : postgres
POSTGRES_USER : postgres
POSTGRES_DB : immich
POSTGRES_DB : immich
options : >-
options : >-
--health-cmd pg_isready
--health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
ports:
- 5432 : 5432
- 5432 : 5432
defaults:
defaults:
run:
run:
working-directory : ./server
working-directory : ./server
steps:
steps:
- name : Checkout code
- name : Checkout code
uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
with:
persist-credentials : false
persist-credentials : false
- name : Setup pnpm
uses : pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name : Setup Node
- name : Setup Node
uses : actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
uses : actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
with:
node-version-file : './server/.nvmrc'
node-version-file : './server/.nvmrc'
cache : 'npm'
cache : 'pnpm'
cache-dependency-path : '**/package-lock.json'
cache-dependency-path : '**/pnpm-lock.yaml'
- name : Install server dependencies
- name : Install server dependencies
run : npm ci
run : SHARP_IGNORE_GLOBAL_LIBVIPS=true pnpm install --frozen-lockfile
- name : Build the app
- name : Build the app
run : npm run build
run : pnpm build
- name : Run existing migrations
- name : Run existing migrations
run : npm run migrations:run
run : pnpm migrations:run
- name : Test npm run schema:reset command works
- name : Test npm run schema:reset command works
run : npm run schema:reset
run : pnpm schema:reset
- name : Generate new migrations
- name : Generate new migrations
continue-on-error : true
continue-on-error : true
run : npm run migrations:generate src/TestMigration
run : pnpm migrations:generate src/TestMigration
- name : Find file changes
- name : Find file changes
uses : tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
uses : tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
id : verify-changed-files
id : verify-changed-files
@ -728,19 +646,16 @@ jobs:
echo "Changed files: ${CHANGED_FILES}"
echo "Changed files: ${CHANGED_FILES}"
cat ./src/*-TestMigration.ts
cat ./src/*-TestMigration.ts
exit 1
exit 1
- name : Run SQL generation
- name : Run SQL generation
run : npm run sync:sql
run : p npm sync:sql
env:
env:
DB_URL : postgres://postgres:postgres@localhost:5432/immich
DB_URL : postgres://postgres:postgres@localhost:5432/immich
- name : Find file changes
- name : Find file changes
uses : tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
uses : tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
id : verify-changed-sql-files
id : verify-changed-sql-files
with:
with:
files : |
files : |
server/src/queries
server/src/queries
- name : Verify SQL files have not changed
- name : Verify SQL files have not changed
if : steps.verify-changed-sql-files.outputs.files_changed == 'true'
if : steps.verify-changed-sql-files.outputs.files_changed == 'true'
env:
env:
@ -751,77 +666,77 @@ jobs:
git diff
git diff
exit 1
exit 1
# mobile-integration-tests:
# mobile-integration-tests:
# name: Run mobile end-to-end integration tests
# name: Run mobile end-to-end integration tests
# runs-on: macos-latest
# runs-on: macos-latest
# steps:
# steps:
# - uses: actions/checkout@v4
# - uses: actions/checkout@v4
# - uses: actions/setup-java@v3
# - uses: actions/setup-java@v3
# with:
# with:
# distribution: 'zulu'
# distribution: 'zulu'
# java-version: '12.x'
# java-version: '12.x'
# cache: 'gradle'
# cache: 'gradle'
# - name: Cache android SDK
# - name: Cache android SDK
# uses: actions/cache@v3
# uses: actions/cache@v3
# id: android-sdk
# id: android-sdk
# with:
# with:
# key: android-sdk
# key: android-sdk
# path: |
# path: |
# /usr/local/lib/android/
# /usr/local/lib/android/
# ~/.android
# ~/.android
# - name: Cache Gradle
# - name: Cache Gradle
# uses: actions/cache@v3
# uses: actions/cache@v3
# with:
# with:
# path: |
# path: |
# ./mobile/build/
# ./mobile/build/
# ./mobile/android/.gradle/
# ./mobile/android/.gradle/
# key: ${{ runner.os }}-flutter-${{ hashFiles('**/*.gradle*', 'pubspec.lock') }}
# key: ${{ runner.os }}-flutter-${{ hashFiles('**/*.gradle*', 'pubspec.lock') }}
# - name: Setup Android SDK
# - name: Setup Android SDK
# if: steps.android-sdk.outputs.cache-hit != 'true'
# if: steps.android-sdk.outputs.cache-hit != 'true'
# uses: android-actions/setup-android@v2
# uses: android-actions/setup-android@v2
# - name: AVD cache
# - name: AVD cache
# uses: actions/cache@v3
# uses: actions/cache@v3
# id: avd-cache
# id: avd-cache
# with:
# with:
# path: |
# path: |
# ~/.android/avd/*
# ~/.android/avd/*
# ~/.android/adb*
# ~/.android/adb*
# key: avd-29
# key: avd-29
# - name: create AVD and generate snapshot for caching
# - name: create AVD and generate snapshot for caching
# if: steps.avd-cache.outputs.cache-hit != 'true'
# if: steps.avd-cache.outputs.cache-hit != 'true'
# uses: reactivecircus/android-emulator-runner@v2.27.0
# uses: reactivecircus/android-emulator-runner@v2.27.0
# with:
# with:
# working-directory: ./mobile
# working-directory: ./mobile
# cores: 2
# cores: 2
# api-level: 29
# api-level: 29
# arch: x86_64
# arch: x86_64
# profile: pixel
# profile: pixel
# target: default
# target: default
# force-avd-creation: false
# force-avd-creation: false
# emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
# emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
# disable-animations: false
# disable-animations: false
# script: echo "Generated AVD snapshot for caching."
# script: echo "Generated AVD snapshot for caching."
# - name: Setup Flutter SDK
# - name: Setup Flutter SDK
# uses: subosito/flutter-action@v2
# uses: subosito/flutter-action@v2
# with:
# with:
# channel: 'stable'
# channel: 'stable'
# flutter-version: '3.7.3'
# flutter-version: '3.7.3'
# cache: true
# cache: true
# - name: Run integration tests
# - name: Run integration tests
# uses: Wandalen/wretry.action@master
# uses: Wandalen/wretry.action@master
# with:
# with:
# action: reactivecircus/android-emulator-runner@v2.27.0
# action: reactivecircus/android-emulator-runner@v2.27.0
# with: |
# with: |
# working-directory: ./mobile
# working-directory: ./mobile
# cores: 2
# cores: 2
# api-level: 29
# api-level: 29
# arch: x86_64
# arch: x86_64
# profile: pixel
# profile: pixel
# target: default
# target: default
# force-avd-creation: false
# force-avd-creation: false
# emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
# emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
# disable-animations: true
# disable-animations: true
# script: |
# script: |
# flutter pub get
# flutter pub get
# flutter test integration_test
# flutter test integration_test
# attempt_limit: 3
# attempt_limit: 3