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

Gitlab CI how to deploy an application via SSH

我正在使用托管 Gitlab 来托管我的 Git 存储库,最近我一直在使用它来 build/deploy PHP 和 Java 应用到服务器。

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

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

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

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

获得 SSH 访问权限后,您可以使用 rsyncscp 等命令将文件复制到您的服务器上。我在另一个 post here 中找到了这方面的示例,您可以将其用作参考。

举个例子,假设您有一台已安装要求的服务器,并且您想要使用 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 是您要部署代码的地址。

For creating new variable access 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

Be careful with permissions, it depends of the directory you want to copy.

在 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"

使用镜子。 Settings -> Repository -> Mirroring Repositories.

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

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

效果很棒。