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

Gitlab CI如何通过SSH部署应用程序,gitlab,gitlab-ci,Gitlab,Gitlab Ci,我使用托管Gitlab来托管我的Git存储库,最近我使用它来构建/部署PHP和Java应用程序到服务器 我想做的是,一旦构建完成,使用SSH部署应用程序。有时,这可能只是通过SSH将最终构建的内容(PHP文件)上载到服务器,或者有时是上载已编译的.jar文件,然后在远程服务器上执行命令以重新启动服务 我已经设置了自己的Docker容器作为构建环境,其中包括Java、PHP、Composer和Maven等构建所需的所有内容。我正在使用此映像运行构建 我想知道的是,我如何通过SSH连接到外部服务器来

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

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

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


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

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


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

作为一个例子,假设您已经安装了一个具有要求的服务器,并且希望使用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
向代理添加ssh密钥

ssh -o StrictHostKeyChecking=no user@"$QA_SERVER" 'rm -rf /var/www/html/*'
不需要:此行使用ssh删除/var/www/html中的任何文件 scp-P22-r。ubuntu@“$QA_服务器”:/var/www/html 最后,将文件从当前目录复制到/var/www/html

请小心使用权限,这取决于要复制的目录


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

这就是我为.gitlab ci.yml编写SSH帮助程序的原因。
你可以在这里查看

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

ssh\u runroot myhostname$MYHOST\u PKEY“touch foo;cp foo bar;ls-al;rm foo bar;ls-al”


使用镜子。在
设置->存储库->镜像存储库下

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

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


非常好。

你能总结一下这篇文章吗?嗨,我已经成功地将jar文件复制到了远程服务器上,但我面临的问题是ssh登录到远程服务器并运行spring应用程序。我尝试了以下
-sshpass-p“pwd”ssh-t-tusr@x.x.x.x“如果存在service.bat(nssm restart spring app&exit)else(echo'java-jar spring-app-1.1.jar'>service.bat)&&nssm安装spring app'C:\Users\user\Documents\gitlab\u ci\spring app\service.bat'&&nssm启动spring app&&exit”
请协助。@Adam Mulvany,恕我直言,第一个链接在用通俗易懂的英语记录原因和方式方面做得非常糟糕。这对我不起作用——我得到并退出状态为1,没有任何解释。我认为人们不应该仅仅为了让GitLab CI/CD做一些简单的事情而被要求开发额外的专业领域。如果我们已经有了一个共享的ssh密钥,可以将东西从服务器推送到Gitlab,那么为什么我们需要做所有这些,让Gitlab发送命令让服务器运行呢?许多部署代码都是基本的文件复制和锁定。谢谢。Johan不清楚私钥是在哪里生成的,相应的公钥存储在哪里?我的猜测是管理员登录到QA_服务器并生成密钥对复制粘贴私钥到gitlab上的private_key变量。@ace这是正确的,首先我们必须按照正常的ssh密钥生成,在服务器上放置public将private复制到gitlab变量。在本教程的视频中,我使用just shh讨论了CI(对于第7分钟后的问题)。关于Gitlab,因为SSH密钥生成与往常一样。
ssh -o StrictHostKeyChecking=no user@"$QA_SERVER" 'rm -rf /var/www/html/*'