GitLab项目部署至Linux服务器指定目录遇权限错误求助
GitLab CI部署到Linux服务器指定目录的解决方案
一、解决权限问题
目标目录/var/www/project-cms.com/html的.git目录权限不允许GitLab Runner的执行用户(gitlab-runner)操作,执行以下命令调整权限:
# 将目标目录所有权交给gitlab-runner用户 sudo chown -R gitlab-runner:gitlab-runner /var/www/project-cms.com/html # 若需保留原目录所属用户,可将gitlab-runner加入对应组并开放权限 # sudo usermod -aG [原目录所属组] gitlab-runner # sudo chmod -R g+rw /var/www/project-cms.com/html
二、优化.gitlab-ci.yml脚本
原脚本存在阶段定义过时、依赖安装位置错误、git pull易引发权限问题等缺陷,改用从Runner构建目录直接同步代码的方式更可靠,修改后的脚本如下:
stages: - build - deploy # 构建阶段:在Runner拉取的代码目录安装依赖 build: stage: build only: - master script: - composer install --no-dev --optimize-autoloader # 生产环境建议禁用dev依赖并优化自动加载 # 部署阶段:同步代码到目标服务器目录 deploy: stage: deploy only: - master script: # 可选:同步前停止服务(如nginx/php-fpm)避免文件冲突 # - sudo systemctl stop nginx # 同步代码,排除无需部署的文件/目录 - rsync -av --delete --exclude='.git/' --exclude='.gitlab-ci.yml' $CI_PROJECT_DIR/ /var/www/project-cms.com/html/ # 可选:同步完成后重启服务 # - sudo systemctl start nginx tags: - cms-project # 指定已配置的Runner标签
三、关键说明
$CI_PROJECT_DIR是GitLab CI内置变量,自动指向Runner拉取代码的目录,无需硬编码路径;rsync参数说明:-av:归档模式同步,保留文件权限、时间戳等属性并显示详细日志;--delete:删除目标目录中构建目录不存在的文件,确保代码完全同步;--exclude:过滤无需部署的文件(如.git目录、CI配置文件);
- 若脚本需要sudo权限,编辑
sudo visudo添加一行gitlab-runner ALL=(ALL) NOPASSWD: ALL,或限制到特定命令以提升安全性。
内容的提问来源于stack exchange,提问作者Vinay Mahale
相关产品推荐
相关产品推荐

