GoCD Agent如何在工作目录外的路径复制制品并执行命令
GoCD 跨工作目录部署制品及执行后置命令方案
前置权限配置
GoCD Agent 默认以go用户运行,要操作工作目录外的路径必须先配好对应权限,否则流水线会直接报权限拒绝错误:
- 先执行
ps aux | grep go-agent确认Agent实际运行用户,避免自定义安装后用户不一致的问题 - 给运行用户授予目标目录
/var/www/vhosts/project的读写执行权限,二选一即可:- 直接修改目录所有者:
chown -R go:go /var/www/vhosts/project - 如果目录需要保留原有属主(比如属于www-data用户组),就把go用户加入对应组并开放组权限:
usermod -aG www-data go chmod -R g+rwX /var/www/vhosts/project
- 直接修改目录所有者:
- 权限修改完成后必须重启go-agent服务,用户组的权限变更才会生效。
流水线任务配置
GoCD 从上游拉取的制品默认会存放在当前流水线的Agent工作子目录中,直接在自定义命令任务里写shell逻辑就能实现跨目录操作,不需要修改Agent默认工作路径。
1. 制品复制任务
优先用rsync做复制,比原生cp兼容性更好,能自动处理隐藏文件、跨磁盘分区复制的问题:
# 清空目标目录旧版本残留文件 rm -rf /var/www/vhosts/project/* # 全量同步当前工作目录的制品到目标路径,末尾斜杠不要遗漏,--delete参数会清除目标目录里源端不存在的旧文件 rsync -av --delete ./ /var/www/vhosts/project/
如果机器没有装rsync,用cp的话注意要覆盖隐藏文件:
rm -rf /var/www/vhosts/project/* cp -r ./* /var/www/vhosts/project/ # 补充复制隐藏文件,无隐藏文件时忽略报错 cp -r ./.[!.]* /var/www/vhosts/project/ 2>/dev/null || true
2. 目标目录后置命令执行
GoCD 任务默认的执行路径是Agent的工作目录,执行目标路径下的命令时必须先切换目录,所有路径尽量用绝对路径避免出错:
# 切换到目标目录后执行生产构建命令,如果用nvm管理Node版本先加载nvm环境 source /home/go/.nvm/nvm.sh nvm use 18 cd /var/www/vhosts/project npm ci npm run production # 后续需要执行的服务重启、配置重载命令同理,注意如果要用到sudo,提前给go用户配置对应命令的免密sudo权限,不要在流水线里写明文密码
避坑提示
- 不要为了适配单个项目修改GoCD Agent的默认工作目录,多流水线共用Agent、后续升级Agent时很容易出现路径冲突、权限混乱的问题
- 如果目标目录是挂载的网络存储,提前在Agent机器上切到go用户手动测试读写、执行权限,避免流水线运行时才暴露权限问题
- 涉及服务重启类的高权限操作,只给go用户开放对应单条命令的免密sudo权限,不要给全量sudo权限,避免安全风险
内容的提问来源于stack exchange,提问作者Hung Nguyen
相关产品推荐
相关产品推荐

