使用Gitlab CI将每个构建部署到服务器

26

我已经搭建好了自己的Gitlab服务器,其中有一个项目和为其配置好的Gitlab runner。由于我不熟悉持续集成服务器,因此不知道如何完成以下操作:

每次我提交到项目的主分支时,我想将仓库部署到另一台服务器并在那里运行两个shell命令 (npm installforever restartall)。

我该怎么做?我需要在部署项目的机器上也安装一个runner吗?

2个回答

34

您可以使用gitlab-ci和gitlab-runner [runners.ssh]将应用部署到单个或多个服务器。

具体流程如下:

(git_project with yml file)  --> (gitlab && gitlab-ci) --> (gitlabrunner) ---runners.ssh---> (deployed_server,[deploye_server2])
  1. 你需要将gitlab-runner注册到gitlab-ci,并在gitlab网站上设置标签为delpoyServer。 /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

  1. 编写 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 设置为 'deployServer1' 和 'deployServer2' 标签,并在 'http://your.gitlab.server/ci/admin/runners' 中配置。

    • 当您将代码推送到 GitLab 时,GitLab CI 服务器会解析您项目中的 .gitlab-ci.yml 文件,选择一个带有标签 "deployServer1" 或 "deployServer2" 的 Runner;
    • 具有 "deployServer1" 标签的 gitlab-runner 将使用 SSH 登录到 ${the_destionation_of_deployServer_IP1}${the_destionation_of_deployServer_IP2},将项目克隆到 builds_dir ,然后执行您的脚本:npm install && forever restartall。
  • 链接:


    嗨!使用ssh执行程序,runner会使用部署密钥吗?我总是得到相同的错误:gitlab-ci-multi-runner 1.3.3 (6220bd5)警告:镜像不受所选执行程序和shell支持警告:服务不受所选执行程序和shell支持使用SSH执行程序...错误:构建失败:打开/home/user/.ssh/id_rsa:没有那个文件或目录 - MMax
    1
    是的,您应该使用实际的ssh私钥路径(例如:/home/change_me/.ssh/id_rsa)配置ssh密钥文件。在此之前,您必须将公钥内容附加到运行服务器的~/.ssh/authorized_keys文件中。 ssh密钥位于运行服务器和部署服务器之间: (运行服务器中的私有ssh密钥) --> (带有ssh公钥的部署服务器) - michael
    谢谢您的帮助,非常有用。现在它正在工作 :) 但是为了使我的运行程序正常工作,我删除了这一行 identity_file = "/home/user_name/.ssh/id_rsa"。当我加上之前的那一行时,运行程序就无法工作并显示相同的错误消息,在我的 /etc/ssh/sshd_config 文件中,我放置了 AuthorizedKeysFile /home/user_name/.ssh/authorized_keysHostKey /home/user_name/.shh/id_rsa。为什么运行程序不使用 identity_file?我做错了什么吗? - MMax
    简而言之,我们必须以某种方式使运行程序连接到部署服务器。在这种情况下,我们使用ssh-path。如果您的运行程序在删除identify_file后正常工作,那么您是否配置了密码?您可以从链接中获取详细信息[https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/blob/master/docs/configuration/advanced-configuration.md]。如果没有,除非您展示CI服务器拓扑和配置,否则我真的无法理解。 - michael
    谢谢你的回答。第一次部署时,运行npm install和forever start都没问题。但是一旦我提交了新的代码,CI就会进行部署,然后我就会收到一个错误信息“无法删除node_modules/...”。你对我的情况有什么想法吗? - Nguyen Tran

    23
    你应该能够使用gitlab-ci.yml文档,将一个独立的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 进行部署? - Cynthia Sanchez
    您可以在Gitlab设置中添加私有项目变量 - 留下.gitlab-ci.yml文件以引用(字面上)$HEROKU_STAGING_API_KEY,然后在项目的“设置”->“CI/CD”中添加受保护的环境变量。 - Alex

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接