. #18
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
name: Test | |
# Many build steps have their own caches, so each job has its own cache to improve subsequent build times. | |
# Build tools are configured to cache to node_modules/.cache, so they are cached independently of node_modules. | |
# Caches are saved every run (by keying on github.run_id), and the most recent available cache is loaded. | |
# See https://jongleberry.medium.com/speed-up-your-ci-and-dx-with-node-modules-cache-ac8df82b7bb0. | |
on: | |
push: | |
branches: | |
- main | |
- releases/staging | |
pull_request: | |
workflow_dispatch: | |
jobs: | |
lint: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: ./.github/actions/setup | |
- uses: actions/cache@v3 | |
with: | |
path: node_modules/.cache | |
key: ${{ runner.os }}-eslint-${{ github.run_id }} | |
restore-keys: ${{ runner.os }}-eslint- | |
- run: yarn lint | |
- if: failure() && github.ref_name == 'main' | |
uses: ./.github/actions/report | |
with: | |
name: Lint | |
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_TEST_REPORTER_WEBHOOK }} | |
typecheck: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: ./.github/actions/setup | |
- uses: actions/cache@v3 | |
with: | |
path: node_modules/.cache | |
key: ${{ runner.os }}-tsc-${{ github.run_id }} | |
restore-keys: ${{ runner.os }}-tsc- | |
- run: yarn typecheck | |
- if: failure() && github.ref_name == 'main' | |
uses: ./.github/actions/report | |
with: | |
name: Typecheck | |
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_TEST_REPORTER_WEBHOOK }} | |
deps-tests: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: ./.github/actions/setup | |
- run: yarn yarn-deduplicate --strategy=highest --list --fail | |
- if: failure() && github.ref_name == 'main' | |
uses: ./.github/actions/report | |
with: | |
name: Dependency checks | |
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_TEST_REPORTER_WEBHOOK }} | |
unit-tests: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: ./.github/actions/setup | |
- uses: actions/cache@v3 | |
with: | |
path: node_modules/.cache | |
key: ${{ runner.os }}-jest-${{ github.run_id }} | |
restore-keys: ${{ runner.os }}-jest- | |
- run: yarn test --coverage --maxWorkers=100% | |
- uses: codecov/codecov-action@v3 | |
with: | |
token: ${{ secrets.CODECOV_TOKEN }} | |
fail_ci_if_error: false | |
flags: unit-tests | |
- if: failure() && github.ref_name == 'main' | |
uses: ./.github/actions/report | |
with: | |
name: Unit tests | |
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_TEST_REPORTER_WEBHOOK }} | |
build: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: ./.github/actions/setup | |
- uses: actions/cache@v3 | |
with: | |
path: node_modules/.swc | |
key: ${{ runner.os }}-swc-${{ github.run_id }} | |
restore-keys: ${{ runner.os }}-swc- | |
- run: yarn build | |
- uses: actions/upload-artifact@v3 | |
with: | |
name: build | |
path: build | |
if-no-files-found: error | |
cypress-typecheck: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: ./.github/actions/setup | |
- uses: actions/cache@v3 | |
with: | |
path: node_modules/.cache | |
key: ${{ runner.os }}-cypress-tsc-${{ github.run_id }} | |
restore-keys: ${{ runner.os }}-cypress-tsc- | |
- run: yarn typecheck:cypress | |
- if: failure() && github.ref_name == 'main' | |
uses: ./.github/actions/report | |
with: | |
name: Cypress typecheck | |
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_TEST_REPORTER_WEBHOOK }} | |
# Allows for parallel re-runs of cypress tests without re-building. | |
cypress-rerun: | |
runs-on: ubuntu-latest | |
steps: | |
- run: exit 0 | |
cypress-test-matrix: | |
needs: [build, cypress-rerun] | |
runs-on: ubuntu-latest | |
strategy: | |
fail-fast: false | |
matrix: | |
containers: [1, 2, 3, 4] | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: ./.github/actions/setup | |
- uses: actions/cache@v3 | |
with: | |
path: /root/.cache/Cypress | |
key: ${{ runner.os }}-cypress-${{ hashFiles('**/node_modules/cypress/package.json') }} | |
- run: | | |
yarn cypress install | |
yarn cypress info | |
- uses: actions/download-artifact@v3 | |
with: | |
name: build | |
path: build | |
- uses: actions/cache/restore@v3 | |
with: | |
path: cache | |
key: ${{ runner.os }}-hardhat-${{ hashFiles('hardhat.config.js') }}-${{ github.run_id }} | |
restore-keys: ${{ runner.os }}-hardhat-${{ hashFiles('hardhat.config.js') }}- | |
- uses: cypress-io/github-action@v4 | |
with: | |
install: false | |
record: true | |
parallel: true | |
start: yarn serve | |
wait-on: 'http://localhost:3000' | |
browser: electron | |
group: e2e | |
spec: ${{ github.ref_name == 'releases/staging' && 'cypress/{e2e,staging}/**/*.test.ts' || 'cypress/e2e/**/*.test.ts' }} | |
env: | |
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }} | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
COMMIT_INFO_BRANCH: ${{ github.event.pull_request.head.ref || github.ref_name }} | |
COMMIT_INFO_MESSAGE: ${{ github.event.pull_request.title || github.event.head_commit.message }} | |
COMMIT_INFO_AUTHOR: ${{ github.event.sender.login || github.event.head_commit.author.login }} | |
# Cypress requires an email for filtering by author, but GitHub does not expose one. | |
# GitHub's public profile email can be deterministically produced from user id/login. | |
COMMIT_INFO_EMAIL: ${{ github.event.sender.id || github.event.head_commit.author.id }}+${{ github.event.sender.login || github.event.head_commit.author.login }}@users.noreply.github.com | |
COMMIT_INFO_SHA: ${{ github.event.pull_request.head.sha || github.event.head_commit.sha }} | |
COMMIT_INFO_TIMESTAMP: ${{ github.event.pull_request.updated_at || github.event.head_commit.timestamp }} | |
CYPRESS_PULL_REQUEST_ID: ${{ github.event.pull_request.number }} | |
CYPRESS_PULL_REQUEST_URL: ${{ github.event.pull_request.html_url }} | |
- if: failure() && github.ref_name == 'main' | |
uses: ./.github/actions/report | |
with: | |
name: Cypress tests | |
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_TEST_REPORTER_WEBHOOK }} | |
- uses: actions/upload-artifact@v3 | |
with: | |
name: hardhat-cache | |
path: cache | |
hardhat-cache: | |
needs: [cypress-test-matrix] | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/download-artifact@v3 | |
with: | |
name: hardhat-cache | |
path: cache | |
- uses: actions/cache/save@v3 | |
with: | |
path: cache | |
key: ${{ runner.os }}-hardhat-${{ hashFiles('hardhat.config.js') }}-${{ github.run_id }} | |
cloud-typecheck: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: ./.github/actions/setup | |
- uses: actions/cache@v3 | |
with: | |
path: node_modules/.cache | |
key: ${{ runner.os }}-cloud-tsc-${{ github.run_id }} | |
restore-keys: ${{ runner.os }}-cloud-tsc- | |
- run: yarn typecheck:cloud | |
- if: failure() && github.ref_name == 'main' | |
uses: ./.github/actions/report | |
with: | |
name: Cloud typecheck | |
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_TEST_REPORTER_WEBHOOK }} | |
cloud-tests: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: ./.github/actions/setup | |
- uses: actions/cache@v3 | |
with: | |
path: node_modules/.cache | |
key: ${{ runner.os }}-cloud-jest-${{ github.run_id }} | |
restore-keys: ${{ runner.os }}-cloud-jest- | |
# Ignore start:cloud output so it doesn't flood the test output. | |
# Only use 1 worker for testing, as the other is used to run start:cloud (the proxy server under test). | |
- run: yarn start-server-and-test 'yarn start:cloud >/dev/null' 3000 'yarn test:cloud --coverage --maxWorkers=1' | |
- uses: codecov/codecov-action@v3 | |
with: | |
token: ${{ secrets.CODECOV_TOKEN }} | |
fail_ci_if_error: false | |
flags: cloud-tests | |
pre: | |
if: ${{ github.ref_name == 'main' || github.ref_name == 'releases/staging' }} | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/[email protected] | |
with: | |
script: | | |
github.rest.repos.createCommitStatus({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
sha: context.sha, | |
state: 'pending', | |
context: 'Test / promotion', | |
description: 'Running tests...', | |
target_url: 'https://github.com/Uniswap/interface/actions/runs/' + context.runId | |
}) | |
post: | |
if: ${{ github.ref_name == 'main' || github.ref_name == 'releases/staging' }} | |
needs: [pre, lint, typecheck, deps-tests, unit-tests, cypress-test-matrix, cloud-tests] | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/[email protected] | |
with: | |
script: | | |
github.rest.repos.createCommitStatus({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
sha: context.sha, | |
state: ${{ env.STATUS }} ? 'success' : 'failure', | |
context: 'Test / promotion', | |
description: ${{ env.STATUS }} ? 'All tests passed' : 'One or more tests failed and are blocking promotion', | |
target_url: 'https://github.com/Uniswap/interface/actions/runs/' + context.runId | |
}) | |
env: | |
STATUS: | | |
${{ needs.lint.result == 'success' }} && | |
${{ needs.typecheck.result == 'success' }} && | |
${{ needs.deps-tests.result == 'success' }} && | |
${{ needs.unit-tests.result == 'success' }} && | |
${{ needs.cypress-test-matrix.result == 'success' }} && | |
${{ needs.cloud-tests.result == 'success' }} |