【问题标题】:Gitlab CI how to deploy an application via SSHGitlab CI 如何通过 SSH 部署应用程序
【发布时间】:2017-07-29 07:38:10
【问题描述】:

我正在使用 Hosted Gitlab 来托管我的 Git 存储库,最近我一直在使用它来构建/部署 PHP 和 Java 应用程序到服务器。

我想做的是在构建完成后,使用 SSH 部署应用程序。有时这可能只是通过 SSH 将最终构建的内容(PHP 文件)上传到服务器,或者有时它可能是上传已编译的 .jar 文件,然后在远程服务器上执行命令以重新启动服务。

我已经将自己的 Docker 容器设置为构建环境,其中包括 Java、PHP、Composer 和 Maven 等我完成构建所需的所有内容。我正在使用此映像来运行构建。

我想知道的是,如何通过 SSH 连接到外部服务器以执行我可以在 gitlab-ci.yaml 文件中指定的部署命令?

【问题讨论】:

    标签: gitlab gitlab-ci


    【解决方案1】:

    在 gitlab.com 上处理 ssh 并不简单。

    这就是我为 .gitlab-ci.yml 编写 SSH 助手的原因。
    你可以在这里查看https://gitlab.com/gitlab-cd/ssh-template

    只需 include: 将其添加到您的 .gitlab-ci.yml 中,然后您就可以使用:

    ssh_run root myhostname $MYHOST_PKEY "touch foo; cp foo bar; ls -al; rm foo bar; ls -al"

    【讨论】:

      【解决方案2】:

      使用镜子。在Settings -> Repository -> Mirroring Repositories下。

      它会生成一个 ssh 公钥,您应该将其放置在您的服务器上。

      您可以选择方向(拉或推),以及哪些分支被拉或推。也等待管道。

      效果很好。

      【讨论】:

      • 这太棒了,谢谢你。另一个优点是它不会在 Gitlab 管道上使用任何时间。
      【解决方案3】:

      您可以将 SSH 密钥作为秘密变量存储在 gitlab-ci.yaml 中,并在构建期间使用它来执行 SSH 命令,有关更多详细信息,请参阅我们的文档 here

      一旦您拥有 SSH 访问权限,您就可以使用诸如 rsyncscp 之类的命令将文件复制到您的服务器上。我在另一篇帖子here 中找到了一个示例,您可以将其用作参考。

      【讨论】:

      • 你能不能在这里总结一下帖子,以防页面崩溃?
      • 嗨,我已经设法将我的 jar 文件复制到我的远程服务器,但我面临的问题是 ssh 登录到远程服务器并运行 spring 应用程序。我尝试了以下- sshpass -p "pwd" ssh -t -t usr@x.x.x.x "if exist service.bat ( nssm restart spring-app & exit ) else ( echo 'java -jar spring-app-1.1.jar' > service.bat ) && nssm install spring-app 'C:\Users\user\Documents\gitlab_ci\spring-app\service.bat' && nssm start spring-app && exit"请协助。
      • @Adam-Mulvany,恕我直言,第一个链接在用简单的英语记录 WHY 和 HOW 方面做得非常糟糕。它对我不起作用——我得到并退出状态 1 没有任何解释。我认为不应该要求人们仅仅为了让 GitLab CI/CD 做一些简单的事情而开发额外的专业领域。如果我们已经有一个共享的 ssh 密钥来将服务器上的东西推送到 Gitlab,为什么我们需要做这一切只是为了让 Gitlab 发送命令让我们的服务器运行?许多部署代码是文件的基本复制和锁定。谢谢。
      【解决方案4】:

      举个例子,假设您有一个已经安装了需求的服务器,并且您想使用 ssh 部署到该服务器。

      image: ubuntu:latest
      stages:
        - deploy
      deploy_QA:
        stage: deploy
        environment: 
          name: Staging
          url: "$QA_URL"
        before_script:
        - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
        - mkdir -p ~/.ssh
        - eval $(ssh-agent -s)
        - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
        script:
          - ssh-add <(echo "$PRIVATE_KEY")
          - ssh -o StrictHostKeyChecking=no user@"$QA_SERVER" 'rm -rf /var/www/html/*'
          - scp -P22 -r . ubuntu@"$QA_SERVER":/var/www/html
      

      首先,在这个例子中,我们使用的是 ubuntu 镜像。另请注意,我们正在使用一些 gitlab 秘密变量。 $QA_URL、$PRIVATE_KEY、$DB_CONNECTION、$QA_SERVER。 重要的是 $PRIVATE_KEY 和 QA_SERVER。私钥是您需要通过 QA_SERVER 进行身份验证的密钥(如果您使用的是私钥)。显然 QA_SERVER 是您要部署代码的地址。

      用于创建新变量访问 gitlab->settings->CI/CD。



      在 before_script 我们正在做的是创建和添加 ssh 密钥,我们也禁用命令行来询问密码。 'StrictHostKeyChecking no'

      ssh-add <(echo "$PRIVATE_KEY")
      

      为代理添加 ssh 密钥。

      ssh -o StrictHostKeyChecking=no user@"$QA_SERVER" 'rm -rf /var/www/html/*'
      

      不需要:此行使用 ssh 删除 /var/www/html 中的任何文件 scp -P22 -r 。 ubuntu@"$QA_SERVER":/var/www/html 最后,将文件从当前目录复制到 /var/www/html

      注意权限,这取决于你要复制的目录。

      【讨论】:

      • 约翰不清楚 PRIVATE_KEY 的生成位置以及相应的 PUBLIC KEY 存储在哪里?我的猜测是管理员登录到 QA_SERVER 并生成密钥对,将私钥复制粘贴到 gitlab 上的 PRIVATE_KEY 变量中。
      • @ace 没错,首先我们必须按照正常的 ssh 密钥生成,将 public 放在服务器上,将 private 复制到 gitlab 变量中。在我的教程视频中,我只使用 shh Gitlab CI/CD Tutorial, Pain SSH 谈论 CI(对于第 7 分钟后的这个问题)。关于 Gitlab,因为 SSH 密钥生成与往常一样。
      猜你喜欢
      • 1970-01-01
      • 2017-05-21
      • 2018-07-25
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-22
      • 1970-01-01
      相关资源
      最近更新 更多