使用 Gitlab CI 将每个构建部署到服务器
Posted
技术标签:
【中文标题】使用 Gitlab CI 将每个构建部署到服务器【英文标题】:Deploy every build to a server using Gitlab CI 【发布时间】:2016-02-19 12:12:27 【问题描述】:我已经建立了自己的 Gitlab 服务器,其中包含一个项目和一个为其配置的 Gitlab 运行器。我是持续集成服务器的新手,因此不知道如何完成以下操作。
每次我提交到项目的主分支时,我都想将存储库部署到另一台服务器并在那里运行两个 shell 命令(npm install
和forever restartall
)
我该怎么做?我是否也需要在项目部署到的机器上安装一个跑步者?
【问题讨论】:
【参考方案1】:您可以使用 gitlab-ci 和 gitlab-runner [runners.ssh] 部署到单个或多个服务器。
流程:
(git_project with yml file) --> (gitlab && gitlab-ci) --> (gitlabrunner) ---runners.ssh---> (deployed_server,[deploye_server2])
您需要在 gitlab-ci 上注册 gitlab-runner 并将标签设置为 delpoyServer on gitlab web 。 /etc/gitlab-runner/config.toml:
[[runners]]
url = "http://your.gitlab.server/ci"
token = "1ba879596cf3ff778ee744e6decedd"
name = "deployServer1"
limit = 1
executor = "ssh"
builds_dir = "/data/git_build"
[runners.ssh]
user = "you_user_name"
host = "$the_destionation_of_deployServer_IP1"
port = "22"
identity_file = "/home/you_user_name/.ssh/id_rsa"
[[runners]]
url = "http://your.gitlab.server/ci"
token = "1ba879596cf3ff778ee744e6decedd"
name = "deployServer2"
limit = 1
executor = "ssh"
builds_dir = "/data/git_build"
[runners.ssh]
user = "you_user_name"
host = "$the_destionation_of_deployServer_IP2"
port = "22"
identity_file = "/home/you_user_name/.ssh/id_rsa"
runner.ssh 表示,runner 将登录到$the_destionation_of_deployServer_IP1
和$the_destionation_of_deployServer_IP2
,然后将项目克隆到builds_dir
。
写入 yml 文件 例如: .gitlab-ci.yml
job_deploy:
stage: deploy
tags: delpoyServer1
script:
- npm install && forever restartall
job_deploy:
stage: deploy
tags: delpoyServer2
script:
- npm install && forever restartall
将你的 gitlab-runner 设置为 delpoyServer1
和 delpoyServer2
tags in 'http://your.gitlab.server/ci/admin/runners'
.gitlab-ci.yml
文件,选择一个带有标签的运行器:deployServer1
或deployServer2
;
带有 deployServer1 标签的 gitlab-runner
将使用 ssh 登录到 $the_destionation_of_deployServer_IP1
和 $the_destionation_of_deployServer_IP2
,将项目克隆到 builds_dir
,然后执行您的脚本:npm install && forever restartall。
链接:
gitlab-runner register runners.ssh【讨论】:
嗨!使用 ssh 执行程序,运行程序将使用部署密钥?我总是遇到同样的错误:gitlab-ci-multi-runner 1.3.3 (6220bd5) 警告:选定的执行程序和 shell 不支持图像 警告:选定的执行程序和 shell 不支持服务使用 SSH 执行程序...错误:构建失败:打开/home/user/.ssh/id_rsa:没有这样的文件或目录 是的,您应该使用您的 ssh 私钥的真实路径配置您的 ssh 密钥文件(例如:/home/change_me/.ssh/id_rsa
。在此之前,您必须将公钥内容附加到运行器中的~/.ssh/authorized_keys
文件服务器的。ssh 密钥在运行服务器和部署服务器之间:(private ssh key in runner server) --> (deploy servers with ssh public key)
感谢您的帮助,非常有帮助。现在它工作了:) 但是对于我的跑步者工作来说,我删除了这条线identity_file = "/home/user_name/.ssh/id_rsa"
。当我输入前一行时,运行器不起作用并显示相同的错误消息,在我的/etc/ssh/sshd_config
文件中我输入了AuthorizedKeysFile /home/user_name/.ssh/authorized_keys
和HostKey /home/user_name/.shh/id_rsa
。为什么跑步者不使用身份文件?我做错了什么?
简而言之,我们必须通过某种方式让运行器连接到部署服务器。在这种情况下,我们使用 ssh-path。如果您的跑步者在删除 identify_file 时工作正常,您是否配置了密码?您可以从(链接)[gitlab.com/gitlab-org/gitlab-ci-multi-runner/blob/master/docs/….如果没有,除非您显示 CI 服务器的拓扑结构和配置,否则我真的无法理解。
感谢您的回答。对于第一次部署,它运行 npm install 并永远启动 OK。但是一旦我做了一个新的提交,CI 部署并且我得到了一个错误failed to remove node_modules/...
。你知道我的情况吗?【参考方案2】:
您应该能够使用gitlab-ci.yml documentation 将单独的build
阶段添加到您的.gitlab-ci.yml
文件中。
您将需要某种部署服务(如 capistrano
或类似服务),或启动部署的 webhook。
即类似:
---
stages:
- test
- deploy
job_runtests:
stage: test
script:
- npm test
job_deploy:
stage: deploy
script:
- curl -X POST https://deploymentservice.io/?key=
Gitlab CI 将遍历它找到的每个阶段,按顺序运行它们。如果一个阶段过去了,那么它就会进入下一个阶段。
不幸的是,Gitlab CI 不能直接进行部署(尽管您可以安装 dpl
Ruby Gem 并在您的 .gitlab-ci.yml
文件中调用它,如下所示:
job_deploy:
- gem install dpl
- dpl --provider=heroku --app=my-app-staging --api-key=$HEROKU_STAGING_API_KEY
only:
- master
例如)
【讨论】:
我有一个问题,--api-key 已附加到我在 heroku 中的帐户,所以如果我在 gitlab 中有一个开源项目,任何人都可以部署到我的 heroku 服务器。如何确保只有我的 gitlab.ci 可以使用我的 api-key 进行部署? 您可以在 Gitlab 设置中添加私有项目变量 - 保留 .gitlab-ci.yml 文件以引用(字面意思)$HEROKU_STAGING_API_KEY
,然后在设置 -> CI/CD 中为您的项目添加一个受保护的环境变量。以上是关于使用 Gitlab CI 将每个构建部署到服务器的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 AWS CodeDeploy/CodePipeline/S3 将 Gitlab-Ci 部署到 EC2
1.GitLab和Jenkins 结合构建持续集成(CI)环境