forked from nodejs/node
-
Notifications
You must be signed in to change notification settings - Fork 1
142 lines (127 loc) Β· 5.78 KB
/
build-node.yml
File metadata and controls
142 lines (127 loc) Β· 5.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
name: Build Node
on:
workflow_dispatch:
push:
branches:
- v20.18.3
jobs:
build-node:
name: Build ${{ matrix.platform }}-${{ matrix.arch }}
strategy:
matrix:
include:
- platform: linux
arch: x64
runs_on: ubuntu-22.04
- platform: linux
arch: arm64
runs_on: ubuntu-22.04-arm
runs-on: ${{ matrix.runs_on }}
env:
S3_BUCKET: your-bucket-name
AWS_REGION: us-east-1
REPO: ${{ github.repository }}
steps:
- name: Checkout Node fork
uses: actions/checkout@v3
with:
repository: Asana/node
path: node
ref: ${{ github.event_name == 'pull_request' && format('refs/pull/{0}/merge', github.event.pull_request.number) || github.ref_name }}
token: ${{ secrets.GITHUB_TOKEN }}
- name: Extract Node Version
id: extract-node-version
run: |
NODE_MAJOR_VERSION=$(grep '#define NODE_MAJOR_VERSION' node/src/node_version.h | awk '{print $3}')
NODE_MINOR_VERSION=$(grep '#define NODE_MINOR_VERSION' node/src/node_version.h | awk '{print $3}')
NODE_PATCH_VERSION=$(grep '#define NODE_PATCH_VERSION' node/src/node_version.h | awk '{print $3}')
NODE_VERSION="v${NODE_MAJOR_VERSION}.${NODE_MINOR_VERSION}.${NODE_PATCH_VERSION}"
echo "NODE_VERSION=${NODE_VERSION}" >> $GITHUB_ENV
- name: Set build metadata
id: meta
working-directory: node
run: |
TIMESTAMP=$(date -u +%Y-%m-%dT%H-%M)
SHORT_SHA=$(git rev-parse --short HEAD)
echo "BUILD_ID=${TIMESTAMP}-${SHORT_SHA}" >> $GITHUB_ENV
echo "build_id=${TIMESTAMP}-${SHORT_SHA}" >> $GITHUB_OUTPUT
#- name: Install dependencies (Linux)
#if: matrix.platform == 'linux'
#run: |
#sudo apt-get update
#sudo apt-get install -y python3 g++ make curl tar xz-utils
#- name: Build Node (linux)
#working-directory: node
#if: matrix.platform == 'linux'
#run: |
#./configure --experimental-enable-pointer-compression
#make -j4 install DESTDIR=$GITHUB_WORKSPACE/node-install
#- name: Build Node (darwin)
#working-directory: node
#if: matrix.platform == 'darwin'
#run: |
#./configure --experimental-enable-pointer-compression --without-snapshot
#make -j2 install DESTDIR=$GITHUB_WORKSPACE/node-install
#
- name: Execute the Dockerfile
working-directory: node
run: |
docker build -t node20_build -f ./Dockerfile.Node20 .
- name: Extract resources
run: |
docker create --name temp_node_extract node20_build
docker cp temp_node_extract:/usr/src/node/node-install $GITHUB_WORKSPACE/node-install
docker rm temp_node_extract
- name: Archive Node
run: |
mkdir -p artifacts
FILENAME=node-${NODE_VERSION}-${{ matrix.platform }}-${{ matrix.arch }}-${{ steps.meta.outputs.build_id }}.tar.xz
FILENAME_LATEST=node-${NODE_VERSION}-${{ matrix.platform }}-${{ matrix.arch }}-LATEST.tar.xz
tar -C node-install -cJf artifacts/$FILENAME .
cp artifacts/$FILENAME artifacts/$FILENAME_LATEST
echo "NODE_ARCHIVE=$FILENAME" >> $GITHUB_ENV
echo "NODE_ARCHIVE_LATEST=$FILENAME_LATEST" >> $GITHUB_ENV
- name: Upload Node archive
uses: actions/upload-artifact@v4
with:
name: node-${{ env.NODE_VERSION }}-${{ matrix.platform }}-${{ matrix.arch }}-${{ steps.meta.outputs.build_id }}
path: artifacts/${{ env.NODE_ARCHIVE }}
- name: Upload Node archive latest
uses: actions/upload-artifact@v4
with:
name: node-${{ env.NODE_VERSION }}-${{ matrix.platform }}-${{ matrix.arch }}-LATEST
path: artifacts/${{ env.NODE_ARCHIVE_LATEST }}
- name: Upload Node archive to release
# Publish the built Node archive to the node-${NODE_VERSION}-release release.
# This is the first uploader in the pipeline; build-node-packages and
# build-node-fibers attach additional artifacts to the same release later.
#
# Matrix concurrency: both matrix arms (linux-x64, linux-arm64) hit this step
# in parallel. On the first run for a new NODE_VERSION the release does not
# yet exist, so both arms race to create it. The view-or-create guard with
# the trailing `|| gh release view` tolerates "already exists" from the
# losing arm (as long as the release now exists); any other create failure
# propagates through that second view.
#
# `--clobber` makes re-uploads idempotent on asset name collisions: an
# existing asset with the same name is deleted before the new one uploads.
# Acceptable here because the -LATEST assets are always reproducible from
# the build inputs; if the upload fails after the delete, just re-run the
# job.
#
# `gh release edit --title` after upload keeps the release title
# deterministically derived from NODE_VERSION even if someone renames the
# release in the GitHub UI.
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
set -euo pipefail
TAG="node-${NODE_VERSION}-release"
RELEASE_NAME="node-${NODE_VERSION}-LATEST"
FILE="./artifacts/${NODE_ARCHIVE_LATEST}"
if ! gh release view "$TAG" --repo "$REPO" >/dev/null 2>&1; then
gh release create "$TAG" --title "$RELEASE_NAME" --notes "" --repo "$REPO" \
|| gh release view "$TAG" --repo "$REPO" >/dev/null
fi
gh release upload "$TAG" "$FILE" --clobber --repo "$REPO"
gh release edit "$TAG" --title "$RELEASE_NAME" --repo "$REPO"