Skip to content

chore: support for Yarn 4 #15628

chore: support for Yarn 4

chore: support for Yarn 4 #15628

name: Test and Release
# Run this job on all pushes to master, for pull requests
# as well as tags with a semantic version
on:
push:
branches:
# This avoids having duplicate builds in non-forked PRs
- "master"
tags:
# normal versions
- "v[0-9]+.[0-9]+.[0-9]+"
# pre-releases
- "v[0-9]+.[0-9]+.[0-9]+-**"
pull_request: {}
merge_group:
types: [checks_requested]
# Cancel previous PR/branch runs when a new commit is pushed
concurrency:
group: 'test-and-release-${{ github.ref }}'
cancel-in-progress: true
env:
TURBO_API: "http://127.0.0.1:9080"
# The token and team are required by the TurboRepo server, just set them to anything
TURBO_TOKEN: foo
TURBO_TEAM: me
# Additional CLI flags for turbo commands
TURBO_FLAGS: "" # "--concurrency=2"
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18] # This should be LTS
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Prepare testing environment
uses: ./.github/actions/prepare-env
with:
node-version: ${{ matrix.node-version }}
githubToken: ${{ secrets.GITHUB_TOKEN }}
- name: Compile TypeScript code
run: |
# yarn clean $TURBO_FLAGS
yarn build $TURBO_FLAGS
- name: Save Turbo Cache between jobs
uses: ./.github/actions/build-cache-upload
# ===================
# Makes sure that the published packages can be require'd without issues in a production environment
test-packages:
needs: [build]
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18] # This should be LTS
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Restore Turbo Cache from previous jobs
uses: ./.github/actions/build-cache-download
- name: Prepare testing environment
uses: ./.github/actions/prepare-env
with:
node-version: ${{ matrix.node-version }}
githubToken: ${{ secrets.GITHUB_TOKEN }}
- name: Compile TypeScript code
run: yarn build $TURBO_FLAGS
# Test that the generated packages are ok
# I'd love to use yalc or something for this, but it doesn't use yarn pack to pack the tarballs
# so we need to fake the install
- name: Import main entry points for each package
run: |
TMP_DIR=$(mktemp -d)
echo "Re-creating a production environment..."
yarn monopack --target "$TMP_DIR/.tarballs" --no-version
cd $TMP_DIR
npm init -y
npm i .tarballs/zwave-js.tgz
echo "Testing entry points..."
# Now all entrypoints should work
node -e 'require("zwave-js")'
node -e 'require("@zwave-js/cc")'
node -e 'require("@zwave-js/config")'
node -e 'require("@zwave-js/core")'
node -e 'require("@zwave-js/host")'
node -e 'require("@zwave-js/nvmedit")'
node -e 'require("@zwave-js/serial")'
node -e 'require("@zwave-js/shared")'
node -e 'require("@zwave-js/testing")'
node -e 'require("zwave-js/safe")'
node -e 'require("@zwave-js/cc/safe")'
node -e 'require("@zwave-js/config/safe")'
node -e 'require("@zwave-js/core/safe")'
node -e 'require("@zwave-js/host/safe")'
node -e 'require("@zwave-js/nvmedit/safe")'
node -e 'require("@zwave-js/serial/safe")'
node -e 'require("@zwave-js/shared/safe")'
# ===================
lint:
needs: [build]
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18] # This should be LTS
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Restore Turbo Cache from previous jobs
uses: ./.github/actions/build-cache-download
- name: Prepare testing environment
uses: ./.github/actions/prepare-env
with:
node-version: ${{ matrix.node-version }}
githubToken: ${{ secrets.GITHUB_TOKEN }}
# For linting to succeed, we need to build the eslint plugin first.
# Thanks to caching from the previous job, this should be almost a no-op
- name: Compile TypeScript code
run: yarn build $TURBO_FLAGS
- name: Run linters
run: yarn run lint $TURBO_FLAGS
- name: Prepare lint auto-fix patch
if: |
failure() &&
github.event_name == 'pull_request'
id: lint
run: |
# Run all lint commands and abort if one has unfixable errors
yarn run lint:ts:fix $TURBO_FLAGS
yarn fmt $TURBO_FLAGS
git diff --name-only || true
if ! git diff --quiet ; then
echo "has changes"
git diff > fix.patch
echo "changed=true" >> $GITHUB_OUTPUT
else
echo "unchanged"
echo "changed=false" >> $GITHUB_OUTPUT
fi
- name: Upload Patch
if: |
failure() &&
github.event_name == 'pull_request' &&
steps.lint.outputs.changed == 'true'
uses: actions/upload-artifact@v4
with:
name: lint-fix
path: fix.patch
# ===================
lint-zwave:
needs: [build]
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18] # This should be LTS
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Restore Turbo Cache from previous jobs
uses: ./.github/actions/build-cache-download
- name: Prepare testing environment
uses: ./.github/actions/prepare-env
with:
node-version: ${{ matrix.node-version }}
githubToken: ${{ secrets.GITHUB_TOKEN }}
- name: Lint config files and Z-Wave specifics
run: yarn run lint:zwave $TURBO_FLAGS
# ===================
# Runs unit tests on all supported node versions and OSes
unit-tests:
needs: [build]
runs-on: ${{ matrix.os }}
strategy:
matrix:
node-version: [18, 20]
os: [ubuntu-latest]
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Restore Turbo Cache from previous jobs
uses: ./.github/actions/build-cache-download
- name: Prepare testing environment
uses: ./.github/actions/prepare-env
with:
node-version: ${{ matrix.node-version }}
githubToken: ${{ secrets.GITHUB_TOKEN }}
# For the partial tests to succeed, we need to build the packages first.
# Thanks to caching from the previous job, this should be almost a no-op
- name: Compile TypeScript code
run: yarn build $TURBO_FLAGS
# For pull requests, only run tests for changed files
- name: Run component tests (changes)
if: github.event_name == 'pull_request'
run: |
git fetch origin ${{ github.event.pull_request.base.ref }} --depth=1
yarn run test:dirty --resolve --base origin/${{ github.event.pull_request.base.ref }}
# For all other events, especially on master and releases, run the full test suite
# Run the full test suite on master, release branches and tags
- name: Run component tests (full)
if: github.event_name != 'pull_request'
run: yarn run test:ts $TURBO_FLAGS
# # ===================
# # This job checks if a PR changes the public API surface
# api-surface:
# name: Check public API surface
# # Only run for PRs
# if: github.event_name == 'pull_request'
# needs: [build]
# runs-on: ubuntu-latest
# strategy:
# matrix:
# node-version: [18] # This should be LTS
# steps:
# - name: Checkout code
# uses: actions/checkout@v4
# - name: Restore Turbo Cache from previous jobs
# uses: ./.github/actions/build-cache-download
# - name: Prepare testing environment
# uses: ./.github/actions/prepare-env
# with:
# node-version: ${{ matrix.node-version }}
# githubToken: ${{ secrets.GITHUB_TOKEN }}
# - name: Generate API report
# run: yarn run extract-api $TURBO_FLAGS
# - name: Show changes
# if: failure()
# run: |
# cat packages/*/.tmp/api.md
# - name: Comment on PR
# if: failure()
# run: |
# echo "The public API surface has changed!" >> $GITHUB_STEP_SUMMARY
# echo "Please run" >> $GITHUB_STEP_SUMMARY
# echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
# echo "yarn accept-api" >> $GITHUB_STEP_SUMMARY
# echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
# echo "and review the changes, then commit them if desired." >> $GITHUB_STEP_SUMMARY
# echo "" >> $GITHUB_STEP_SUMMARY
# ===================
gh-cc-table:
name: Update CC implementation status
# Only run for master branch and don't run in forks
if: |
github.repository == 'zwave-js/node-zwave-js' &&
github.ref == 'refs/heads/master' &&
github.event_name == 'push'
needs: [build]
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18] # This should be LTS
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Restore Turbo Cache from previous jobs
uses: ./.github/actions/build-cache-download
- name: Prepare testing environment
uses: ./.github/actions/prepare-env
with:
node-version: ${{ matrix.node-version }}
githubToken: ${{ secrets.GITHUB_TOKEN }}
- name: Compile TypeScript code
run: yarn build $TURBO_FLAGS
- name: Update CC table # (maybe)
uses: actions/github-script@v7
with:
github-token: ${{secrets.BOT_TOKEN}}
result-encoding: string
script: |
const main = require(`${process.env.GITHUB_WORKSPACE}/.github/action-scripts/updateCCImplementationOverview.js`);
return main({github, context});
# ===================
generate-overview:
name: Update toLogEntry overview
# Only run for master branch and don't run in forks
if: |
github.repository == 'zwave-js/node-zwave-js' &&
github.ref == 'refs/heads/master' &&
github.event_name == 'push'
needs: [build]
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18] # This should be LTS
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Restore Turbo Cache from previous jobs
uses: ./.github/actions/build-cache-download
- name: Prepare testing environment
uses: ./.github/actions/prepare-env
with:
node-version: ${{ matrix.node-version }}
githubToken: ${{ secrets.GITHUB_TOKEN }}
- name: Compile TypeScript code
run: yarn build $TURBO_FLAGS
- name: Update overview
uses: actions/github-script@v7
with:
github-token: ${{secrets.BOT_TOKEN}}
result-encoding: string
script: |
const main = require(`${process.env.GITHUB_WORKSPACE}/.github/action-scripts/updateToLogEntryOverview.js`);
return main({github, context});
# ===================
# Deploys the final package to NPM
deploy:
# Trigger this step only when a commit on any branch is tagged with a version number
if: |
github.actor == 'AlCalzone' &&
github.event_name == 'push' &&
startsWith(github.ref, 'refs/tags/v')
needs: [lint, lint-zwave, unit-tests, test-packages]
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18] # This should be LTS
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Restore Turbo Cache from previous jobs
uses: ./.github/actions/build-cache-download
- name: Prepare testing environment
uses: ./.github/actions/prepare-env
with:
node-version: ${{ matrix.node-version }}
githubToken: ${{ secrets.GITHUB_TOKEN }}
- name: Compile TypeScript code
run: yarn build $TURBO_FLAGS
- name: Extract the version and commit body from the tag
id: extract_release
# The body may be multiline, therefore we need to escape some characters
run: |
VERSION="${{ github.ref }}"
VERSION=${VERSION##*/v}
echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
EOF=$(od -An -N6 -x /dev/urandom | tr -d ' ')
BODY=$(git show -s --format=%b)
echo "BODY<<$EOF" >> $GITHUB_OUTPUT
echo "$BODY" >> $GITHUB_OUTPUT
echo "$EOF" >> $GITHUB_OUTPUT
if [[ $VERSION == *"-"* ]] ; then
echo "TAG=--tag next" >> $GITHUB_OUTPUT
fi
- name: Publish packages to npm
env:
TAG: ${{ steps.extract_release.outputs.TAG }}
run: |
yarn config set npmAuthToken "${{ secrets.NPM_TOKEN }}"
yarn npm whoami
yarn workspaces foreach -vti --no-private npm publish --tolerate-republish $TAG
- name: Create Github Release
uses: softprops/action-gh-release@v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ github.ref }}
name: Release v${{ steps.extract_release.outputs.VERSION }}
draft: false
# Prerelease versions create prereleases on Github
prerelease: ${{ contains(steps.extract_release.outputs.VERSION, '-') }}
body: ${{ steps.extract_release.outputs.BODY }}
# - name: Notify Sentry.io about the release
# run: |
# npm i -g @sentry/cli
# export SENTRY_AUTH_TOKEN=${{ secrets.SENTRY_AUTH_TOKEN }}
# export SENTRY_URL=https://sentry.iobroker.net
# export SENTRY_ORG=iobroker
# export SENTRY_PROJECT=zwave-js
# export SENTRY_VERSION=zwave-js@${{ steps.extract_release.outputs.VERSION }}
# sentry-cli releases new $SENTRY_VERSION
# # Commits disabled until the Github integration can be enabled
# sentry-cli releases set-commits $SENTRY_VERSION --auto
# sentry-cli releases files $SENTRY_VERSION upload-sourcemaps ./packages/*/build
# sentry-cli releases finalize $SENTRY_VERSION