-
Notifications
You must be signed in to change notification settings - Fork 441
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ci: speed up the CI by running tests concurrently (#233)
- Loading branch information
1 parent
3ab6cd6
commit 2667b7d
Showing
1 changed file
with
125 additions
and
21 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -11,38 +11,142 @@ on: | |
branches: | ||
- '**' | ||
jobs: | ||
build: | ||
runs-on: ubuntu-latest | ||
name: Build the package | ||
steps: | ||
- uses: actions/checkout@v3 | ||
- uses: pnpm/action-setup@v2 | ||
with: | ||
version: 7 | ||
- uses: actions/setup-node@v3 | ||
with: | ||
node-version: 18 | ||
cache: 'pnpm' | ||
- run: pnpm install | ||
env: | ||
CYPRESS_INSTALL_BINARY: 0 | ||
- run: pnpm build | ||
|
||
# Use cache to share the output across different jobs | ||
# No need to cache node_modules because they are all bundled | ||
- uses: actions/cache/save@v3 | ||
id: cache | ||
with: | ||
path: outfile.cjs | ||
key: ${{ github.sha }}-${{ hashFiles('pnpm-lock.yaml') }} | ||
|
||
test: | ||
runs-on: ${{ matrix.os }} | ||
continue-on-error: ${{ matrix.os == 'windows-latest' }} | ||
needs: build | ||
strategy: | ||
fail-fast: false | ||
matrix: | ||
os: | ||
- ubuntu-latest | ||
- macos-latest | ||
- windows-latest | ||
node-version: | ||
- 16 | ||
os: [ubuntu-latest] | ||
node-version: [18] | ||
flag-for-ts: ['--typescript', ''] | ||
flag-for-jsx: ['--jsx', ''] | ||
flag-for-router: ['--router', ''] | ||
flag-for-pinia: ['--pinia', ''] | ||
flag-for-vitest: ['--vitest', ''] | ||
|
||
# It's quite costly to install Cypress & Playwright even with cache. | ||
# Maybe we can split them into another job so that all the projects | ||
# can share the same binary installation. | ||
flag-for-e2e: ['--cypress', '--playwright', ''] | ||
|
||
# Skip ESLint/Prettier tests as we've reached the limit of job numbers | ||
# TODO: Find a way to test them without adding new jobs | ||
|
||
# Run a few tests on other systems and Node.js versions | ||
include: | ||
- node-version: 18 | ||
os: windows-latest | ||
flag-for-ts: '--typescript' | ||
flag-for-jsx: '--jsx' | ||
flag-for-router: '--router' | ||
flag-for-pinia: '--pinia' | ||
flag-for-vitest: '--vitest' | ||
flag-for-e2e: '--cypress' | ||
|
||
- node-version: 18 | ||
os: macos-latest | ||
flag-for-ts: '--typescript' | ||
flag-for-jsx: '--jsx' | ||
flag-for-router: '--router' | ||
flag-for-pinia: '--pinia' | ||
flag-for-vitest: '--vitest' | ||
flag-for-e2e: '--cypress' | ||
|
||
- node-version: 14 | ||
os: ubuntu-latest | ||
- node-version: 18 | ||
flag-for-ts: '--typescript' | ||
flag-for-jsx: '--jsx' | ||
flag-for-router: '--router' | ||
flag-for-pinia: '--pinia' | ||
flag-for-vitest: '--vitest' | ||
flag-for-e2e: '--cypress' | ||
|
||
- node-version: 16 | ||
os: ubuntu-latest | ||
name: Node ${{ matrix.node-version }} on ${{ matrix.os }} | ||
flag-for-ts: '--typescript' | ||
flag-for-jsx: '--jsx' | ||
flag-for-router: '--router' | ||
flag-for-pinia: '--pinia' | ||
flag-for-vitest: '--vitest' | ||
flag-for-e2e: '--cypress' | ||
runs-on: ${{ matrix.os }} | ||
continue-on-error: ${{ matrix.os == 'windows-latest' }} | ||
env: | ||
FEATURE_FLAGS: ${{ matrix.flag-for-ts }} ${{ matrix.flag-for-jsx }} ${{ matrix.flag-for-router }} ${{ matrix.flag-for-pinia }} ${{ matrix.flag-for-vitest }} ${{ matrix.flag-for-e2e }} | ||
steps: | ||
- uses: actions/checkout@v3 | ||
- uses: pnpm/action-setup@v2 | ||
with: | ||
submodules: 'recursive' | ||
- uses: pnpm/[email protected] | ||
with: | ||
version: 6 | ||
version: 7 | ||
- uses: actions/setup-node@v3 | ||
with: | ||
node-version: ${{ matrix.node-version }} | ||
cache: 'pnpm' | ||
- run: pnpm install | ||
- run: pnpm pretest | ||
- name: Install Playground Dependencies | ||
working-directory: ./playground | ||
run: pnpm install --no-frozen-lockfile | ||
- run: pnpm test | ||
- uses: actions/cache/restore@v3 | ||
id: cache-restore | ||
with: | ||
path: outfile.cjs | ||
key: ${{ github.sha }}-${{ hashFiles('pnpm-lock.yaml') }} | ||
- name: Build the package on cache miss | ||
if: steps.cache.outputs.cache-hit != 'true' | ||
run: pnpm install && pnpm build | ||
env: | ||
CYPRESS_INSTALL_BINARY: 0 | ||
|
||
- if: ${{ (contains(env.FEATURE_FLAGS, '--')) }} | ||
name: Create the sample project with feature flags | ||
run: node ./outfile.cjs sample-project ${{ env.FEATURE_FLAGS }} | ||
|
||
- if: ${{ !(contains(env.FEATURE_FLAGS, '--')) }} | ||
name: Create the sample project with default options | ||
run: node ./outfile.cjs sample-project --default | ||
|
||
- name: Move the sample project to the upper-level directory | ||
run: mv sample-project ../sample-project | ||
|
||
- name: Install dependencies in the sample project | ||
working-directory: ../sample-project | ||
run: pnpm install | ||
|
||
- if: ${{ contains(matrix.flag-for-vitest, '--') }} | ||
name: Run unit test script | ||
working-directory: ../sample-project | ||
run: pnpm test:unit | ||
|
||
- name: Run build script | ||
working-directory: ../sample-project | ||
run: pnpm build | ||
|
||
- if: ${{ contains(matrix.flag-for-e2e, '--playwright') }} | ||
name: Install Playwright dependencies | ||
working-directory: ../sample-project | ||
run: npx playwright install --with-deps | ||
|
||
- if: ${{ contains(matrix.flag-for-e2e, '--') }} | ||
name: Run e2e test script | ||
working-directory: ../sample-project | ||
run: pnpm test:e2e |