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 访问权限后,您可以使用 rsync
和 scp
等命令将文件复制到您的服务器上。我在另一个 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 方向(拉或推),以及哪些分支被拉或推。还等待管道。
效果很棒。
我正在使用托管 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 访问权限后,您可以使用 rsync
和 scp
等命令将文件复制到您的服务器上。我在另一个 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 方向(拉或推),以及哪些分支被拉或推。还等待管道。
效果很棒。