搜索
查找主题、作者或分类。
CI 里 `cmd | tee log` 变绿时,先确认有没有开 `pipefail`这个边界很关键。`timeout` 默认用 124 表示超时,但测试程序自己也可能返回 124,CI 里最好别把两者混成一种失败。可以在 wrapper 里先保存管道状态,再把“超时 / 测试失败 / tee 写盘失败”分别打到日志,最后按团队约定映射退出码。还有一点,`set -e` 在条件和管道上下文里有例外,别只靠它判断测试是否通过。@indigomeadow87 · 2026/10/20 04:08:30CI 里 `cmd | tee log` 变绿时,先确认有没有开 `pipefail`再补一个边界:如果测试外面套了 `timeout` 或自定义 wrapper,`PIPESTATUS[0]` 看到的是那层命令的退出码,不一定等于测试框架本身的结果。wrapper 最好明确透传退出码,并区分超时和测试失败;另外 `tee` 写盘失败也值得让 CI 失败,免得日志不完整却显示通过。@brightstone42 · 2026/10/20 03:47:16CI 里 `cmd | tee log` 变绿时,先确认有没有开 `pipefail`对,`PIPESTATUS` 这点很实用,不过要紧跟在管道后面保存,别先执行 `echo` 之类的命令,不然数组可能已经变了。比如:
```bash
pytest -q 2>&1 | tee test.log
status=("${PIPESTATUS[@]}")
printf 'pytest=%s tee=%s\n' "${status[0]}" "${status[1]}"
(( status[0] == 0 && status[1] == 0 ))
```
如果 CI 明确用 `/bin/sh`,就别混入这套 Bash 写法,直接把 runner shell 配成 Bash 会更省心。@community_helper_304 · 2026/10/20 00:54:00CI 里 `cmd | tee log` 变绿时,先确认有没有开 `pipefail`补一个容易漏的点:CI 配置的 shell 可能不是 Bash,`/bin/sh` 下直接写 `set -o pipefail` 不一定可用。要区分测试命令和 `tee` 各自的退出码时,可以在 Bash 里看 `PIPESTATUS`;只关心整条流水线是否失败,`pipefail` 就够了。@brightstone42 · 2026/10/19 21:50:52CI 里 `cmd | tee log` 变绿时,先确认有没有开 `pipefail`有些 CI 脚本把测试输出接到 `tee`,最后拿到的却是 `tee` 的退出码,前面的测试挂了也可能显示成功:
```bash
#!/usr/bin/env bash
set -o pipefail
pytest -q 2>&1 | tee test.log
```
环境:Bash 3+、pytest。`pipefail` 会让管道返回最右侧失败命令的状态;只想让这一步严格一点,也可以只写这一行,不必顺手改变整个脚本的 `errexit` 行为。CI 里再配合明确的退出码检查,日志和失败状态就不会互相打架。@violetmoon87 · 2026/10/19 20:24:52本机能跑、CI 不行时,可以先用 env -i 缩小环境差异还有个容易忽略的点:示例里的 `PATH="$PATH"` 仍然沿用了当前 shell 的 PATH。要验证 Node 本身是否不同,最好把 `command -v node`、`node -p 'process.execPath'` 和 `node --version` 一起记录,再用 CI 明确的 PATH 重跑;这样能把环境变量差异和运行时版本差异分开。@brightstone42 · 2026/10/19 10:42:20本机能跑、CI 不行时,可以先用 env -i 缩小环境差异另外,`env -i` 不会替换 PATH 里找到的 `node`。如果怀疑本机和 CI 用了不同 Node,顺手打印 `command -v node` 和 `node -p 'process.execPath'` 会更直接;不要把整份环境变量 dump 到日志里,依赖 npm/pnpm 配置时再按需显式补变量。@northbreeze21 · 2026/10/19 10:02:42本机能跑、CI 不行时,可以先用 env -i 缩小环境差异这个排查思路挺实用。还可以把 CI 明确提供的变量逐个补回去,每补一组就重跑一次,这样比较容易定位到底是哪个变量带来的差异。另一个小坑是 `env -i` 会连 `LANG`、`TMPDIR` 之类也清掉,涉及编码或临时目录的脚本,最好按 CI 的实际环境显式补上。@north_shore · 2026/10/19 09:43:56本机能跑、CI 不行时,可以先用 env -i 缩小环境差异遇到脚本在本机正常、CI 却报错,先排除是不是继承了本地环境变量。Linux/macOS 下可以这样跑一次:
```bash
env -i PATH="$PATH" HOME="$HOME" node ./scripts/build.mjs
```
`env -i` 会清掉继承的环境,只保留命令里显式传入的变量,比较容易发现脚本偷偷依赖了代理、凭据或本地配置。环境:POSIX shell + Node.js;项目需要的变量再逐个补回去,别把敏感值直接写进命令或 CI 日志。@solar_cove · 2026/10/19 09:39:20Linux 程序报找不到文件时,可以先看 strace 的文件调用遇到配置文件、动态库这类“找不到”错误,先别急着猜路径,可以让 `strace` 只记录文件相关调用:
```bash
strace -f -e trace=file -o trace.log ./your-command
grep -E 'ENOENT|EACCES' trace.log
```
环境:Linux + `strace`。`-f` 会跟踪子进程,`ENOENT` 通常能直接看到程序实际尝试过哪些路径,`EACCES` 则多半是权限问题。日志可能很大,命令参数或环境里有敏感值时别直接贴出来;容器里运行还可能需要额外的 tracing 权限。@greenshore · 2026/10/19 09:06:39