Skip to content

Commit

Permalink
chore: rewrite test workflow
Browse files Browse the repository at this point in the history
The motivation for this is improve the speed at which the CI tasks
complete in the Pact-JS repository. This hopefully achieves this by
having more parallel builds which are each smaller and cached.

I have also reduced the reliance on the scripts as it appeared to me
that they duplicate a number of steps. These duplications are justified
when running locally to ensure all previous steps are run, but in CI it
likely results in longer runs thhan necessary.

Signed-off-by: JP-Ellis <[email protected]>
  • Loading branch information
JP-Ellis committed Dec 8, 2024
1 parent d7bd517 commit 58a0949
Show file tree
Hide file tree
Showing 2 changed files with 269 additions and 123 deletions.
123 changes: 0 additions & 123 deletions .github/workflows/build-and-test.yml

This file was deleted.

269 changes: 269 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,269 @@
name: Test

on:
push:
branches:
- master
pull_request:
branches:
- master
workflow_dispatch:

concurrency:
group: ${{ github.workflow }}-${{ github.ref || github.run_id }}
cancel-in-progress: true

env:
GIT_COMMIT: ${{ github.sha }}
GIT_REF: ${{ github.ref }}
GIT_BRANCH: ${{ github.head_ref || github.ref_name }}
LOG_LEVEL: info
PACT_BROKER_BASE_URL: ${{ secrets.PACT_BROKER_BASE_URL }}
PACT_BROKER_TOKEN: ${{ secrets.PACT_BROKER_TOKEN }}

jobs:
complete:
name: Test completion check
if: always()

permissions:
contents: none

runs-on: ubuntu-latest
needs:
- test-x86
- test-alpine
- test-arm64
- lint
- format
- examples

steps:
- name: Failed
run: exit 1
if: >
contains(needs.*.result, 'failure')
|| contains(needs.*.result, 'cancelled')
|| contains(needs.*.result, 'skipped')
lint:
name: Lint
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4

- name: Setup Node.JS
uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4
with:
cache: npm

- name: Install dependencies
run: npm ci

- name: Lint
run: npm run lint

format:
name: Format
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4

- name: Setup Node.JS
uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4
with:
cache: npm

- name: Install dependencies
run: npm ci

- name: Format
run: npm run format:check

test-x86:
name: >-
Test x86_64
on ${{ startsWith(matrix.os, 'macos-') && 'macOS' || startsWith(matrix.os, 'windows-') && 'Windows' || 'Linux' }}
with Node ${{ matrix.node-version }}
runs-on: ${{ matrix.os }}

strategy:
fail-fast: false
matrix:
node-version: [18, 20, 22]
os:
- macos-13
- macos-latest
- ubuntu-latest
- windows-latest

steps:
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4

- name: Setup Node.js ${{ matrix.node-version }}
uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4
with:
node-version: ${{ matrix.node-version }}
cache: npm

- name: Install dependencies
run: |
npm ci
npm run dist
- name: Run tests
run: npm test

- name: Coverage
if: startsWith(matrix.os, 'ubuntu-')
run: npm run coverage

- name: Codecov
if: startsWith(matrix.os, 'ubuntu-')
uses: codecov/codecov-action@v5

# On Ubuntu, we also package the `dist` folder to be re-used by the
# examples
- name: Re-use dict folder
if: startsWith(matrix.os, 'ubuntu-')
uses: actions/upload-artifact@v4
with:
name: dist
path: dist/


test-alpine:
name: >-
Test Alpine
on ${{ startsWith(matrix.os, 'macos-') && 'macOS' || startsWith(matrix.os, 'windows-') && 'Windows' || 'Linux' }}
with Node ${{ matrix.node-version }}
runs-on: ubuntu-latest
container:
image: node:${{ matrix.node-version }}-alpine

strategy:
fail-fast: false
matrix:
os: [ubuntu-latest]
node-version: [18, 20, 22]

steps:
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4

- name: Install dependencies
run: |
npm ci
npm run dist
- name: Run tests
run: npm test

test-arm64:
name: >-
Test ARM64
on ${{ startsWith(matrix.os, 'macos-') && 'macOS' || startsWith(matrix.os, 'windows-') && 'Windows' || 'Linux' }}
with Node ${{ matrix.node-version }}
runs-on: ${{ matrix.os }}

strategy:
fail-fast: false
matrix:
node-version: [18, 20, 22]
os:
- ubuntu-latest
- macos-latest

steps:
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4

- name: Set up QEMU
if: startsWith(matrix.os, 'ubuntu-')
uses: docker/setup-qemu-action@49b3bc8e6bdd4a60e6116a5414239cba5943d3cf # v3

- name: Setup Node.js ${{ matrix.node-version }}
if: startsWith(matrix.os, 'macos-')
uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4
with:
node-version: ${{ matrix.node-version }}
cache: npm

- name: Install dependencies
if: startsWith(matrix.os, 'macos-')
run: |
npm ci
npm run dist
- name: Test
if: startsWith(matrix.os, 'macos-')
run: |
npm test
- name: Install dependencies and test
if: startsWith(matrix.os, 'ubuntu-')
run: |
docker run \
--rm \
-v $(pwd):/${{ github.workspace }} \
-w /${{ github.workspace }} \
--platform linux/arm64 \
node:${{ matrix.node-version }}-alpine \
sh -c "npm ci && npm run dist && npm test"
examples:
name: >-
Test Examples
on ${{ startsWith(matrix.os, 'macos-') && 'macOS' || startsWith(matrix.os, 'windows-') && 'Windows' || 'Linux' }}
with Node ${{ matrix.node-version }}
runs-on: ${{ matrix.os }}
needs:
- test-x86

strategy:
fail-fast: false
matrix:
node-version: [22]
os: [ubuntu-latest]
d:
- e2e
- graphql
- jest
- messages
- mocha
- serverless
- typescript
- v3
- v4

steps:
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4

- name: Setup Node.js ${{ matrix.node-version }}
uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4
with:
node-version: ${{ matrix.node-version }}
cache: npm

- name: Download dist folder
uses: actions/download-artifact@v4
with:
name: dist

- name: Run tests
working-directory: examples/${{ matrix.d }}
run: |
jq '.dependencies["@pact-foundation/pact"] = "file:../../dist"' package.json > package.json.tmp
mv package.json.tmp package.json
npm install
npm run test:${{ matrix.d }}

0 comments on commit 58a0949

Please sign in to comment.