Merge pull request #5926 from NomicFoundation/fix-node-test-runner-ts… #1526
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: 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 |