ci: add MSYS2 and Cygwin tests, refactor GitHub Actions #208
Workflow file for this run
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 & Release | |
on: | |
push: | |
branches: | |
- master | |
# Do not run on tags | |
tags-ignore: | |
- '*' | |
pull_request: | |
permissions: | |
contents: read | |
jobs: | |
install: | |
uses: ./.github/workflows/install.yml | |
changesets: | |
# Changesets no longer exist when releasing | |
if: github.event_name == 'pull_request' && !startsWith(github.event.pull_request.title, 'π¦ Changeset release') | |
needs: | |
- install | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- uses: actions/setup-node@v4 | |
with: | |
node-version: 20 | |
- uses: actions/cache@v4 | |
id: cache-node_modules | |
with: | |
path: node_modules | |
key: ubuntu-latest-20-${{ hashFiles('**/package-lock.json') }} | |
restore-keys: | | |
ubuntu-latest-20-${{ hashFiles('**/package-lock.json') }} | |
- run: npx changeset status --since=${{ github.event.pull_request.base.sha }} | |
commitlint: | |
if: github.event_name == 'pull_request' | |
needs: | |
- install | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- uses: actions/setup-node@v4 | |
with: | |
node-version: 20 | |
- uses: actions/cache@v4 | |
id: cache-node_modules | |
with: | |
path: node_modules | |
key: ubuntu-latest-20-${{ hashFiles('**/package-lock.json') }} | |
restore-keys: | | |
ubuntu-latest-20-${{ hashFiles('**/package-lock.json') }} | |
- run: npx commitlint --from ${{ github.event.pull_request.base.sha }} --to ${{ github.event.pull_request.head.sha }} --verbose | |
lint: | |
name: ESLint | |
needs: | |
- install | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-node@v4 | |
with: | |
node-version: 20 | |
- uses: actions/cache@v4 | |
id: cache-node_modules | |
with: | |
path: node_modules | |
key: ubuntu-latest-20-${{ hashFiles('**/package-lock.json') }} | |
restore-keys: | | |
ubuntu-latest-20-${{ hashFiles('**/package-lock.json') }} | |
- run: npm run lint | |
test-node-range: | |
name: Test Node.js version range | |
needs: | |
- install | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-node@v4 | |
with: | |
node-version: 20 | |
- uses: actions/cache@v4 | |
id: cache-node_modules | |
with: | |
path: node_modules | |
key: ubuntu-latest-20-${{ hashFiles('**/package-lock.json') }} | |
restore-keys: | | |
ubuntu-latest-20-${{ hashFiles('**/package-lock.json') }} | |
- run: node ./scripts/test-node-range.js | |
test-matrix: | |
needs: | |
- install | |
strategy: | |
matrix: | |
# Test with Node.js active LTS versions, and the latest version | |
node: | |
- 18 | |
- 20 | |
- 21 | |
- 22 | |
# Test with Ubuntu, macOS, and Windows | |
os: | |
- ubuntu-latest | |
- macos-14 # macOS Sonoma M1 runners | |
- windows-latest | |
name: Node.js v${{ matrix.node }} on ${{ matrix.os }} | |
runs-on: ${{ matrix.os }} | |
steps: | |
- if: matrix.os == 'windows-latest' | |
run: git config --global core.autocrlf true | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-node@v4 | |
with: | |
node-version: ${{ matrix.node }} | |
- uses: actions/cache@v4 | |
id: cache-node_modules | |
with: | |
path: node_modules | |
key: ${{ matrix.os }}-${{ matrix.node }}-${{ hashFiles('**/package-lock.json') }} | |
restore-keys: | | |
${{ matrix.os }}-${{ matrix.node }}-${{ hashFiles('**/package-lock.json') }} | |
# Only cached for ubuntu-latest | |
- if: steps.cache-node_modules.outputs.cache-hit != 'true' | |
run: npm ci | |
# Print current Node.js version | |
- run: node --version | |
# Print current npm version | |
- run: npm --version | |
# Print current Git version | |
- run: git --version | |
# Print lint-staged version | |
- run: node bin/lint-staged.js --version | |
# Print lint-staged help text | |
- run: node bin/lint-staged.js --help | |
# Run tests | |
- run: npm test | |
- uses: actions/upload-artifact@v3 | |
if: matrix.os == 'ubuntu-latest' && matrix.node == '20' | |
with: | |
name: coverage | |
path: coverage | |
test-msys2: | |
needs: | |
- install | |
name: Node.js v20 on windows-latest (MSYS2) | |
runs-on: windows-latest | |
defaults: | |
run: | |
shell: msys2 {0} | |
steps: | |
- uses: msys2/setup-msys2@v2 | |
with: | |
msystem: UCRT64 | |
path-type: inherit | |
- run: git config --global core.autocrlf true | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-node@v4 | |
with: | |
node-version: ${{ matrix.node }} | |
- uses: actions/cache@v4 | |
id: cache-node_modules | |
with: | |
path: node_modules | |
key: windows-latest-20-msys2-${{ hashFiles('**/package-lock.json') }} | |
restore-keys: | | |
windows-latest-20-msys2-${{ hashFiles('**/package-lock.json') }} | |
# Only cached for ubuntu-latest | |
- if: steps.cache-node_modules.outputs.cache-hit != 'true' | |
run: npm ci | |
- run: node --version | |
- run: npm --version | |
- run: git --version | |
- run: node bin/lint-staged.js --version | |
- run: node bin/lint-staged.js --help | |
- run: npm test | |
test-cygwin: | |
needs: | |
- install | |
name: Node.js v20 on windows-latest (Cygwin) | |
runs-on: windows-latest | |
steps: | |
- uses: cygwin/cygwin-install-action@v4 | |
- run: git config --global core.autocrlf true | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-node@v4 | |
with: | |
node-version: ${{ matrix.node }} | |
- uses: actions/cache@v4 | |
id: cache-node_modules | |
with: | |
path: node_modules | |
key: windows-latest-20-msys2-${{ hashFiles('**/package-lock.json') }} | |
restore-keys: | | |
windows-latest-20-msys2-${{ hashFiles('**/package-lock.json') }} | |
# Only cached for ubuntu-latest | |
- if: steps.cache-node_modules.outputs.cache-hit != 'true' | |
run: npm ci | |
- run: node --version | |
- run: npm --version | |
- run: git --version | |
- run: node bin/lint-staged.js --version | |
- run: node bin/lint-staged.js --help | |
- run: npm test | |
codecov: | |
name: Codecov | |
runs-on: ubuntu-latest | |
needs: | |
- test-matrix | |
steps: | |
- uses: actions/checkout@v4 | |
# Download coverage artifact | |
- uses: actions/download-artifact@v3 | |
with: | |
name: coverage | |
# Run codecov.io | |
- uses: codecov/codecov-action@v3 | |
release: | |
permissions: | |
contents: write | |
issues: read | |
packages: write | |
pull-requests: write | |
id-token: write | |
name: Release | |
runs-on: ubuntu-latest | |
needs: | |
- changesets | |
- codecov | |
- commitlint | |
- lint | |
- test-cygwin | |
- test-matrix | |
- test-msys2 | |
- test-node-range | |
# Trigger release for only pushes to branches defined above | |
if: github.event_name == 'push' && github.ref == 'refs/heads/master' | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
# This is a PAT token that allows triggering of new Actions when π¦ Changeset pushes a git tag | |
token: ${{ secrets.CHANGESET_RELEASE_TOKEN }} | |
- uses: actions/setup-node@v4 | |
with: | |
node-version: 20 | |
- uses: actions/cache@v4 | |
id: cache-node_modules | |
with: | |
path: node_modules | |
key: ubuntu-latest-20-${{ hashFiles('**/package-lock.json') }} | |
restore-keys: | | |
ubuntu-latest-20-${{ hashFiles('**/package-lock.json') }} | |
- if: steps.cache-node_modules.outputs.cache-hit != 'true' | |
run: npm ci | |
- name: Create Release Pull Request | |
uses: changesets/action@v1 | |
with: | |
title: 'π¦ Changeset release' | |
version: npm run version | |
publish: npm run tag | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
HUSKY: '0' # disabled because pre-push hook checks for changesets which have now been removed |