使用actions/checkout在自托管runner上遇文件属主为root:root问题
解决自托管GitHub Actions Runner清理目录失败的问题
可行方案
1. 先修复权限再清理(安全可控)
如果不想开放rm的sudo免密权限,可以先把工作目录下的文件属主切换为当前Runner用户,再执行删除。只需要给Runner用户配置仅允许无密码执行chown命令,比开放rm权限更安全:
- 在自托管Runner机器上执行
sudo visudo,添加一行(替换runner为你的Runner实际用户名):
runner ALL=(ALL) NOPASSWD: /usr/bin/chown
- 修改工作流的清理步骤:
- name: Cleanup build folder run: | sudo chown -R $USER:$USER $RUNNER_WORKSPACE/ || true rm -rf $RUNNER_WORKSPACE/* || true
这里用$RUNNER_WORKSPACE内置变量代替硬编码路径,更适配不同Runner配置。
2. 从根源杜绝root文件生成
随机出现的root权限文件,大多是这两个原因导致的,针对性修复:
- 检查工作流中是否有
sudo执行的步骤,尽量避免用root权限操作;如果必须用,执行完后记得把生成的文件属主改回Runner用户。 - 如果用到Docker挂载工作目录,运行容器时加上
--user $(id -u):$(id -g)参数,让容器内操作使用当前Runner用户的UID/GID,避免生成root权限文件:docker run --user $(id -u):$(id -g) -v $RUNNER_WORKSPACE:/work ...
3. 预配置工作目录权限(一次性操作)
在Runner机器上执行以下命令,确保工作目录属主是Runner用户,并设置setgid位,让新创建的文件自动继承目录组权限:
sudo chown -R runner:runner /home/github/actions-runner/_work/ sudo chmod g+s /home/github/actions-runner/_work/
这能大幅减少后续出现root权限文件的概率。
问题原因
清理失败是因为之前的工作流步骤(比如sudo命令、Docker操作)生成了root属主的文件,而清理步骤以普通Runner用户身份执行,没有权限删除这些文件。回退到actions/checkout@v2没用,说明问题不在checkout动作本身,而是权限遗留导致的。
内容的提问来源于stack exchange,提问作者Kins
相关产品推荐
相关产品推荐

