Gitlab CI如何通过SSH部署应用程序

She*_*tal 20 gitlab gitlab-ci

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

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

我已经将自己的Docker容器设置为构建环境,这包括Java,PHP,Composer和Maven等所有构建完成所需的东西.我正在使用此图像来运行构建.

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

小智 32

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

一旦你有SSH访问,你可以再使用命令,如rsyncscp复制文件到您的服务器.我在这里的另一篇文章中找到了一个例子,您可以将其作为参考.

请让我知道你怎么走.

谢谢,

亚当

服务工程师@ Gitlab

  • 如果页面出现故障,您可以在这里总结一下吗? (2认同)

Xav*_*r D 6

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

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

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

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


小智 5

举例来说,假设您有一台已经安装了需求的服务器,并且想使用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
Run Code Online (Sandbox Code Playgroud)

首先,在此示例中,我们使用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")
Run Code Online (Sandbox Code Playgroud)

将ssh密钥添加到代理。

ssh -o StrictHostKeyChecking=no user@"$QA_SERVER" 'rm -rf /var/www/html/*'
Run Code Online (Sandbox Code Playgroud)

不需要:此行使用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变量中。 (2认同)