diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml deleted file mode 100644 index eefa5df5a..000000000 --- a/.github/workflows/build-and-test.yml +++ /dev/null @@ -1,123 +0,0 @@ -name: Build, test, test all examples - -on: - push: - branches: - - master - pull_request: - branches: - - master - workflow_dispatch: - -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: - build-and-test: - runs-on: ${{ matrix.os }} - defaults: - run: - shell: bash - strategy: - fail-fast: false - matrix: - node-version: [16, 18, 20, 22] - os: [macos-14, macos-13, ubuntu-latest, windows-latest] - docker: [false] - alpine: [false] - include: - - os: ubuntu-latest - docker: true - alpine: true - arch: amd64 - node-version: 22 - - os: ubuntu-latest - docker: true - alpine: true - arch: amd64 - node-version: 20 - - os: ubuntu-latest - docker: true - alpine: true - arch: amd64 - node-version: 18 - # ARM64 Builds under Qemu - - os: ubuntu-latest - docker: true - alpine: false - arch: arm64 - node-version: 22 - - os: ubuntu-latest - docker: true - alpine: true - arch: arm64 - node-version: 22 - - os: ubuntu-latest - docker: true - alpine: false - arch: arm64 - node-version: 20 - - os: ubuntu-latest - docker: true - alpine: true - arch: arm64 - node-version: 20 - - os: ubuntu-latest - docker: true - alpine: true - arch: arm64 - node-version: 18 - name: Test ${{ matrix.docker == true && matrix.alpine == true && 'linux-musl' || matrix.docker == true && matrix.alpine == false && 'linux' || matrix.os }}-${{ matrix.arch }}-node-${{ matrix.node-version }} - - steps: - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - with: - fetch-depth: 0 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4 - with: - node-version: ${{ matrix.node-version }} - - - run: scripts/ci/build-and-test.sh - if: ${{ matrix.docker != true }} - - - name: Set up QEMU - if: ${{ matrix.docker == true && matrix.arch == 'arm64' }} - uses: docker/setup-qemu-action@49b3bc8e6bdd4a60e6116a5414239cba5943d3cf # v3 - - - if: ${{ matrix.docker == true && matrix.alpine != true && matrix.arch == 'arm64' }} - name: test linux ${{ matrix.arch }} glibc - run: | - npm run docker:debian:build - npm run docker:debian:run - env: - DOCKER_DEFAULT_PLATFORM: linux/${{ matrix.arch }} - NODE_VERSION: ${{ matrix.node-version }} - GITHUB_ACTIONS: ${{ env.GITHUB_ACTIONS }} - SKIP_EXAMPLES: true - - - if: ${{ matrix.docker == true && matrix.alpine == true && matrix.arch == 'amd64' }} - name: test linux ${{ matrix.arch }} musl - run: | - npm run docker:alpine:build - npm run docker:alpine:run - env: - DOCKER_DEFAULT_PLATFORM: linux/${{ matrix.arch }} - NODE_VERSION: ${{ matrix.node-version }} - GITHUB_ACTIONS: ${{ env.GITHUB_ACTIONS }} - - - if: ${{ matrix.docker == true && matrix.alpine == true && matrix.arch == 'arm64' }} - name: test linux ${{ matrix.arch }} musl - run: | - npm run docker:alpine:build - npm run docker:alpine:run - env: - DOCKER_DEFAULT_PLATFORM: linux/${{ matrix.arch }} - NODE_VERSION: ${{ matrix.node-version }} - GITHUB_ACTIONS: ${{ env.GITHUB_ACTIONS }} - SKIP_EXAMPLES: true \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 000000000..d64df4133 --- /dev/null +++ b/.github/workflows/test.yml @@ -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 + + 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 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 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 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 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 }}