Gitlab CI 如何部署最新到特定目录

Gitlab CI how to deploy the latest to a specific directory

我在 Gitlab 中有两个项目,其中一个是另一个的子模块(我们称之为 repo "frontend-templates")(我们称之为 repo "main")。我已经为 "frontend-templates" 仓库设置了一个 Gitlab CI 构建。问题是我不需要测试或构建。我只需要在需要的目录中为此 CI 进行部署。所以,我为"frontend-templates"项目注册了一个运行ner,并在根目录下添加了.gitlab-ci.yml:

job_main:
   type: deploy
   script: echo "Do nothing"

当我推送到我的存储库时,运行ner 将最新的提交提取到以下目录:

/home/gitlab-runner/builds/6231b425/0/Gasimzada/frontend-templates

并且只有 运行s echo "Do nothing".

现在,我希望 运行 人员将 "tested" 提交部署到开发服务器,它位于:

/var/www/myapp/submodules/frontend-templates

编辑:我将脚本更改为

script: cd /var/www/myapp/submodules/frontend-templates && git pull

但我收到一条错误消息:

cannot open /var/www/myapp/.git/modules/submodules/frontend-templates/FETCH_HEAD: Permission denied

这是有道理的,因为 gitlab-运行ner 用户无权访问 /var/www/myapp 中的任何目录,但这对我来说是个问题,因为我想 运行 gulp 部署后,它会在从远程存储库拉取后编译必要的脚本。

dev环境的根目录要不要给权限?或者还有其他方法吗?

您可以简单地使用您所在的目录执行某种形式的部署。您可以 rename/delete 当前部署代码的目录,然后将签出代码复制到那里 (rm -rf /var/www/myapp/submodules/frontend-templates && cp -r . /var/www/myapp/submodules/frontend-templates) 或者您可以使用 rsync 进行同步。

但是,这些不是原子操作 - 它们会使您部署的代码在执行时处于不确定状态,如果失败则一团糟。我建议您的 /var/www/myapp/submodules/frontend-templates 只是指向包含代码的目录的符号链接:

/var/www/myapp/submodules
  | - 7348110b
  | - a03ed59a
  | - frontend-templates -> ./a03ed59a

您可以根据提交哈希命名代码目录。作业本身可能看起来像这样:

job_main:
   type: deploy
   script:
     - cp -r . /var/www/myapp/submodules/$CI_BUILD_REF
     - ln -s ./$CI_BUILD_REF /var/www/myapp/submodules/templink
     - mv -Tf /var/www/myapp/submodules/templink /var/www/myapp/submodules/frontend-templates

注意:显然,运行程序需要必要的文件权限才能执行任务。