使用GitLab Runner部署Angular项目出现cp cannot stat permission denied错误如何解决
错误原因
该报错的核心原因是GitLab Runner 任务的执行用户对部署目标目录没有写入权限:
- 默认情况下 GitLab Runner 用
gitlab-runner用户执行 CI 任务 /var/www下的站点目录默认归属为root或www-data用户,权限通常为755,仅所有者拥有写入权限,gitlab-runner用户无写入权限,因此覆盖目录内文件时触发权限拒绝错误
解决方案
可根据场景选择以下任意一种方案:
方案1(简单高效,仅Runner部署场景适用)
直接修改站点目录的所有者为gitlab-runner用户,在部署服务器上执行以下命令即可:
# 开发环境目录赋权 sudo chown -R gitlab-runner:gitlab-runner /var/www/my-website-dev/ # 生产环境目录赋权(同步配置避免后续生产部署报错) sudo chown -R gitlab-runner:gitlab-runner /var/www/my-website/
方案2(更规范,兼容Web服务读取需求)
如果站点同时需要Nginx/Apache等Web服务读取(Web服务通常用www-data用户运行),推荐通过用户组赋权:
- 把
gitlab-runner用户加入www-data用户组
sudo usermod -aG www-data gitlab-runner
- 给站点目录开放用户组写入权限
sudo chgrp -R www-data /var/www/my-website-dev/ /var/www/my-website/ sudo chmod -R g+w /var/www/my-website-dev/ /var/www/my-website/
- 重启GitLab Runner服务让用户组配置生效
sudo systemctl restart gitlab-runner
方案3(不推荐,仅临时测试使用)
可以给gitlab-runner用户配置cp命令的免密sudo权限,实现提权写入:
- 执行
sudo visudo编辑sudoers配置,添加以下内容:
gitlab-runner ALL=(ALL) NOPASSWD: /usr/bin/cp
- 修改
.gitlab-ci.yml中的部署命令,加上sudo前缀:
script: - sudo cp -r dist/my-website/* /var/www/my-website-dev/
内容的提问来源于stack exchange,提问作者Newsha Nik
相关产品推荐
相关产品推荐

