Buildkite流水线中keytar.node导致git clean权限报错问题
问题原因
该故障通常由以下几种场景触发:
- 文件所有者不匹配:keytar为Node.js原生扩展模块,安装时会编译生成
keytar.node二进制文件。如果你的流水线中使用Docker容器执行npm install相关操作,容器默认使用root用户运行,生成的文件所有者为root,宿主的buildkite-agent用户没有权限删除该文件。 - 文件被进程占用:如果前一次构建的测试/服务进程未正常退出,仍持有
keytar.node的文件句柄,会触发权限不足的删除报错。 - 文件被设置特殊属性:部分安全策略或安装脚本会给二进制文件添加immutable(不可修改)特殊属性,即便是文件所有者也无法直接删除。
解决方案
对应不同触发场景可选择以下方案解决:
- 容器执行npm操作时对齐用户权限:给
docker run命令添加--user $(id -u):$(id -g)参数,使容器内运行用户与宿主的buildkite-agent用户UID、GID一致,确保生成的文件所有者为buildkite-agent。 - 配置sudo权限强制清理:给buildkite-agent用户配置对应路径的免密sudo权限,在/etc/sudoers文件中添加如下规则:
然后修改Buildkite的前置checkout钩子,在执行git clean前先运行buildkite-agent ALL=(ALL) NOPASSWD: /usr/bin/rm -rf /var/lib/buildkite-agent/builds/*sudo rm -rf node_modules强制清理依赖目录。 - 清理残留占用进程:在git clean前添加步骤执行
lsof node_modules/keytar/build/Release/keytar.node | awk '{print $2}' | grep -v PID | xargs kill -9 2>/dev/null,清理持有该文件的残留进程。 - 移除文件特殊属性:如果执行
lsattr node_modules/keytar/build/Release/keytar.node输出中包含i标识,执行sudo chattr -i node_modules/keytar/build/Release/keytar.node移除不可修改属性后再执行删除操作。 - 全局配置全新 checkout:在Buildkite流水线配置中开启
BUILDKITE_CLEAN_CHECKOUT=true参数,每次构建会直接清理整个工作目录后拉取全新代码,避免残留文件冲突。
内容的提问来源于stack exchange,提问作者Arpan Kc
相关产品推荐
相关产品推荐

