You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 00:20:45