Skip to content

Commit 9018129

Browse files
committed
tools: run CI with shared libs on GHA
1 parent 886e4b3 commit 9018129

35 files changed

+468
-138
lines changed

.github/workflows/test-shared.yml

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
name: Test Shared librairies
2+
3+
on:
4+
pull_request:
5+
paths-ignore:
6+
- .mailmap
7+
- README.md
8+
- .github/**
9+
- '!.github/workflows/test-shared.yml'
10+
types: [opened, synchronize, reopened, ready_for_review]
11+
push:
12+
branches:
13+
- main
14+
- canary
15+
- v[0-9]+.x-staging
16+
- v[0-9]+.x
17+
paths-ignore:
18+
- .mailmap
19+
- README.md
20+
- .github/**
21+
- '!.github/workflows/test-shared.yml'
22+
23+
concurrency:
24+
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
25+
cancel-in-progress: true
26+
27+
env:
28+
FLAKY_TESTS: keep_retrying
29+
NIXPKGS_REPO: https://github.com/NixOS/nixpkgs
30+
NIXPKGS_PIN: c53baa6685261e5253a1c355a1b322f82674a824
31+
32+
permissions:
33+
contents: read
34+
35+
jobs:
36+
build:
37+
strategy:
38+
fail-fast: false
39+
matrix:
40+
include:
41+
- runner: ubuntu-24.04
42+
system: x86_64-linux
43+
- runner: ubuntu-24.04-arm
44+
system: aarch64-linux
45+
- runner: macos-13
46+
system: x86_64-darwin
47+
- runner: macos-14
48+
system: aarch64-darwin
49+
name: '${{ matrix.system }}: with shared libraries'
50+
runs-on: ${{ matrix.runner }}
51+
steps:
52+
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
53+
54+
- uses: cachix/install-nix-action@f0fe604f8a612776892427721526b4c7cfb23aba # v31
55+
with:
56+
extra_nix_config: sandbox = true
57+
github_access_token: ${{ secrets.GITHUB_TOKEN }}
58+
nix_path: nixpkgs=${{ env.NIXPKGS_REPO }}/archive/${{ env.NIXPKGS_PIN }}.tar.gz
59+
60+
- uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16
61+
with:
62+
name: nodejs
63+
authToken: ${{ secrets.CACHIX_AUTH_TOKEN }}
64+
65+
- name: Configure sccache
66+
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
67+
with:
68+
script: |
69+
core.exportVariable('SCCACHE_GHA_VERSION', 'on');
70+
core.exportVariable('ACTIONS_CACHE_SERVICE_V2', 'on');
71+
core.exportVariable('ACTIONS_RESULTS_URL', process.env.ACTIONS_RESULTS_URL || '');
72+
core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || '');
73+
74+
- name: Build Node.js and run tests
75+
run: |
76+
nix-shell \
77+
--pure --keep FLAKY_TESTS \
78+
--keep SCCACHE_GHA_VERSION --keep ACTIONS_CACHE_SERVICE_V2 --keep ACTIONS_RESULTS_URL --keep ACTIONS_RUNTIME_TOKEN \
79+
--arg loadJSBuiltinsDynamically false \
80+
--arg ccache '(import <nixpkgs> {}).sccache' \
81+
--arg devTools '[]' \
82+
--arg benchmarkTools '[]' \
83+
--run '
84+
make run-ci -j4 V=1 TEST_CI_ARGS="-p actions --measure-flakiness 9 --skip-tests=$CI_SKIP_TESTS"
85+
'

.github/workflows/tools.yml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ on:
3030
- llhttp
3131
- minimatch
3232
- nbytes
33+
- nixpkgs-unstable
3334
- nghttp2
3435
- nghttp3
3536
- ngtcp2
@@ -198,6 +199,14 @@ jobs:
198199
cat temp-output
199200
tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true
200201
rm temp-output
202+
- id: nixpkgs-unstable
203+
subsystem: tools
204+
label: tools
205+
run: |
206+
./tools/dep_updaters/update-nixpkgs-pin.sh > temp-output
207+
cat temp-output
208+
tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true
209+
rm temp-output
201210
- id: nghttp2
202211
subsystem: deps
203212
label: dependencies

BUILDING.md

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,7 @@ Consult previous versions of this document for older versions of Node.js:
239239

240240
Installation via Linux package manager can be achieved with:
241241

242+
* Nix, NixOS: `nix-shell`
242243
* Ubuntu, Debian: `sudo apt-get install python3 g++-12 gcc-12 make python3-pip`
243244
* Fedora: `sudo dnf install python3 gcc-c++ make python3-pip`
244245
* CentOS and RHEL: `sudo yum install python3 gcc-c++ make python3-pip`
@@ -259,6 +260,75 @@ installed, you can find them under the menu `Xcode -> Open Developer Tool ->
259260
More Developer Tools...`. This step will install `clang`, `clang++`, and
260261
`make`.
261262

263+
#### Nix integration
264+
265+
If you are using Nix and direnv, you can use the following to get started:
266+
267+
```bash
268+
echo 'use_nix --arg sharedLibDeps {} --argstr icu small' > .envrc
269+
direnv allow .
270+
make build-ci -j12
271+
```
272+
273+
The use of `make build-ci` is to ensure you are using the `CONFIG_FLAGS`
274+
environment variable. You can also specify it manually:
275+
276+
```sh
277+
./configure $CONFIG_FLAGS
278+
make -j12
279+
```
280+
281+
Passing the `--arg sharedLibDeps {}` instructs direnv and Nix to generate an
282+
environment that uses the vendored-in native dependencies. Using the vendored-in
283+
dependencies result in a result closer to the official binaries, the tradeoff
284+
being the build will take longer to complete as you'd have to build those
285+
dependencies instead of using the cached ones from the Nix cache. You can omit
286+
that flag to use all the shared dependencies, or specify only some dependencies:
287+
288+
```bash
289+
cat -> .envrc <<'EOF'
290+
use nix --arg sharedLibDeps '{
291+
inherit (import <nixpkgs> {})
292+
openssl
293+
zlib
294+
;
295+
}'
296+
EOF
297+
```
298+
299+
Passing the `--argstr icu small` instructs direnv and Nix to pass `--with-intl=small` in
300+
the `CONFIG_FLAGS` environment variable. If you omit this, the prebuilt ICU from Nix cache
301+
will be used, which should speed up greatly compilation time.
302+
303+
The use of `direnv` is completely optional, you can also use `nix-shell` directly,
304+
e.g. here's a command you can use to build a binary for benchmarking purposes:
305+
306+
```bash
307+
# Passing `--arg loadJSBuiltinsDynamically false` to instruct the compiler to
308+
# embed the JS core files so it is no longer affected by local changes
309+
# (necessary for getting useful benchmark results).
310+
# Passing `--arg devTools '[]' --arg benchmarkTools '[]'` since we don't need
311+
# those to build node.
312+
nix-shell \
313+
--arg loadJSBuiltinsDynamically false \
314+
--arg devTools '[]' --arg benchmarkTools '[]' \
315+
--run 'make build-ci -j12'
316+
317+
mv out/Release/node ./node_old
318+
319+
# ...
320+
# Make your local changes, and re-build node
321+
322+
nix-shell \
323+
--arg loadJSBuiltinsDynamically false \
324+
--arg devTools '[]' --arg benchmarkTools '[]' \
325+
--run 'make build-ci -j12'
326+
327+
nix-shell --pure --run './node benchmark/compare.js --old ./node_old --new ./node http | Rscript benchmark/compare.R'
328+
```
329+
330+
There are additional attributes you can pass, see `shell.nix` file for more details.
331+
262332
#### Building Node.js
263333

264334
If the path to your build directory contains a space, the build will likely
@@ -267,7 +337,6 @@ fail.
267337
To build Node.js:
268338

269339
```bash
270-
export CXX=g++-12
271340
./configure
272341
make -j4
273342
```

deps/npm/node_modules/node-gyp/.release-please-manifest.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

deps/npm/node_modules/node-gyp/addon.gypi

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

deps/npm/node_modules/node-gyp/gyp/.release-please-manifest.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

deps/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings.py

Lines changed: 1 addition & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

deps/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSVersion.py

Lines changed: 2 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

deps/npm/node_modules/node-gyp/gyp/pylib/gyp/__init__.py

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

deps/npm/node_modules/node-gyp/gyp/pylib/gyp/common.py

Lines changed: 27 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)