2

我想将新工作从我的 Gitlab 存储库自动部署到在生产服务器上运行的实时网站。实时网站是live分支的 GIT 回购克隆。

我的问题:

  • 每次“构建”发生时,跑步者似乎都将我的回购重新克隆到~/builds/.... 这是强制性行为吗?我想我真正想要的只是git pull在我的生产网站目录中。

  • 如果它真的必须每次都克隆 repo,为什么不git reset呢?至少这会随着时间的推移节省大量带宽,不是吗?

  • 如何运行deploy.sh存储库根目录中的哪个?我目前在我的 gitlab.com 构建信息中收到此错误:bash: line 23: deploy.sh: command not found

我的.gitlab-ci.yml文件:

deploy_to_production:
  script:
    - deploy.sh
  only:
    - live
  tags:
    - prod

细节

为此,我想deploy.sh在生产服务器上运行一个简单的 shell 脚本,每当我推送到我的 repo 的特定分支(live在我的例子中是分支)时。这个 shell 脚本在我的 GIT 存储库中,与我的.gitlab-ci.yml.

该脚本基本上只是执行git reset,fetchpull,使生产版本与存储库中的内容保持同步。

我在我的服务器上安装了一个“shell”多运行器,并将其连接到 gitlab.com,在那里我可以看到它处于活动状态。

总的来说,我是在叫错树吗?我是否应该更改我的deploy.sh,以便它不会对新工作进行 git checkout,而是使用cp或者可能rsync将新代码从生产网站移动~/builds/...到生产网站?

4

1 回答 1

4

问:克隆是强制行为吗?

据我所知,这是因为假设是在构建过程中您使用代码。

如果这不是您的情况,并且您只想“告诉生产服务器”从您的存储库中提取代码,那么也许您可以采取不同的方法并改用webhook。GitLab 会向您的服务器发出 HTTP 请求,并以 JSON 格式传递有关事件(推送、合并等)的信息。接收脚本然后会解析它并决定是否执行 git pull。

如果您在部署之前的构建过程中确实有其他任务要对代码执行,那么可以,更改策略并使用运行程序已经为您签出的代码。我可能会尝试以某种方式使更改原子化(rsync 到实时目录中会使您的应用程序在运行时处于某种不确定状态,如果由于某种原因失败则处于混乱状态),例如通过将实时代码放在符号链接的目录。然后,部署脚本会将新代码目录复制到其最终目的地,进行任何必要的调整并将符号链接的目标从旧的实时目录更改为新目录。

Q:如果真的每次都要clone repo,为什么不git reset呢?

对于开发人员来说,这更像是一个问题。其他人的回答只是猜测。

问:如何运行存储库根目录中的 deploy.sh?

如果deploy.sh脚本设置了可执行位,则使用./deploy.sh,否则使用bash deploy.sh

于 2016-05-16T09:31:31.870 回答