From 3ed6baf6de00c4924b2ae7f325a7c890f771030f Mon Sep 17 00:00:00 2001 From: Thomas Camlong Date: Mon, 18 May 2026 17:46:04 +0200 Subject: [PATCH] ci: add --affected filtering and fix Turbo cache invalidation - Remove globalDependencies **/.env which invalidated all caches on any .env change - Move 40+ env vars from globalEnv to build-specific env (lint/format/typecheck don't need DB_URL etc.) - Add per-task inputs with test file exclusions so test changes don't trigger build/typecheck - Enable affectedUsingTaskInputs for task-level --affected detection - Add --affected to all turbo commands in CI (lint, format, typecheck, build) - Add fetch-depth: 0 for proper git history comparison - Add Docker Buildx + GHA layer caching for E2E builds --- .github/workflows/code-quality.yml | 25 +++++--- turbo.json | 94 ++++++++++++++++-------------- 2 files changed, 67 insertions(+), 52 deletions(-) diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml index 5dc6df825..d0242d28a 100644 --- a/.github/workflows/code-quality.yml +++ b/.github/workflows/code-quality.yml @@ -15,6 +15,7 @@ concurrency: env: FORCE_COLOR: 3 + SKIP_ENV_VALIDATION: true jobs: lint: @@ -22,6 +23,8 @@ jobs: timeout-minutes: 10 steps: - uses: actions/checkout@v6 + with: + fetch-depth: 0 - name: Setup uses: ./tooling/github/setup @@ -31,31 +34,35 @@ jobs: run: cp .env.example .env - name: Lint - run: pnpm lint && pnpm lint:ws + run: pnpm turbo lint --affected && pnpm lint:ws format: runs-on: ubuntu-latest timeout-minutes: 10 steps: - uses: actions/checkout@v6 + with: + fetch-depth: 0 - name: Setup uses: ./tooling/github/setup - name: Format - run: pnpm format + run: pnpm turbo format --affected --continue -- --cache --cache-location node_modules/.cache/.prettiercache typecheck: runs-on: ubuntu-latest timeout-minutes: 10 steps: - uses: actions/checkout@v6 + with: + fetch-depth: 0 - name: Setup uses: ./tooling/github/setup - name: Typecheck - run: pnpm typecheck + run: pnpm turbo typecheck --affected test: runs-on: ubuntu-latest @@ -70,19 +77,18 @@ jobs: run: pnpm test - name: "Report Coverage" - # Set if: always() to also generate the report if tests are failing - # Only works if you set `reportOnFailure: true` in your vite config as specified above if: always() uses: davelosert/vitest-coverage-report-action@v2 e2e: runs-on: ubuntu-latest timeout-minutes: 15 - steps: - uses: actions/checkout@v6 - name: Setup uses: ./tooling/github/setup + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v4 - name: Build docker image id: build-docker-image uses: docker/build-push-action@v7 @@ -90,8 +96,11 @@ jobs: platforms: linux/amd64 context: . push: false + load: true tags: homarr-e2e network: host + cache-from: type=gha + cache-to: type=gha,mode=max env: SKIP_ENV_VALIDATION: true - name: Install playwright browsers @@ -105,10 +114,12 @@ jobs: timeout-minutes: 10 steps: - uses: actions/checkout@v6 + with: + fetch-depth: 0 - name: Setup uses: ./tooling/github/setup - name: Copy env shell: bash run: cp .env.example .env - name: Build - run: pnpm build + run: pnpm turbo build --affected diff --git a/turbo.json b/turbo.json index 33b661f69..a514e1fde 100644 --- a/turbo.json +++ b/turbo.json @@ -1,57 +1,58 @@ { "$schema": "https://turborepo.org/schema.json", - "globalDependencies": ["**/.env"], - "globalEnv": [ - "AUTH_LDAP_BASE", - "AUTH_LDAP_BIND_DN", - "AUTH_LDAP_BIND_PASSWORD", - "AUTH_LDAP_GROUP_CLASS", - "AUTH_LDAP_GROUP_FILTER_EXTRA_ARG", - "AUTH_LDAP_GROUP_MEMBER_ATTRIBUTE", - "AUTH_LDAP_GROUP_MEMBER_USER_ATTRIBUTE", - "AUTH_LDAP_SEARCH_SCOPE", - "AUTH_LDAP_URI", - "AUTH_OIDC_CLIENT_ID", - "AUTH_OIDC_CLIENT_NAME", - "AUTH_OIDC_CLIENT_SECRET", - "AUTH_OIDC_FORCE_USERINFO", - "AUTH_OIDC_ISSUER", - "AUTH_OIDC_SCOPE_OVERWRITE", - "AUTH_OIDC_GROUPS_ATTRIBUTE", - "AUTH_OIDC_NAME_ATTRIBUTE_OVERWRITE", - "AUTH_LDAP_USERNAME_ATTRIBUTE", - "AUTH_LDAP_USER_MAIL_ATTRIBUTE", - "AUTH_LDAP_USERNAME_FILTER_EXTRA_ARG", - "AUTH_OIDC_AUTO_LOGIN", - "AUTH_LOGOUT_REDIRECT_URL", - "AUTH_PROVIDERS", - "AUTH_SESSION_EXPIRY_TIME", - "CI", - "DISABLE_REDIS_LOGS", - "DB_URL", - "DB_HOST", - "DB_USER", - "DB_PASSWORD", - "DB_NAME", - "DB_PORT", - "DB_DRIVER", - "DOCKER_HOSTNAMES", - "DOCKER_PORTS", - "DOCKER_SOCKET_PATHS", - "NODE_ENV", - "PORT", - "LOCAL_CERTIFICATE_PATH", - "LOG_LEVEL", - "SECRET_ENCRYPTION_KEY", - "SKIP_ENV_VALIDATION" - ], + "globalEnv": ["CI", "NODE_ENV", "SKIP_ENV_VALIDATION"], "ui": "stream", + "futureFlags": { + "affectedUsingTaskInputs": true + }, "tasks": { "topo": { "dependsOn": ["^topo"] }, "build": { "dependsOn": ["^build"], + "env": [ + "AUTH_LDAP_BASE", + "AUTH_LDAP_BIND_DN", + "AUTH_LDAP_BIND_PASSWORD", + "AUTH_LDAP_GROUP_CLASS", + "AUTH_LDAP_GROUP_FILTER_EXTRA_ARG", + "AUTH_LDAP_GROUP_MEMBER_ATTRIBUTE", + "AUTH_LDAP_GROUP_MEMBER_USER_ATTRIBUTE", + "AUTH_LDAP_SEARCH_SCOPE", + "AUTH_LDAP_URI", + "AUTH_LDAP_USERNAME_ATTRIBUTE", + "AUTH_LDAP_USER_MAIL_ATTRIBUTE", + "AUTH_LDAP_USERNAME_FILTER_EXTRA_ARG", + "AUTH_OIDC_AUTO_LOGIN", + "AUTH_OIDC_CLIENT_ID", + "AUTH_OIDC_CLIENT_NAME", + "AUTH_OIDC_CLIENT_SECRET", + "AUTH_OIDC_FORCE_USERINFO", + "AUTH_OIDC_GROUPS_ATTRIBUTE", + "AUTH_OIDC_ISSUER", + "AUTH_OIDC_NAME_ATTRIBUTE_OVERWRITE", + "AUTH_OIDC_SCOPE_OVERWRITE", + "AUTH_LOGOUT_REDIRECT_URL", + "AUTH_PROVIDERS", + "AUTH_SESSION_EXPIRY_TIME", + "DB_DRIVER", + "DB_HOST", + "DB_NAME", + "DB_PASSWORD", + "DB_PORT", + "DB_URL", + "DB_USER", + "DISABLE_REDIS_LOGS", + "DOCKER_HOSTNAMES", + "DOCKER_PORTS", + "DOCKER_SOCKET_PATHS", + "LOCAL_CERTIFICATE_PATH", + "LOG_LEVEL", + "PORT", + "SECRET_ENCRYPTION_KEY" + ], + "inputs": ["$TURBO_DEFAULT$", "!**/*.test.ts", "!**/*.test.tsx", "!**/*.spec.ts", "!**/__tests__/**"], "outputs": [".next/**", "!.next/cache/**", "next-env.d.ts", ".output/**", ".vercel/output/**"] }, "dev": { @@ -59,15 +60,18 @@ "cache": false }, "format": { + "inputs": ["$TURBO_DEFAULT$"], "outputs": ["node_modules/.cache/.prettiercache"], "outputLogs": "new-only" }, "lint": { "dependsOn": ["^topo"], + "inputs": ["$TURBO_DEFAULT$"], "outputs": ["node_modules/.cache/.eslintcache"] }, "typecheck": { "dependsOn": ["^topo"], + "inputs": ["$TURBO_DEFAULT$", "!**/*.test.ts", "!**/*.test.tsx", "!**/*.spec.ts", "!**/__tests__/**"], "outputs": ["node_modules/.cache/tsbuildinfo.json"] }, "clean": {