Skip to content

Commit 6b24e38

Browse files
authored
Merge pull request #447 from li88iioo/fix/linux-deb-final-verification
ci(linux): verify final deb artifact before publish
2 parents b972866 + b73e60f commit 6b24e38

2 files changed

Lines changed: 160 additions & 0 deletions

File tree

.github/workflows/build.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,9 @@ jobs:
135135
- name: Verify packaged node-pty Linux runtime
136136
run: bash scripts/ensure-node-pty-linux.sh verify x64
137137

138+
- name: Verify packaged deb artifact
139+
run: bash scripts/verify-linux-deb-artifact.sh amd64
140+
138141
- name: Upload artifacts
139142
uses: actions/upload-artifact@v4
140143
with:
@@ -201,6 +204,9 @@ jobs:
201204
- name: Verify packaged node-pty Linux runtime
202205
run: bash scripts/ensure-node-pty-linux.sh verify arm64
203206

207+
- name: Verify packaged deb artifact
208+
run: bash scripts/verify-linux-deb-artifact.sh arm64
209+
204210
- name: Upload artifacts
205211
uses: actions/upload-artifact@v4
206212
with:
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
#!/usr/bin/env bash
2+
3+
set -euo pipefail
4+
5+
TEMP_DIR=""
6+
7+
usage() {
8+
echo "Usage: $0 <amd64|arm64>" >&2
9+
exit 1
10+
}
11+
12+
checksum() {
13+
if command -v sha256sum >/dev/null 2>&1; then
14+
sha256sum "$@"
15+
else
16+
shasum -a 256 "$@"
17+
fi
18+
}
19+
20+
require_cmd() {
21+
local cmd="$1"
22+
command -v "${cmd}" >/dev/null 2>&1 || {
23+
echo "[deb-verify] missing required command: ${cmd}" >&2
24+
exit 1
25+
}
26+
}
27+
28+
assert_exists() {
29+
local file="$1"
30+
if [[ ! -e "${file}" ]]; then
31+
echo "[deb-verify] expected file does not exist: ${file}" >&2
32+
exit 1
33+
fi
34+
}
35+
36+
assert_executable() {
37+
local file="$1"
38+
if [[ ! -x "${file}" ]]; then
39+
echo "[deb-verify] expected executable file is missing or not executable: ${file}" >&2
40+
exit 1
41+
fi
42+
}
43+
44+
log_file_info() {
45+
local file="$1"
46+
echo "[deb-verify] file: ${file}"
47+
ls -lh "${file}"
48+
file "${file}"
49+
checksum "${file}"
50+
}
51+
52+
assert_file_arch() {
53+
local file="$1"
54+
local expected="$2"
55+
local info
56+
57+
info="$(file "${file}")"
58+
echo "[deb-verify] arch-check: ${info}"
59+
if [[ "${info}" != *"${expected}"* ]]; then
60+
echo "[deb-verify] unexpected architecture for ${file}" >&2
61+
echo "[deb-verify] expected substring: ${expected}" >&2
62+
exit 1
63+
fi
64+
}
65+
66+
assert_loadable_native_module() {
67+
local electron_bin="$1"
68+
local native_module="$2"
69+
70+
echo "[deb-verify] loading native module with packaged Electron runtime: ${native_module}"
71+
ELECTRON_RUN_AS_NODE=1 "${electron_bin}" -e '
72+
const path = require("node:path");
73+
require(path.resolve(process.argv[1]));
74+
console.log("[deb-verify] native module loaded successfully");
75+
' "${native_module}"
76+
}
77+
78+
main() {
79+
if [[ $# -ne 1 ]]; then
80+
usage
81+
fi
82+
83+
local deb_arch="$1"
84+
local prebuild_arch
85+
local expected_machine
86+
local deb_file
87+
local control_arch
88+
local electron_bin
89+
local main_binary
90+
local build_release_pty
91+
local prebuild_pty
92+
93+
require_cmd dpkg-deb
94+
require_cmd file
95+
96+
case "${deb_arch}" in
97+
amd64)
98+
prebuild_arch="x64"
99+
expected_machine="x86-64"
100+
;;
101+
arm64)
102+
prebuild_arch="arm64"
103+
expected_machine="ARM aarch64"
104+
;;
105+
*)
106+
usage
107+
;;
108+
esac
109+
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
114+
fi
115+
116+
echo "[deb-verify] verifying deb artifact: ${deb_file}"
117+
log_file_info "${deb_file}"
118+
119+
control_arch="$(dpkg-deb -f "${deb_file}" Architecture)"
120+
echo "[deb-verify] control architecture: ${control_arch}"
121+
if [[ "${control_arch}" != "${deb_arch}" ]]; then
122+
echo "[deb-verify] deb control architecture mismatch: expected ${deb_arch}, got ${control_arch}" >&2
123+
exit 1
124+
fi
125+
126+
TEMP_DIR="$(mktemp -d)"
127+
trap 'rm -rf "${TEMP_DIR:-}"' EXIT
128+
dpkg-deb -x "${deb_file}" "${TEMP_DIR}"
129+
130+
electron_bin="${TEMP_DIR}/opt/Netcatty/netcatty"
131+
main_binary="${TEMP_DIR}/opt/Netcatty/netcatty"
132+
build_release_pty="${TEMP_DIR}/opt/Netcatty/resources/app.asar.unpacked/node_modules/node-pty/build/Release/pty.node"
133+
prebuild_pty="${TEMP_DIR}/opt/Netcatty/resources/app.asar.unpacked/node_modules/node-pty/prebuilds/linux-${prebuild_arch}/pty.node"
134+
135+
assert_executable "${electron_bin}"
136+
assert_exists "${build_release_pty}"
137+
assert_exists "${prebuild_pty}"
138+
139+
echo "[deb-verify] verifying packaged binary architectures"
140+
log_file_info "${main_binary}"
141+
log_file_info "${build_release_pty}"
142+
log_file_info "${prebuild_pty}"
143+
144+
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}"
150+
151+
echo "[deb-verify] deb artifact verification passed for ${deb_file}"
152+
}
153+
154+
main "$@"

0 commit comments

Comments
 (0)