VSTS构建代理拉取源代码失败:Permission denied问题求助
解决Azure Linux代理池二次构建拉取源码Permission Denied问题
我帮你拆解下这个问题——你遇到的情况是首次构建正常,二次构建就卡在拉源码阶段报权限拒绝,结合你设置的clean: true和clean options: sources,核心问题应该是清理操作打乱了源码目录的权限配置。
问题根源分析
- 首次构建时,代理服务的运行账号(通常是
vstsagent或你自定义的账号)创建了源码目录,并且拥有完整的读写权限; - 当开启
sources级别的清理时,构建会强制清空源码目录的所有内容,甚至会重置目录的所有者和权限; - 二次构建拉取源码时,代理账号已经没有足够权限去创建或写入新的源码文件,直接触发
Permission denied报错。
具体解决方案
这里给你几个可行的解决步骤,按优先级尝试:
检查代理运行账号的目录权限
- 登录到出问题的Linux虚拟机,执行
ps aux | grep agent找到代理进程的运行用户; - 然后检查代理工作目录(默认是
/home/<代理账号>/agent/_work)的权限,确保该用户拥有rwx权限:ls -ld /home/<代理账号>/agent/_work - 如果权限不对,手动修复:
chown -R <代理账号>:<代理账号> /home/<代理账号>/agent/_work chmod -R 755 /home/<代理账号>/agent/_work
- 登录到出问题的Linux虚拟机,执行
调整清理策略避免权限重置
- 如果业务上必须保留清理操作,建议把
clean options从sources改成outputDirectory,这样只会清理构建输出目录,不会改动源码目录的权限; - 要是必须清理源码目录,可以在构建的第一步添加一个Shell脚本任务,提前修复权限:
# 确保代理账号拥有源码目录的权限 chown -R $(Agent.UserName):$(Agent.UserName) $(Build.SourcesDirectory) chmod -R 755 $(Build.SourcesDirectory)
- 如果业务上必须保留清理操作,建议把
验证Git拉取的凭据有效性
- 如果是SSH方式拉取源码,检查虚拟机上代理账号的
.ssh目录下的密钥是否有权限访问代码仓库,确保密钥没有过期或权限设置错误(密钥文件权限必须是600); - 如果是HTTPS方式,确认使用的PAT(个人访问令牌)没有过期,且拥有代码仓库的读取权限。
- 如果是SSH方式拉取源码,检查虚拟机上代理账号的
重置代理工作目录
- 停止代理服务:
sudo systemctl stop vstsagent.service(如果是systemd管理的话); - 删除代理的
_work目录:rm -rf /home/<代理账号>/agent/_work; - 重新启动代理服务,让它重新初始化工作目录,这样目录权限会被自动设置正确。
- 停止代理服务:
内容的提问来源于stack exchange,提问作者Bobby
相关产品推荐
相关产品推荐

