Skip to content

Merge pull request #5926 from NomicFoundation/fix-node-test-runner-ts… #1526

Merge pull request #5926 from NomicFoundation/fix-node-test-runner-ts…

Merge pull request #5926 from NomicFoundation/fix-node-test-runner-ts… #1526

Workflow file for this run

name: vNext CI
on:
merge_group:
push:
branches:
- v-next
pull_request:
workflow_dispatch:
concurrency:
group: ${{github.workflow}}-${{github.ref}}
cancel-in-progress: true
jobs:
is-v-next:
runs-on: ubuntu-latest
outputs:
is_v_next: ${{ steps.check.outputs.folder_exists }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Check if the folder v-next exists
id: check
run: |
if [ -d "./v-next" ]; then
echo "folder_exists=true" >> $GITHUB_OUTPUT
else
echo "folder_exists=false" >> $GITHUB_OUTPUT
fi
check_dependencies:
name: Check dependency versions
needs: is-v-next
if: ${{ needs.is-v-next.outputs.is_v_next == 'true' }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- name: Run check
run: node scripts/check-v-next-dependencies.js
check_npm_scripts:
name: Check that the npm scripts are consistent
needs: is-v-next
if: ${{ needs.is-v-next.outputs.is_v_next == 'true' }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- name: Run check
run: node scripts/check-v-next-npm-scripts.js
list-packages:
name: List packages
needs: is-v-next
if: ${{ needs.is-v-next.outputs.is_v_next == 'true' }}
runs-on: ubuntu-latest
outputs:
packages: ${{ steps.filter.outputs.changes }}
files: ${{ toJSON(steps.filter.outputs) }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- run: yq -p yaml -o json pnpm-lock.yaml | tee pnpm-lock.json
- id: generate
env:
PACKAGE_IGNORE: |
[
".",
"packages/",
"v-next/example-project",
"v-next/hardhat/templates/"
]
COMMON_FILTERS: |
[
".github/workflows/v-next-ci.yml",
"config-v-next/**",
"pnpm-lock.yaml"
]
run: |
echo "filters<<EOF" >> $GITHUB_OUTPUT
node scripts/generate-filters.js |
yq -Po yaml 'with_entries(.key |= sub("^v-next/", ""))' |
tee -a $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- id: filter
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
with:
list-files: json
filters: ${{ steps.generate.outputs.filters }}
bundle:
# Depending on list-packages only to check whether pnpm-lock.yaml has changed
# This could be handled by a simpler job, but an extra runner would have to be allocated for it
needs: list-packages
if: |
contains(fromJSON(needs.list-packages.outputs.files).hardhat_files, '.github/workflows/v-next-ci.yml') ||
contains(fromJSON(needs.list-packages.outputs.files).hardhat_files, 'pnpm-lock.yaml')
# Using a matrix strategy even though there's only one package
# because we will want to add, at least, hardhat-toolbox in the future
strategy:
fail-fast: false
matrix:
package: ["hardhat"]
name: "[${{ matrix.package }}] bundle"
runs-on: ubuntu-latest
defaults:
run:
working-directory: v-next/${{ matrix.package }}
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup-env
with:
node-version: 22
- name: Install dependencies
run: pnpm install --frozen-lockfile --prefer-offline
- name: Build
run: pnpm build
# https://github.com/pnpm/pnpm/issues/6166
- name: Deploy
run: |
pnpm deploy --config.shamefully-hoist=true --config.hoist=true --config.node-linker=true --config.shared-workspace-lockfile=false --filter="$(jq -r .name package.json)" --prod --no-optional bundle
# We need to move the node_modules links from v-next/hardhat/bundle to bundle because
# https://github.com/pnpm/pnpm/pull/8465 broke modules generation with the set of options we provide
for old_link in $(find v-next/hardhat/bundle -type l); do
echo "Processing link $old_link"
new_link="${old_link#v-next/hardhat/}"
new_link_dir="$(dirname "$new_link")"
old_link_target="$(readlink -f "$old_link")"
mkdir -p "$new_link_dir"
ln -rs "$old_link_target" "$new_link"
new_link_target="$(readlink "$new_link")"
echo "Created link $new_link -> $new_link_target"
done
rm -rf v-next
- uses: actions/upload-artifact@v4
with:
name: ${{ matrix.package }}
path: |
v-next/${{ matrix.package }}/bundle
bundle-aggregate:
needs: bundle
if: ${{ !cancelled() }}
name: bundle
runs-on: ubuntu-latest
permissions:
pull-requests: write
steps:
- env:
result: ${{ needs.bundle.result }}
run: |
if [[ "$result" == "failure" ]]; then
exit 1
fi
shell: bash
- uses: actions/download-artifact@v4
- id: download
run: ls -1 | wc -l | xargs -I {} -0 echo "count={}" | tee -a $GITHUB_OUTPUT
shell: bash
- id: comment
if: steps.download.outputs.count != '0'
run: |
echo 'body<<EOF' >> $GITHUB_OUTPUT
for bundle in *; do
echo "# $bundle" | tee -a $GITHUB_OUTPUT
echo '' | tee -a $GITHUB_OUTPUT
echo "Total size of the bundle: "'`'"$(du -sh $bundle --exclude=$bundle/node_modules/.pnpm | cut -f1)"'`' | tee -a $GITHUB_OUTPUT
echo "Total number of dependencies (including transitive): "'`'"$(find $bundle/node_modules/@* $bundle/node_modules -mindepth 1 -maxdepth 1 -type d ! -name '.*' ! -name '@*' | wc -l)"'`' | tee -a $GITHUB_OUTPUT
echo '' | tee -a $GITHUB_OUTPUT
echo '<details>' | tee -a $GITHUB_OUTPUT
echo '<summary>List of dependencies (sorted by size)</summary>' | tee -a $GITHUB_OUTPUT
echo '' | tee -a $GITHUB_OUTPUT
echo '```' | tee -a $GITHUB_OUTPUT
du -shc $bundle/node_modules/@*/* $bundle/node_modules/* |
grep -Ev '/node_modules/@[^/]+$' | sort -rh |
sed "s|$bundle/node_modules/||" | tee -a $GITHUB_OUTPUT
echo '```' | tee -a $GITHUB_OUTPUT
echo '</details>' | tee -a $GITHUB_OUTPUT
echo '' | tee -a $GITHUB_OUTPUT
done
echo 'EOF' >> $GITHUB_OUTPUT
- if: github.event_name == 'pull_request' && steps.download.outputs.count != '0'
uses: marocchino/sticky-pull-request-comment@331f8f5b4215f0445d3c07b4967662a32a2d3e31 # v2.9.0
with:
header: bundle
message: ${{ steps.comment.outputs.body }}
lint:
needs: list-packages
if: needs.list-packages.outputs.packages != '[]'
strategy:
fail-fast: false
matrix:
package: ${{ fromJson(needs.list-packages.outputs.packages) }}
name: "[${{ matrix.package }}] lint"
runs-on: ubuntu-latest
defaults:
run:
working-directory: v-next/${{ matrix.package }}
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup-env
with:
node-version: 22
- name: Install dependencies
run: pnpm install --frozen-lockfile --prefer-offline
- name: Build
run: pnpm build
- name: Lint
run: pnpm lint
lint-aggregate:
needs: lint
if: ${{ !cancelled() }}
name: lint
runs-on: ubuntu-latest
steps:
- env:
result: ${{ needs.lint.result }}
run: |
if [[ "$result" == "failure" ]]; then
exit 1
fi
shell: bash
ci:
needs: list-packages
if: needs.list-packages.outputs.packages != '[]'
strategy:
fail-fast: false
matrix:
package: ${{ fromJson(needs.list-packages.outputs.packages) }}
os: [ubuntu-latest, macos-13, macos-latest, windows-latest]
node: [22]
name: "[${{ matrix.package }}] ci on ${{ matrix.os }} (Node ${{ matrix.node }})"
runs-on: ${{ matrix.os }}
defaults:
run:
working-directory: v-next/${{ matrix.package }}
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup-env
with:
node-version: ${{ matrix.node }}
- name: Install dependencies
run: pnpm install --frozen-lockfile --prefer-offline
- name: Build
run: pnpm build
- name: Run tests
env:
__DO_NOT_USE_IS_HARDHAT_CI: true
run: pnpm run test
ci-aggregate:
needs: ci
if: ${{ !cancelled() }}
name: ci
runs-on: ubuntu-latest
steps:
- env:
result: ${{ needs.ci.result }}
run: |
if [[ "$result" == "failure" ]]; then
exit 1
fi
shell: bash