diff --git a/.github/workflows/backend-review.yml b/.github/workflows/backend-review.yml index e151087790..038c90627e 100644 --- a/.github/workflows/backend-review.yml +++ b/.github/workflows/backend-review.yml @@ -9,40 +9,136 @@ on: paths: - 'api/**' - 'packages/**' + +env: + NODE_ENV: CI + NODE_OPTIONS: '--max-old-space-size=${{ secrets.NODE_MAX_OLD_SPACE_SIZE || 6144 }}' + jobs: - tests_Backend: - name: Run Backend unit tests - timeout-minutes: 60 + build: + name: Build packages runs-on: ubuntu-latest - env: - MONGO_URI: ${{ secrets.MONGO_URI }} - OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} - JWT_SECRET: ${{ secrets.JWT_SECRET }} - CREDS_KEY: ${{ secrets.CREDS_KEY }} - CREDS_IV: ${{ secrets.CREDS_IV }} - BAN_VIOLATIONS: ${{ secrets.BAN_VIOLATIONS }} - BAN_DURATION: ${{ secrets.BAN_DURATION }} - BAN_INTERVAL: ${{ secrets.BAN_INTERVAL }} - NODE_ENV: CI - NODE_OPTIONS: '--max-old-space-size=${{ secrets.NODE_MAX_OLD_SPACE_SIZE || 6144 }}' + timeout-minutes: 15 steps: - uses: actions/checkout@v4 - - name: Use Node.js 20.x + + - name: Use Node.js 20.19 uses: actions/setup-node@v4 with: - node-version: 20 - cache: 'npm' + node-version: '20.19' + + - name: Restore node_modules cache + id: cache-node-modules + uses: actions/cache@v4 + with: + path: | + node_modules + api/node_modules + packages/api/node_modules + packages/data-provider/node_modules + packages/data-schemas/node_modules + key: node-modules-backend-${{ runner.os }}-20.19-${{ hashFiles('package-lock.json') }} - name: Install dependencies + if: steps.cache-node-modules.outputs.cache-hit != 'true' run: npm ci - - name: Install Data Provider Package + - name: Restore data-provider build cache + id: cache-data-provider + uses: actions/cache@v4 + with: + path: packages/data-provider/dist + key: build-data-provider-${{ runner.os }}-${{ hashFiles('packages/data-provider/src/**', 'packages/data-provider/tsconfig*.json', 'packages/data-provider/rollup.config.js', 'packages/data-provider/package.json') }} + + - name: Build data-provider + if: steps.cache-data-provider.outputs.cache-hit != 'true' run: npm run build:data-provider - - name: Install Data Schemas Package + - name: Restore data-schemas build cache + id: cache-data-schemas + uses: actions/cache@v4 + with: + path: packages/data-schemas/dist + key: build-data-schemas-${{ runner.os }}-${{ hashFiles('packages/data-schemas/src/**', 'packages/data-schemas/tsconfig*.json', 'packages/data-schemas/rollup.config.js', 'packages/data-schemas/package.json', 'packages/data-provider/src/**', 'packages/data-provider/tsconfig*.json', 'packages/data-provider/rollup.config.js', 'packages/data-provider/package.json') }} + + - name: Build data-schemas + if: steps.cache-data-schemas.outputs.cache-hit != 'true' run: npm run build:data-schemas - - name: Build API Package & Detect Circular Dependencies + - name: Restore api build cache + id: cache-api + uses: actions/cache@v4 + with: + path: packages/api/dist + key: build-api-${{ runner.os }}-${{ hashFiles('packages/api/src/**', 'packages/api/tsconfig*.json', 'packages/api/server-rollup.config.js', 'packages/api/package.json', 'packages/data-provider/src/**', 'packages/data-provider/tsconfig*.json', 'packages/data-provider/rollup.config.js', 'packages/data-provider/package.json', 'packages/data-schemas/src/**', 'packages/data-schemas/tsconfig*.json', 'packages/data-schemas/rollup.config.js', 'packages/data-schemas/package.json') }} + + - name: Build api + if: steps.cache-api.outputs.cache-hit != 'true' + run: npm run build:api + + - name: Upload data-provider build + uses: actions/upload-artifact@v4 + with: + name: build-data-provider + path: packages/data-provider/dist + retention-days: 2 + + - name: Upload data-schemas build + uses: actions/upload-artifact@v4 + with: + name: build-data-schemas + path: packages/data-schemas/dist + retention-days: 2 + + - name: Upload api build + uses: actions/upload-artifact@v4 + with: + name: build-api + path: packages/api/dist + retention-days: 2 + + circular-deps: + name: Circular dependency checks + needs: build + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@v4 + + - name: Use Node.js 20.19 + uses: actions/setup-node@v4 + with: + node-version: '20.19' + + - name: Restore node_modules cache + id: cache-node-modules + uses: actions/cache@v4 + with: + path: | + node_modules + api/node_modules + packages/api/node_modules + packages/data-provider/node_modules + packages/data-schemas/node_modules + key: node-modules-backend-${{ runner.os }}-20.19-${{ hashFiles('package-lock.json') }} + + - name: Install dependencies + if: steps.cache-node-modules.outputs.cache-hit != 'true' + run: npm ci + + - name: Download data-provider build + uses: actions/download-artifact@v4 + with: + name: build-data-provider + path: packages/data-provider/dist + + - name: Download data-schemas build + uses: actions/download-artifact@v4 + with: + name: build-data-schemas + path: packages/data-schemas/dist + + - name: Rebuild @librechat/api and check for circular dependencies run: | output=$(npm run build:api 2>&1) echo "$output" @@ -51,12 +147,7 @@ jobs: exit 1 fi - - name: Create empty auth.json file - run: | - mkdir -p api/data - echo '{}' > api/data/auth.json - - - name: Check for Circular dependency in rollup + - name: Detect circular dependencies in rollup working-directory: ./packages/data-provider run: | output=$(npm run rollup:api) @@ -66,17 +157,201 @@ jobs: exit 1 fi + test-api: + name: 'Tests: api' + needs: build + runs-on: ubuntu-latest + timeout-minutes: 15 + env: + MONGO_URI: ${{ secrets.MONGO_URI }} + OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + JWT_SECRET: ${{ secrets.JWT_SECRET }} + CREDS_KEY: ${{ secrets.CREDS_KEY }} + CREDS_IV: ${{ secrets.CREDS_IV }} + BAN_VIOLATIONS: ${{ secrets.BAN_VIOLATIONS }} + BAN_DURATION: ${{ secrets.BAN_DURATION }} + BAN_INTERVAL: ${{ secrets.BAN_INTERVAL }} + steps: + - uses: actions/checkout@v4 + + - name: Use Node.js 20.19 + uses: actions/setup-node@v4 + with: + node-version: '20.19' + + - name: Restore node_modules cache + id: cache-node-modules + uses: actions/cache@v4 + with: + path: | + node_modules + api/node_modules + packages/api/node_modules + packages/data-provider/node_modules + packages/data-schemas/node_modules + key: node-modules-backend-${{ runner.os }}-20.19-${{ hashFiles('package-lock.json') }} + + - name: Install dependencies + if: steps.cache-node-modules.outputs.cache-hit != 'true' + run: npm ci + + - name: Download data-provider build + uses: actions/download-artifact@v4 + with: + name: build-data-provider + path: packages/data-provider/dist + + - name: Download data-schemas build + uses: actions/download-artifact@v4 + with: + name: build-data-schemas + path: packages/data-schemas/dist + + - name: Download api build + uses: actions/download-artifact@v4 + with: + name: build-api + path: packages/api/dist + + - name: Create empty auth.json file + run: | + mkdir -p api/data + echo '{}' > api/data/auth.json + - name: Prepare .env.test file run: cp api/test/.env.test.example api/test/.env.test - name: Run unit tests run: cd api && npm run test:ci - - name: Run librechat-data-provider unit tests + test-data-provider: + name: 'Tests: data-provider' + needs: build + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@v4 + + - name: Use Node.js 20.19 + uses: actions/setup-node@v4 + with: + node-version: '20.19' + + - name: Restore node_modules cache + id: cache-node-modules + uses: actions/cache@v4 + with: + path: | + node_modules + api/node_modules + packages/api/node_modules + packages/data-provider/node_modules + packages/data-schemas/node_modules + key: node-modules-backend-${{ runner.os }}-20.19-${{ hashFiles('package-lock.json') }} + + - name: Install dependencies + if: steps.cache-node-modules.outputs.cache-hit != 'true' + run: npm ci + + - name: Download data-provider build + uses: actions/download-artifact@v4 + with: + name: build-data-provider + path: packages/data-provider/dist + + - name: Run unit tests run: cd packages/data-provider && npm run test:ci - - name: Run @librechat/data-schemas unit tests + test-data-schemas: + name: 'Tests: data-schemas' + needs: build + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@v4 + + - name: Use Node.js 20.19 + uses: actions/setup-node@v4 + with: + node-version: '20.19' + + - name: Restore node_modules cache + id: cache-node-modules + uses: actions/cache@v4 + with: + path: | + node_modules + api/node_modules + packages/api/node_modules + packages/data-provider/node_modules + packages/data-schemas/node_modules + key: node-modules-backend-${{ runner.os }}-20.19-${{ hashFiles('package-lock.json') }} + + - name: Install dependencies + if: steps.cache-node-modules.outputs.cache-hit != 'true' + run: npm ci + + - name: Download data-provider build + uses: actions/download-artifact@v4 + with: + name: build-data-provider + path: packages/data-provider/dist + + - name: Download data-schemas build + uses: actions/download-artifact@v4 + with: + name: build-data-schemas + path: packages/data-schemas/dist + + - name: Run unit tests run: cd packages/data-schemas && npm run test:ci - - name: Run @librechat/api unit tests + test-packages-api: + name: 'Tests: @librechat/api' + needs: build + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@v4 + + - name: Use Node.js 20.19 + uses: actions/setup-node@v4 + with: + node-version: '20.19' + + - name: Restore node_modules cache + id: cache-node-modules + uses: actions/cache@v4 + with: + path: | + node_modules + api/node_modules + packages/api/node_modules + packages/data-provider/node_modules + packages/data-schemas/node_modules + key: node-modules-backend-${{ runner.os }}-20.19-${{ hashFiles('package-lock.json') }} + + - name: Install dependencies + if: steps.cache-node-modules.outputs.cache-hit != 'true' + run: npm ci + + - name: Download data-provider build + uses: actions/download-artifact@v4 + with: + name: build-data-provider + path: packages/data-provider/dist + + - name: Download data-schemas build + uses: actions/download-artifact@v4 + with: + name: build-data-schemas + path: packages/data-schemas/dist + + - name: Download api build + uses: actions/download-artifact@v4 + with: + name: build-api + path: packages/api/dist + + - name: Run unit tests run: cd packages/api && npm run test:ci diff --git a/.github/workflows/frontend-review.yml b/.github/workflows/frontend-review.yml index 989e2e4abe..9c2d4a37b1 100644 --- a/.github/workflows/frontend-review.yml +++ b/.github/workflows/frontend-review.yml @@ -2,7 +2,7 @@ name: Frontend Unit Tests on: pull_request: - branches: + branches: - main - dev - dev-staging @@ -11,51 +11,200 @@ on: - 'client/**' - 'packages/data-provider/**' +env: + NODE_OPTIONS: '--max-old-space-size=${{ secrets.NODE_MAX_OLD_SPACE_SIZE || 6144 }}' + jobs: - tests_frontend_ubuntu: - name: Run frontend unit tests on Ubuntu - timeout-minutes: 60 + build: + name: Build packages runs-on: ubuntu-latest - env: - NODE_OPTIONS: '--max-old-space-size=${{ secrets.NODE_MAX_OLD_SPACE_SIZE || 6144 }}' + timeout-minutes: 15 steps: - uses: actions/checkout@v4 - - name: Use Node.js 20.x + + - name: Use Node.js 20.19 uses: actions/setup-node@v4 with: - node-version: 20 - cache: 'npm' + node-version: '20.19' + + - name: Restore node_modules cache + id: cache-node-modules + uses: actions/cache@v4 + with: + path: | + node_modules + client/node_modules + packages/client/node_modules + packages/data-provider/node_modules + key: node-modules-frontend-${{ runner.os }}-20.19-${{ hashFiles('package-lock.json') }} - name: Install dependencies + if: steps.cache-node-modules.outputs.cache-hit != 'true' run: npm ci - - name: Build Client - run: npm run frontend:ci + - name: Restore data-provider build cache + id: cache-data-provider + uses: actions/cache@v4 + with: + path: packages/data-provider/dist + key: build-data-provider-${{ runner.os }}-${{ hashFiles('packages/data-provider/src/**', 'packages/data-provider/tsconfig*.json', 'packages/data-provider/rollup.config.js', 'packages/data-provider/package.json') }} + + - name: Build data-provider + if: steps.cache-data-provider.outputs.cache-hit != 'true' + run: npm run build:data-provider + + - name: Restore client-package build cache + id: cache-client-package + uses: actions/cache@v4 + with: + path: packages/client/dist + key: build-client-package-${{ runner.os }}-${{ hashFiles('packages/client/src/**', 'packages/client/tsconfig*.json', 'packages/client/rollup.config.js', 'packages/client/package.json', 'packages/data-provider/src/**', 'packages/data-provider/tsconfig*.json', 'packages/data-provider/rollup.config.js', 'packages/data-provider/package.json') }} + + - name: Build client-package + if: steps.cache-client-package.outputs.cache-hit != 'true' + run: npm run build:client-package + + - name: Upload data-provider build + uses: actions/upload-artifact@v4 + with: + name: build-data-provider + path: packages/data-provider/dist + retention-days: 2 + + - name: Upload client-package build + uses: actions/upload-artifact@v4 + with: + name: build-client-package + path: packages/client/dist + retention-days: 2 + + test-ubuntu: + name: 'Tests: Ubuntu' + needs: build + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - uses: actions/checkout@v4 + + - name: Use Node.js 20.19 + uses: actions/setup-node@v4 + with: + node-version: '20.19' + + - name: Restore node_modules cache + id: cache-node-modules + uses: actions/cache@v4 + with: + path: | + node_modules + client/node_modules + packages/client/node_modules + packages/data-provider/node_modules + key: node-modules-frontend-${{ runner.os }}-20.19-${{ hashFiles('package-lock.json') }} + + - name: Install dependencies + if: steps.cache-node-modules.outputs.cache-hit != 'true' + run: npm ci + + - name: Download data-provider build + uses: actions/download-artifact@v4 + with: + name: build-data-provider + path: packages/data-provider/dist + + - name: Download client-package build + uses: actions/download-artifact@v4 + with: + name: build-client-package + path: packages/client/dist - name: Run unit tests run: npm run test:ci --verbose working-directory: client - tests_frontend_windows: - name: Run frontend unit tests on Windows - timeout-minutes: 60 + test-windows: + name: 'Tests: Windows' + needs: build runs-on: windows-latest - env: - NODE_OPTIONS: '--max-old-space-size=${{ secrets.NODE_MAX_OLD_SPACE_SIZE || 6144 }}' + timeout-minutes: 20 steps: - uses: actions/checkout@v4 - - name: Use Node.js 20.x + + - name: Use Node.js 20.19 uses: actions/setup-node@v4 with: - node-version: 20 - cache: 'npm' + node-version: '20.19' + + - name: Restore node_modules cache + id: cache-node-modules + uses: actions/cache@v4 + with: + path: | + node_modules + client/node_modules + packages/client/node_modules + packages/data-provider/node_modules + key: node-modules-frontend-${{ runner.os }}-20.19-${{ hashFiles('package-lock.json') }} - name: Install dependencies + if: steps.cache-node-modules.outputs.cache-hit != 'true' run: npm ci - - name: Build Client - run: npm run frontend:ci + - name: Download data-provider build + uses: actions/download-artifact@v4 + with: + name: build-data-provider + path: packages/data-provider/dist + + - name: Download client-package build + uses: actions/download-artifact@v4 + with: + name: build-client-package + path: packages/client/dist - name: Run unit tests run: npm run test:ci --verbose - working-directory: client \ No newline at end of file + working-directory: client + + build-verify: + name: Vite build verification + needs: build + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - uses: actions/checkout@v4 + + - name: Use Node.js 20.19 + uses: actions/setup-node@v4 + with: + node-version: '20.19' + + - name: Restore node_modules cache + id: cache-node-modules + uses: actions/cache@v4 + with: + path: | + node_modules + client/node_modules + packages/client/node_modules + packages/data-provider/node_modules + key: node-modules-frontend-${{ runner.os }}-20.19-${{ hashFiles('package-lock.json') }} + + - name: Install dependencies + if: steps.cache-node-modules.outputs.cache-hit != 'true' + run: npm ci + + - name: Download data-provider build + uses: actions/download-artifact@v4 + with: + name: build-data-provider + path: packages/data-provider/dist + + - name: Download client-package build + uses: actions/download-artifact@v4 + with: + name: build-client-package + path: packages/client/dist + + - name: Build client + run: cd client && npm run build:ci diff --git a/api/jest.config.js b/api/jest.config.js index 20ee3c6aed..3b752403c1 100644 --- a/api/jest.config.js +++ b/api/jest.config.js @@ -3,6 +3,7 @@ module.exports = { clearMocks: true, roots: [''], coverageDirectory: 'coverage', + maxWorkers: '50%', testTimeout: 30000, // 30 seconds timeout for all tests setupFiles: ['./test/jestSetup.js', './test/__mocks__/logger.js'], moduleNameMapper: { diff --git a/client/jest.config.cjs b/client/jest.config.cjs index db0268d352..44acf8ea26 100644 --- a/client/jest.config.cjs +++ b/client/jest.config.cjs @@ -32,6 +32,7 @@ module.exports = { '^librechat-data-provider/react-query$': '/../node_modules/librechat-data-provider/src/react-query', }, + maxWorkers: '50%', restoreMocks: true, testResultsProcessor: 'jest-junit', coverageReporters: ['text', 'cobertura', 'lcov'], diff --git a/packages/api/jest.config.mjs b/packages/api/jest.config.mjs index 5506d6e483..530150a7fa 100644 --- a/packages/api/jest.config.mjs +++ b/packages/api/jest.config.mjs @@ -33,6 +33,7 @@ export default { // lines: 57, // }, // }, + maxWorkers: '50%', restoreMocks: true, testTimeout: 15000, }; diff --git a/packages/client/jest.config.js b/packages/client/jest.config.js index bb8a22dcc9..23822aa097 100644 --- a/packages/client/jest.config.js +++ b/packages/client/jest.config.js @@ -16,6 +16,7 @@ export default { // lines: 57, // }, // }, + maxWorkers: '50%', restoreMocks: true, testTimeout: 15000, // React component testing requires jsdom environment diff --git a/packages/data-provider/jest.config.js b/packages/data-provider/jest.config.js index 6b8c4abe79..70340d36fc 100644 --- a/packages/data-provider/jest.config.js +++ b/packages/data-provider/jest.config.js @@ -14,5 +14,6 @@ module.exports = { // lines: 57, // }, // }, + maxWorkers: '50%', restoreMocks: true, }; diff --git a/packages/data-schemas/jest.config.mjs b/packages/data-schemas/jest.config.mjs index b1fae43705..19d392f368 100644 --- a/packages/data-schemas/jest.config.mjs +++ b/packages/data-schemas/jest.config.mjs @@ -15,6 +15,7 @@ export default { // lines: 57, // }, // }, + maxWorkers: '50%', restoreMocks: true, testTimeout: 15000, };