1919 - README.md
2020 - .github/**
2121 - ' !.github/workflows/test-shared.yml'
22+ workflow_dispatch :
23+ inputs :
24+ repo :
25+ type : string
26+ description : ' GitHub repository to fetch from (default to the current repo)'
27+ pr_id :
28+ type : number
29+ required : true
30+ description : ' The PR to test'
31+ commit :
32+ required : true
33+ type : string
34+ description : ' The expect HEAD of the PR'
35+ category :
36+ required : true
37+ type : string
38+ description : The category (or categories) of tests to run, for example buffers, cluster etc. Maps to a folders in node/benchmark
39+ filter :
40+ type : string
41+ description : A substring to restrict the benchmarks to run in a category. e.g. `net-c2c`
42+ runs :
43+ type : number
44+ default : 30
45+ description : How many times to repeat each benchmark
2246
2347concurrency :
2448 group : ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
5074 runs-on : ${{ matrix.runner }}
5175 steps :
5276 - uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
77+ if : ${{ github.event_name != 'workflow_dispatch' }}
78+
79+ - uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
80+ if : ${{ github.event_name == 'workflow_dispatch' }}
81+ with :
82+ repository : ${{ inputs.repo || github.repository }}
83+ ref : refs/pull/${{ inputs.pr_id }}/merge
84+ fetch-depth : 2
85+
86+ - name : Validate PR head and roll back to base commit
87+ if : ${{ github.event_name == 'workflow_dispatch' }}
88+ run : |
89+ [ "$(git rev-parse HEAD^2)" = "$EXPECTED_SHA" ]
90+ git reset HEAD^ --hard
91+ env :
92+ EXPECTED_SHA : ${{ inputs.commit }}
5393
5494 - uses : cachix/install-nix-action@f0fe604f8a612776892427721526b4c7cfb23aba # v31
5595 with :
@@ -73,6 +113,10 @@ jobs:
73113
74114 - name : Patch npm gyp
75115 run : curl -L https://github.com/npm/cli/pull/8531.diff | git apply --directory=deps/npm --exclude=deps/npm/package-lock.json
116+
117+ - name : Load shell.nix
118+ if : ${{ github.event_name == 'workflow_dispatch' }}
119+ run : curl -fsLSO https://github.com/${GITHUB_REPOSITORY}/raw/${GITHUB_SHA}/shell.nix
76120
77121 - name : Build Node.js and run tests
78122 run : |
@@ -84,5 +128,45 @@ jobs:
84128 --arg devTools '[]' \
85129 --arg benchmarkTools '[]' \
86130 --run '
87- make run-ci -j4 V=1 TEST_CI_ARGS="-p actions --measure-flakiness 9 --skip-tests=$CI_SKIP_TESTS"
131+ make ${{ github.event_name == 'workflow_dispatch' && 'build' || 'run' }}-ci -j4 V=1 TEST_CI_ARGS="-p actions --measure-flakiness 9 --skip-tests=$CI_SKIP_TESTS"
132+ '
133+
134+ - name : Roll back to merge commit
135+ if : ${{ github.event_name == 'workflow_dispatch' }}
136+ run : git reset FETCH_HEAD --hard
137+
138+ - name : Re-build Node.js
139+ # ccache is disabled here to avoid polluting the cache. Local build outputs should make this build relatively quick anyway.
140+ if : ${{ github.event_name == 'workflow_dispatch' }}
141+ run : |
142+ mv out/Release/node base_node
143+ nix-shell \
144+ --pure \
145+ --arg loadJSBuiltinsDynamically false \
146+ --arg ccache 'null' \
147+ --arg devTools '[]' \
148+ --arg benchmarkTools '[]' \
149+ --run '
150+ make build-ci -j4 V=1
151+ '
152+
153+ - name : Run benchmark
154+ if : ${{ github.event_name == 'workflow_dispatch' }}
155+ run : |
156+ nix-shell \
157+ --pure --keep FILTER \
158+ --arg loadJSBuiltinsDynamically false \
159+ --arg ccache 'null' \
160+ --arg devTools '[]' \
161+ --run '
162+ ./base_node benchmark/compare.js \
163+ --filter "$FILTER" \
164+ --runs ${{ inputs.runs }} \
165+ --old ./base_node --new ./node \
166+ -- ${{ inputs.category }} \
167+ | Rscript benchmark/compare.R
88168 '
169+ env :
170+ FILTER : ${{ inputs.filter }}
171+
172+
0 commit comments