name: 'Tests' on: push: branches: - main - develop - v5/main pull_request: paths-ignore: - 'docs/**' - '**.mdx?' concurrency: group: ${{ github.workflow }}-${{ github.ref_name }} cancel-in-progress: true permissions: contents: read # to fetch code (actions/checkout) actions: read jobs: changes: runs-on: ubuntu-latest permissions: pull-requests: read outputs: backend: ${{ steps.filter.outputs.backend }} frontend: ${{ steps.filter.outputs.frontend }} steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - uses: dorny/paths-filter@v3 id: filter with: filters: .github/filters.yaml pretty: name: 'pretty (node: 20)' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - uses: actions/setup-node@v4 with: node-version: 20 - uses: nrwl/nx-set-shas@v4 - name: Monorepo install uses: ./.github/actions/yarn-nm-install - name: Run lint run: yarn prettier:check lint: name: 'lint (node: 20)' needs: [build] runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - uses: actions/setup-node@v4 with: node-version: 20 - uses: nrwl/nx-set-shas@v4 - name: Monorepo install uses: ./.github/actions/yarn-nm-install - name: Monorepo build uses: ./.github/actions/run-build - name: Run lint run: yarn nx affected --target=lint --parallel --nx-ignore-cycles build: name: 'build (node: 20)' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 20 - name: Monorepo install uses: ./.github/actions/yarn-nm-install - name: Monorepo build uses: ./.github/actions/run-build typescript: name: 'typescript' needs: [build] runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - uses: actions/setup-node@v4 with: node-version: 20 - uses: nrwl/nx-set-shas@v4 - name: Monorepo install uses: ./.github/actions/yarn-nm-install - name: Monorepo build uses: ./.github/actions/run-build - name: TSC for packages run: yarn nx affected --target=test:ts --nx-ignore-cycles - name: TSC for back run: yarn nx affected --target=test:ts:back --nx-ignore-cycles - name: TSC for front run: yarn nx affected --target=test:ts:front --nx-ignore-cycles unit_back: name: 'unit_back (node: ${{ matrix.node }})' needs: [changes, build] runs-on: ubuntu-latest env: YARN_ENABLE_IMMUTABLE_INSTALLS: false strategy: matrix: node: [18, 20] steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node }} - uses: nrwl/nx-set-shas@v4 - name: Monorepo install uses: ./.github/actions/yarn-nm-install - name: Monorepo build uses: ./.github/actions/run-build - name: Run tests run: yarn nx affected --target=test:unit --nx-ignore-cycles unit_front: name: 'unit_front (node: ${{ matrix.node }})' needs: [changes, build] runs-on: ubuntu-latest strategy: matrix: node: [20] steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node }} - uses: nrwl/nx-set-shas@v4 - name: Monorepo install uses: ./.github/actions/yarn-nm-install - name: Monorepo build uses: ./.github/actions/run-build - name: Run test run: yarn nx affected --target=test:front --nx-ignore-cycles -- --runInBand e2e_ce: timeout-minutes: 60 needs: [changes, build] name: '[CE] e2e (browser: ${{ matrix.project }})' runs-on: ubuntu-latest strategy: fail-fast: false matrix: project: ['chromium', 'webkit', 'firefox'] shard: [1/2, 2/2] steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - uses: actions/setup-node@v4 with: node-version: 20 - name: Monorepo install uses: ./.github/actions/yarn-nm-install - name: Install Playwright Browsers run: npx playwright@1.42.1 install --with-deps - name: Monorepo build uses: ./.github/actions/run-build - name: Run [CE] E2E tests uses: ./.github/actions/run-e2e-tests with: runEE: false jestOptions: '--project=${{ matrix.project }} --shard=${{ matrix.shard }}' - uses: actions/upload-artifact@v4 if: failure() with: name: ce-${{ matrix.project }}--playwright-trace path: test-apps/e2e/test-results/**/trace.zip retention-days: 1 e2e_ee: timeout-minutes: 60 needs: [changes, build] name: '[EE] e2e (browser: ${{ matrix.project }})' runs-on: ubuntu-latest env: STRAPI_LICENSE: ${{ secrets.strapiLicense }} strategy: fail-fast: false matrix: project: ['chromium', 'webkit', 'firefox'] shard: [1/2, 2/2] steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - uses: actions/setup-node@v4 with: node-version: 20 - name: Monorepo install uses: ./.github/actions/yarn-nm-install - name: Install Playwright Browsers run: npx playwright@1.42.1 install --with-deps - name: Monorepo build uses: ./.github/actions/run-build - name: Run [EE] E2E tests uses: ./.github/actions/run-e2e-tests with: runEE: true enableFutureFeatures: true jestOptions: '--project=${{ matrix.project }} --shard=${{ matrix.shard }}' - uses: actions/upload-artifact@v4 if: failure() with: name: ee-${{ matrix.project }}--playwright-trace path: test-apps/e2e/test-results/**/trace.zip retention-days: 1 cli: timeout-minutes: 60 needs: [changes, build, typescript] name: 'CLI Tests' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - uses: actions/setup-node@v4 with: node-version: 18 - name: Monorepo install uses: ./.github/actions/yarn-nm-install - name: Monorepo build uses: ./.github/actions/run-build - name: Run CLI tests run: yarn test:cli api_ce_pg: if: needs.changes.outputs.backend == 'true' runs-on: ubuntu-latest needs: [changes, build] name: '[CE] API Integration (postgres, node: ${{ matrix.node }}, shard: ${{ matrix.shard }})' strategy: matrix: node: [18, 20] shard: [1/5, 2/5, 3/5, 4/5, 5/5] services: postgres: # Docker Hub image image: postgres # Provide the password for postgres env: POSTGRES_USER: strapi POSTGRES_PASSWORD: strapi POSTGRES_DB: strapi_test # Set health checks to wait until postgres has started options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 -v /__w/.github/workflows/db/postgres:/docker-entrypoint-initdb.d ports: # Maps tcp port 5432 on service container to the host - 5432:5432 steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node }} - name: Monorepo install uses: ./.github/actions/yarn-nm-install - name: Monorepo build uses: ./.github/actions/run-build - uses: ./.github/actions/run-api-tests with: dbOptions: '--dbclient=postgres --dbhost=localhost --dbport=5432 --dbname=strapi_test --dbusername=strapi --dbpassword=strapi' jestOptions: '--shard=${{ matrix.shard }}' api_ce_mysql: if: needs.changes.outputs.backend == 'true' runs-on: ubuntu-latest needs: [changes, build, typescript, unit_back, unit_front] name: '[CE] API Integration (mysql:latest, package: mysql2}, node: ${{ matrix.node }}, shard: ${{ matrix.shard }})' strategy: matrix: node: [18, 20] shard: [1/5, 2/5, 3/5, 4/5, 5/5] services: mysql: image: bitnami/mysql:latest env: MYSQL_ROOT_PASSWORD: strapi MYSQL_USER: strapi MYSQL_PASSWORD: strapi MYSQL_DATABASE: strapi_test options: >- --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 ports: # Maps tcp port 5432 on service container to the host - 3306:3306 steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node }} - name: Monorepo install uses: ./.github/actions/yarn-nm-install - name: Monorepo build uses: ./.github/actions/run-build - uses: ./.github/actions/run-api-tests with: dbOptions: '--dbclient=${{ matrix.db_client }} --dbhost=localhost --dbport=3306 --dbname=strapi_test --dbusername=strapi --dbpassword=strapi' jestOptions: '--shard=${{ matrix.shard }}' api_ce_sqlite: if: needs.changes.outputs.backend == 'true' runs-on: ubuntu-latest needs: [changes, build, typescript, unit_back, unit_front] name: '[CE] API Integration (sqlite, package: better-sqlite3, node: ${{ matrix.node }}, shard: ${{ matrix.shard }})' strategy: matrix: node: [18, 20] shard: [1/5, 2/5, 3/5, 4/5, 5/5] steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node }} - name: Monorepo install uses: ./.github/actions/yarn-nm-install - name: Monorepo build uses: ./.github/actions/run-build - uses: ./.github/actions/run-api-tests with: dbOptions: '--dbclient=sqlite --dbfile=./tmp/data.db' jestOptions: '--shard=${{ matrix.shard }}' # EE api_ee_pg: runs-on: ubuntu-latest needs: [changes, build] name: '[EE] API Integration (postgres, node: ${{ matrix.node }}, shard: ${{ matrix.shard }})' if: needs.changes.outputs.backend == 'true' && github.event.pull_request.head.repo.full_name == github.repository && !(github.actor == 'dependabot[bot]' || github.actor == 'dependabot-preview[bot]') env: STRAPI_LICENSE: ${{ secrets.strapiLicense }} strategy: matrix: node: [18, 20] shard: [1/5, 2/5, 3/5, 4/5, 5/5] services: postgres: # Docker Hub image image: postgres # Provide the password for postgres env: POSTGRES_USER: strapi POSTGRES_PASSWORD: strapi POSTGRES_DB: strapi_test # Set health checks to wait until postgres has started options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 -v /__w/.github/workflows/db/postgres:/docker-entrypoint-initdb.d ports: # Maps tcp port 5432 on service container to the host - 5432:5432 steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node }} - name: Monorepo install uses: ./.github/actions/yarn-nm-install - name: Monorepo build uses: ./.github/actions/run-build - uses: ./.github/actions/run-api-tests with: dbOptions: '--dbclient=postgres --dbhost=localhost --dbport=5432 --dbname=strapi_test --dbusername=strapi --dbpassword=strapi' runEE: true jestOptions: '--shard=${{ matrix.shard }}' api_ee_mysql: runs-on: ubuntu-latest needs: [changes, build, typescript, unit_back, unit_front] name: '[EE] API Integration (mysql:latest, package: mysql2, node: ${{ matrix.node }}, shard: ${{ matrix.shard }})' if: needs.changes.outputs.backend == 'true' && github.event.pull_request.head.repo.full_name == github.repository && !(github.actor == 'dependabot[bot]' || github.actor == 'dependabot-preview[bot]') env: STRAPI_LICENSE: ${{ secrets.strapiLicense }} strategy: matrix: node: [18, 20] shard: [1/5, 2/5, 3/5, 4/5, 5/5] services: mysql: image: bitnami/mysql:latest env: MYSQL_ROOT_PASSWORD: strapi MYSQL_USER: strapi MYSQL_PASSWORD: strapi MYSQL_DATABASE: strapi_test options: >- --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 ports: # Maps tcp port 5432 on service container to the host - 3306:3306 steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node }} - name: Monorepo install uses: ./.github/actions/yarn-nm-install - name: Monorepo build uses: ./.github/actions/run-build - uses: ./.github/actions/run-api-tests with: dbOptions: '--dbclient=mysql --dbhost=localhost --dbport=3306 --dbname=strapi_test --dbusername=strapi --dbpassword=strapi' runEE: true jestOptions: '--shard=${{ matrix.shard }}' api_ee_sqlite: runs-on: ubuntu-latest needs: [changes, build, typescript, unit_back, unit_front] name: '[EE] API Integration (sqlite, client: better-sqlite3, node: ${{ matrix.node }}, shard: ${{ matrix.shard }})' if: needs.changes.outputs.backend == 'true' && github.event.pull_request.head.repo.full_name == github.repository && !(github.actor == 'dependabot[bot]' || github.actor == 'dependabot-preview[bot]') env: STRAPI_LICENSE: ${{ secrets.strapiLicense }} strategy: matrix: node: [18, 20] shard: [1/5, 2/5, 3/5, 4/5, 5/5] steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node }} - name: Monorepo install uses: ./.github/actions/yarn-nm-install - name: Monorepo build uses: ./.github/actions/run-build - uses: ./.github/actions/run-api-tests with: dbOptions: '--dbclient=sqlite --dbfile=./tmp/data.db' runEE: true jestOptions: '--shard=${{ matrix.shard }}' test_result: if: ${{ always() }} runs-on: ubuntu-latest name: aggregate_test_result needs: [ pretty, lint, build, typescript, unit_back, unit_front, e2e_ce, e2e_ee, cli, api_ce_pg, api_ce_mysql, api_ce_sqlite, api_ee_pg, api_ee_mysql, api_ee_sqlite, ] steps: - run: exit 1 if: >- ${{ contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') }}