Skip to content

ci: speed up the CI by running tests concurrently #233

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
Feb 24, 2023
146 changes: 125 additions & 21 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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