Skip to content

Merge pull request #5523 from alphagov/upgrade-libsass-test #12892

Merge pull request #5523 from alphagov/upgrade-libsass-test

Merge pull request #5523 from alphagov/upgrade-libsass-test #12892

Workflow file for this run

name: Tests
on:
pull_request:
push:
branches:
- main
- 'feature/**'
- 'support/**'
workflow_dispatch:
inputs:
types:
description: Check type declarations
type: boolean
concurrency:
group: tests-${{ inputs.runner || 'ubuntu-latest' }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
install:
name: Install
runs-on: ${{ matrix.runner }}
env:
PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: true
strategy:
fail-fast: false
matrix:
runner:
- ubuntu-latest
- windows-latest
steps:
- name: Checkout code
uses: actions/[email protected]
- name: Install dependencies
uses: ./.github/workflows/actions/install-node
build:
name: Build
runs-on: ${{ matrix.runner }}
needs: [install]
strategy:
fail-fast: false
matrix:
runner:
- ubuntu-latest
- windows-latest
steps:
- name: Checkout
uses: actions/[email protected]
- name: Restore dependencies
uses: ./.github/workflows/actions/install-node
- name: Build
uses: ./.github/workflows/actions/build
- name: Type declarations (optional)
if: github.event.inputs.types == 'true'
run: npm run build:types
lint:
name: ${{ matrix.task.description }} (${{ matrix.runner }})
runs-on: ${{ matrix.runner }}
needs: [install]
strategy:
fail-fast: false
matrix:
runner:
- ubuntu-latest
- windows-latest
task:
- description: Lint Sass
name: lint-scss
run: npm run lint:scss
cache: .cache/stylelint
- description: Lint JavaScript
name: lint-js
run: npm run lint:js
cache: .cache/eslint
- description: EditorConfig
name: lint-editorconfig
run: npm run lint:editorconfig
- description: Prettier
name: lint-prettier
run: npm run lint:prettier
cache: .cache/prettier
steps:
- name: Checkout
uses: actions/[email protected]
- name: Restore dependencies
uses: ./.github/workflows/actions/install-node
- name: Cache linter
if: ${{ matrix.task.cache }}
uses: actions/[email protected]
with:
enableCrossOsArchive: true
key: ${{ matrix.task.name }}-${{ runner.os }}
path: ${{ matrix.task.cache }}
- name: Run lint task
run: ${{ matrix.task.run }}
test:
name: ${{ matrix.task.description }} (${{ matrix.runner }})
runs-on: ${{ matrix.runner }}
needs: [install, build]
env:
# Use 2x CPU cores unless on Windows (runs slower when concurrent)
# https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources
MAX_WORKERS: ${{ matrix.runner == 'windows-latest' && '1' || '2' }}
strategy:
fail-fast: false
matrix:
runner:
- ubuntu-latest
- windows-latest
task:
- description: Nunjucks macro tests
name: test-macro
cache: .cache/jest
projects:
- Nunjucks macro tests
- description: JavaScript unit tests
name: test-unit
cache: .cache/jest
projects:
- JavaScript unit tests
- description: JavaScript behaviour tests
name: test-behaviour
cache: .cache/jest
projects:
- JavaScript behaviour tests
- description: JavaScript component tests
name: test-component
cache: |
.cache/jest
.cache/puppeteer
projects:
- JavaScript component tests
- description: Accessibility tests
name: test-accessibility
cache: |
.cache/jest
.cache/puppeteer
projects:
- Accessibility tests
steps:
- name: Checkout
uses: actions/[email protected]
- name: Restore dependencies
uses: ./.github/workflows/actions/install-node
- name: Restore build
uses: ./.github/workflows/actions/build
- name: Cache task
if: ${{ matrix.task.cache }}
uses: actions/[email protected]
with:
enableCrossOsArchive: true
key: ${{ matrix.task.name }}-${{ runner.os }}
path: ${{ matrix.task.cache }}
- name: Run test task
run: npx jest --color ${{ format('--maxWorkers={0} --selectProjects "{1}"', env.MAX_WORKERS, join(matrix.task.projects, '", "')) }}
- name: Save test coverage
uses: actions/[email protected]
with:
name: ${{ matrix.task.description }} coverage (${{ matrix.runner }})
path: coverage
if-no-files-found: ignore
verify:
name: ${{ matrix.task.description }} (${{ matrix.runner }})
runs-on: ${{ matrix.runner }}
needs: [install, build]
# Skip when scheduled or run manually
if: ${{ !inputs.runner }}
strategy:
fail-fast: false
matrix:
runner:
- ubuntu-latest
- windows-latest
task:
- description: Verify package build
name: test-build-package
run: npm run build:package
- description: Verify distribution build
name: test-build-dist
run: npm run build:dist
steps:
- name: Checkout
uses: actions/[email protected]
- name: Restore dependencies
uses: ./.github/workflows/actions/install-node
- name: Restore build
uses: ./.github/workflows/actions/build
- name: Run verify task
run: ${{ matrix.task.run }}
package:
name: Export ${{ matrix.conditions }}, Node.js ${{ matrix.node-version }}
runs-on: ubuntu-latest
needs: [install, build]
strategy:
fail-fast: false
matrix:
node-version:
- 12.18 # Node.js 12.18 uses package exports with trailing slashes
- 12 # But Node.js 12.20+ uses package exports with subpath patterns
- 18
conditions:
- require
- import
exclude:
- conditions: import
node-version: 12.18
steps:
- name: Checkout
uses: actions/[email protected]
- name: Restore dependencies
uses: ./.github/workflows/actions/install-node
- name: Change Node.js version
uses: actions/[email protected]
with:
node-version: ${{ matrix.node-version }}
- name: Export ${{ matrix.conditions }}, Node.js ${{ matrix.node-version }}
env:
# Node.js conditions override from "require" to "import" etc
# https://nodejs.org/api/cli.html#-c-condition---conditionscondition
FLAGS: ${{ matrix.conditions != 'require' && format(' --conditions {0}', matrix.conditions) || '' }}
run: |
node --eval "console.log(require.resolve('govuk-frontend'))"${{ env.FLAGS }}
node --eval "console.log(require.resolve('govuk-frontend/package.json'))"${{ env.FLAGS }}
node --eval "console.log(require.resolve('govuk-frontend/govuk/i18n.js'))"${{ env.FLAGS }}
node --eval "console.log(require.resolve('govuk-frontend/govuk-esm/i18n.mjs'))"${{ env.FLAGS }}
regression:
name: Percy
needs: [install, build]
# Skip when scheduled or run manually
if: ${{ !inputs.runner }}
# Run existing "Percy screenshots" workflow
# (after install and build have been cached)
uses: ./.github/workflows/screenshots.yml
secrets: inherit