Skip to content

Commit ba07321

Browse files
authored
Merge pull request #450 from binaricat/fix/linux-native-module-arch-verification
ci(linux): enhance native module arch verification
2 parents 6b24e38 + 034e5ea commit ba07321

3 files changed

Lines changed: 141 additions & 17 deletions

File tree

.github/workflows/build.yml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ jobs:
9393
name: build-linux-x64
9494
runs-on: ubuntu-22.04
9595
env:
96+
npm_config_arch: x64
97+
npm_config_target_arch: x64
9698
VITE_SYNC_GITHUB_CLIENT_ID: ${{ secrets.VITE_SYNC_GITHUB_CLIENT_ID }}
9799
VITE_SYNC_GOOGLE_CLIENT_ID: ${{ secrets.VITE_SYNC_GOOGLE_CLIENT_ID }}
98100
VITE_SYNC_GOOGLE_CLIENT_SECRET: ${{ secrets.VITE_SYNC_GOOGLE_CLIENT_SECRET }}
@@ -159,6 +161,8 @@ jobs:
159161
container:
160162
image: debian:bullseye
161163
env:
164+
npm_config_arch: arm64
165+
npm_config_target_arch: arm64
162166
VITE_SYNC_GITHUB_CLIENT_ID: ${{ secrets.VITE_SYNC_GITHUB_CLIENT_ID }}
163167
VITE_SYNC_GOOGLE_CLIENT_ID: ${{ secrets.VITE_SYNC_GOOGLE_CLIENT_ID }}
164168
VITE_SYNC_GOOGLE_CLIENT_SECRET: ${{ secrets.VITE_SYNC_GOOGLE_CLIENT_SECRET }}
@@ -239,6 +243,20 @@ jobs:
239243
- name: List artifacts
240244
run: ls -la artifacts/
241245

246+
- name: Verify downloaded Linux amd64 deb artifact
247+
run: |
248+
deb_file="$(find artifacts -maxdepth 1 -type f -name '*-linux-amd64.deb' -print | sort | head -n 1)"
249+
test -n "${deb_file}"
250+
bash scripts/verify-linux-deb-artifact.sh amd64 "${deb_file}"
251+
252+
- name: Verify downloaded Linux arm64 deb artifact metadata
253+
env:
254+
VERIFY_LOAD: "0"
255+
run: |
256+
deb_file="$(find artifacts -maxdepth 1 -type f -name '*-linux-arm64.deb' -print | sort | head -n 1)"
257+
test -n "${deb_file}"
258+
bash scripts/verify-linux-deb-artifact.sh arm64 "${deb_file}"
259+
242260
- name: Generate Release Body
243261
run: node .github/scripts/generate-release-note.js
244262
env:

scripts/ensure-node-pty-linux.sh

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,22 +53,43 @@ assert_loadable_native_module() {
5353
' "${file}"
5454
}
5555

56+
resolve_serialport_prebuild() {
57+
local root="$1"
58+
local arch="$2"
59+
local file
60+
61+
file="$(find "${root}/prebuilds/linux-${arch}" -maxdepth 1 -type f -name '@serialport+bindings-cpp*.glibc.node' -print | sort | head -n 1)"
62+
if [[ -z "${file}" ]]; then
63+
echo "[node-pty] serialport glibc prebuild not found for linux-${arch}" >&2
64+
exit 1
65+
fi
66+
67+
echo "${file}"
68+
}
69+
5670
prepare() {
5771
local arch="$1"
5872
local root="node_modules/node-pty"
5973
local release_dir="${root}/build/Release"
6074
local prebuild_dir="${root}/prebuilds/linux-${arch}"
75+
local serialport_root="node_modules/@serialport/bindings-cpp"
76+
local serialport_release_dir="${serialport_root}/build/Release"
77+
local serialport_prebuild
6178

6279
echo "[node-pty] rebuilding native modules for Electron on linux-${arch}"
6380
log_electron_runtime_info
64-
npx electron-rebuild --arch "${arch}"
81+
rm -rf "${release_dir}" "${prebuild_dir}" "${serialport_release_dir}"
82+
npx electron-rebuild --force --arch "${arch}" -w "node-pty,@serialport/bindings-cpp"
6583

6684
test -f "${release_dir}/pty.node"
85+
test -f "${serialport_release_dir}/bindings.node"
6786

6887
echo "[node-pty] built Linux runtime artifacts:"
6988
log_file_info "${release_dir}/pty.node"
7089
log_optional_spawn_helper "${release_dir}/spawn-helper"
7190
assert_loadable_native_module "${release_dir}/pty.node"
91+
log_file_info "${serialport_release_dir}/bindings.node"
92+
assert_loadable_native_module "${serialport_release_dir}/bindings.node"
7293

7394
mkdir -p "${prebuild_dir}"
7495
cp "${release_dir}/pty.node" "${prebuild_dir}/pty.node"
@@ -79,17 +100,26 @@ prepare() {
79100
echo "[node-pty] mirrored Linux runtime artifacts into ${prebuild_dir}:"
80101
log_file_info "${prebuild_dir}/pty.node"
81102
log_optional_spawn_helper "${prebuild_dir}/spawn-helper"
103+
104+
serialport_prebuild="$(resolve_serialport_prebuild "${serialport_root}" "${arch}")"
105+
echo "[node-pty] serialport packaged prebuild candidate:"
106+
log_file_info "${serialport_prebuild}"
107+
assert_loadable_native_module "${serialport_prebuild}"
82108
}
83109

84110
verify() {
85111
local arch="$1"
86112
local release_dir
87113
local prebuild_dir
114+
local serialport_release_file
115+
local serialport_prebuild_file
88116

89117
log_electron_runtime_info
90118

91119
release_dir="$(find release -type d -path "*/resources/app.asar.unpacked/node_modules/node-pty/build/Release" -print -quit)"
92120
prebuild_dir="$(find release -type d -path "*/resources/app.asar.unpacked/node_modules/node-pty/prebuilds/linux-${arch}" -print -quit)"
121+
serialport_release_file="$(find release -type f -path "*/resources/app.asar.unpacked/node_modules/@serialport/bindings-cpp/build/Release/bindings.node" -print -quit)"
122+
serialport_prebuild_file="$(find release -type f -path "*/resources/app.asar.unpacked/node_modules/@serialport/bindings-cpp/prebuilds/linux-${arch}/@serialport+bindings-cpp*.glibc.node" -print | sort | head -n 1)"
93123

94124
if [[ -z "${release_dir}" ]]; then
95125
echo "[node-pty] packaged build/Release directory not found under release/" >&2
@@ -101,6 +131,16 @@ verify() {
101131
exit 1
102132
fi
103133

134+
if [[ -z "${serialport_release_file}" ]]; then
135+
echo "[node-pty] packaged serialport build/Release binding not found under release/" >&2
136+
exit 1
137+
fi
138+
139+
if [[ -z "${serialport_prebuild_file}" ]]; then
140+
echo "[node-pty] packaged serialport glibc prebuild not found for linux-${arch} under release/" >&2
141+
exit 1
142+
fi
143+
104144
test -f "${release_dir}/pty.node"
105145
test -f "${prebuild_dir}/pty.node"
106146

@@ -114,10 +154,22 @@ verify() {
114154
log_optional_spawn_helper "${prebuild_dir}/spawn-helper"
115155
assert_loadable_native_module "${prebuild_dir}/pty.node"
116156

157+
echo "[node-pty] packaged serialport build/Release artifact:"
158+
log_file_info "${serialport_release_file}"
159+
assert_loadable_native_module "${serialport_release_file}"
160+
161+
echo "[node-pty] packaged serialport prebuild artifact:"
162+
log_file_info "${serialport_prebuild_file}"
163+
assert_loadable_native_module "${serialport_prebuild_file}"
164+
117165
echo "[node-pty] packaged artifact locations:"
118166
find release -path "*/resources/app.asar.unpacked/node_modules/node-pty/*" \
119167
\( -name 'pty.node' -o -name 'spawn-helper' \) \
120168
-print | sort
169+
170+
find release -path "*/resources/app.asar.unpacked/node_modules/@serialport/bindings-cpp/*" \
171+
\( -name 'bindings.node' -o -name '@serialport+bindings-cpp*.node' \) \
172+
-print | sort
121173
}
122174

123175
main() {

scripts/verify-linux-deb-artifact.sh

Lines changed: 70 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ set -euo pipefail
55
TEMP_DIR=""
66

77
usage() {
8-
echo "Usage: $0 <amd64|arm64>" >&2
8+
echo "Usage: $0 <amd64|arm64> [deb-file]" >&2
99
exit 1
1010
}
1111

@@ -67,6 +67,11 @@ assert_loadable_native_module() {
6767
local electron_bin="$1"
6868
local native_module="$2"
6969

70+
if [[ "${VERIFY_LOAD:-1}" != "1" ]]; then
71+
echo "[deb-verify] skipping native module load check for ${native_module} (VERIFY_LOAD=${VERIFY_LOAD:-1})"
72+
return
73+
fi
74+
7075
echo "[deb-verify] loading native module with packaged Electron runtime: ${native_module}"
7176
ELECTRON_RUN_AS_NODE=1 "${electron_bin}" -e '
7277
const path = require("node:path");
@@ -75,8 +80,56 @@ assert_loadable_native_module() {
7580
' "${native_module}"
7681
}
7782

83+
resolve_file_from_glob() {
84+
local search_dir="$1"
85+
local pattern="$2"
86+
find "${search_dir}" -maxdepth 1 -type f -name "${pattern}" -print | sort | head -n 1
87+
}
88+
89+
resolve_single_file() {
90+
local search_dir="$1"
91+
local pattern="$2"
92+
local file
93+
94+
file="$(resolve_file_from_glob "${search_dir}" "${pattern}")"
95+
if [[ -z "${file}" ]]; then
96+
echo "[deb-verify] no file matched ${pattern} under ${search_dir}" >&2
97+
exit 1
98+
fi
99+
100+
echo "${file}"
101+
}
102+
103+
resolve_serialport_prebuild() {
104+
local root="$1"
105+
local arch="$2"
106+
local prebuild_dir="${root}/prebuilds/linux-${arch}"
107+
local file
108+
109+
file="$(find "${prebuild_dir}" -maxdepth 1 -type f -name '@serialport+bindings-cpp*.glibc.node' -print | sort | head -n 1)"
110+
if [[ -z "${file}" ]]; then
111+
echo "[deb-verify] serialport glibc prebuild not found under ${prebuild_dir}" >&2
112+
exit 1
113+
fi
114+
115+
echo "${file}"
116+
}
117+
118+
verify_native_module() {
119+
local label="$1"
120+
local electron_bin="$2"
121+
local file="$3"
122+
local expected_machine="$4"
123+
124+
assert_exists "${file}"
125+
echo "[deb-verify] verifying ${label}"
126+
log_file_info "${file}"
127+
assert_file_arch "${file}" "${expected_machine}"
128+
assert_loadable_native_module "${electron_bin}" "${file}"
129+
}
130+
78131
main() {
79-
if [[ $# -ne 1 ]]; then
132+
if [[ $# -lt 1 || $# -gt 2 ]]; then
80133
usage
81134
fi
82135

@@ -89,6 +142,9 @@ main() {
89142
local main_binary
90143
local build_release_pty
91144
local prebuild_pty
145+
local serialport_root
146+
local build_release_serialport
147+
local prebuild_serialport
92148

93149
require_cmd dpkg-deb
94150
require_cmd file
@@ -107,10 +163,11 @@ main() {
107163
;;
108164
esac
109165

110-
deb_file="$(find release -maxdepth 1 -type f -name "*-linux-${deb_arch}.deb" -print | sort | head -n 1)"
111-
if [[ -z "${deb_file}" ]]; then
112-
echo "[deb-verify] no deb artifact found for ${deb_arch} under release/" >&2
113-
exit 1
166+
if [[ $# -eq 2 ]]; then
167+
deb_file="$2"
168+
assert_exists "${deb_file}"
169+
else
170+
deb_file="$(resolve_single_file "release" "*-linux-${deb_arch}.deb")"
114171
fi
115172

116173
echo "[deb-verify] verifying deb artifact: ${deb_file}"
@@ -131,22 +188,19 @@ main() {
131188
main_binary="${TEMP_DIR}/opt/Netcatty/netcatty"
132189
build_release_pty="${TEMP_DIR}/opt/Netcatty/resources/app.asar.unpacked/node_modules/node-pty/build/Release/pty.node"
133190
prebuild_pty="${TEMP_DIR}/opt/Netcatty/resources/app.asar.unpacked/node_modules/node-pty/prebuilds/linux-${prebuild_arch}/pty.node"
191+
serialport_root="${TEMP_DIR}/opt/Netcatty/resources/app.asar.unpacked/node_modules/@serialport/bindings-cpp"
192+
build_release_serialport="${serialport_root}/build/Release/bindings.node"
193+
prebuild_serialport="$(resolve_serialport_prebuild "${serialport_root}" "${prebuild_arch}")"
134194

135195
assert_executable "${electron_bin}"
136-
assert_exists "${build_release_pty}"
137-
assert_exists "${prebuild_pty}"
138196

139197
echo "[deb-verify] verifying packaged binary architectures"
140198
log_file_info "${main_binary}"
141-
log_file_info "${build_release_pty}"
142-
log_file_info "${prebuild_pty}"
143-
144199
assert_file_arch "${main_binary}" "${expected_machine}"
145-
assert_file_arch "${build_release_pty}" "${expected_machine}"
146-
assert_file_arch "${prebuild_pty}" "${expected_machine}"
147-
148-
assert_loadable_native_module "${electron_bin}" "${build_release_pty}"
149-
assert_loadable_native_module "${electron_bin}" "${prebuild_pty}"
200+
verify_native_module "node-pty build/Release" "${electron_bin}" "${build_release_pty}" "${expected_machine}"
201+
verify_native_module "node-pty prebuild" "${electron_bin}" "${prebuild_pty}" "${expected_machine}"
202+
verify_native_module "serialport build/Release" "${electron_bin}" "${build_release_serialport}" "${expected_machine}"
203+
verify_native_module "serialport glibc prebuild" "${electron_bin}" "${prebuild_serialport}" "${expected_machine}"
150204

151205
echo "[deb-verify] deb artifact verification passed for ${deb_file}"
152206
}

0 commit comments

Comments
 (0)