当前位置: 首页 > 知识库问答 >
问题:

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

令狐宣
2023-03-14

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

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

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

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

共有3个答案

巩光誉
2023-03-14

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

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

只需包括:它对你的。gitlab ci。yml,然后您可以使用:

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

贲俊才
2023-03-14

举个例子,假设您已经安装了一个具有需求的服务器,并且希望使用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_服务器。私钥是您需要向QA_服务器进行身份验证的密钥(如果您使用私钥)。显然,QA_服务器是您想要部署代码的地址。

用于创建新的变量访问gitlab-

在before_脚本中,我们正在创建和添加ssh密钥,同时我们正在禁用命令行以请求密码<代码>'StrichostKeyChecking 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_服务器”:/var/www/html最后,文件从当前目录复制到/var/www/html

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

江子石
2023-03-14

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

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

 类似资料:
  • 我对AWS Lambda非常陌生,基于我在网上找到的许多例子(阅读无穷无尽的文档),我正在努力理解它的功能。我知道使用这种服务的主要目的是实现一个无服务器架构,通过允许Lambda和API Gateway承担管理您的服务器的角色,该架构是低成本的,并且可能是高效的(所以无服务器并不意味着您不使用服务器,而是该架构为您处理事情)。我将我的研究组织成开发人员在Lambda上部署Flask web应用程

  • 我有一个部署过程,在这个过程中,我将代码签入git存储库,并通过web钩子在生产服务器上运行部署脚本。在该服务器上,我使用ssh和.pem键连接到git,从git拉出,npm安装,构建webpack并重新启动服务进程。 我从来不打算从prod服务器提交任何东西--它们应该能够自动部署。但是,这不起作用,因为文件在运行时经常更新,因此下次部署时,步骤失败,表示我与现有的文件冲突,因为它有未提交的更改

  • 我正在使用Maven将WAR文件部署到AWS。我计划使用'MVN Deploy',这将把war文件ssh到AWS。我关注http://maven.apache.org/plugins/maven-deploy-plugin/examples/deploy-ssh-external.html。 这是我的POM文件 但是当我运行mvn clean deploy时,我收到了这个… 提前谢了。

  • 问题内容: JAX-RS 1.1规范在第6页上说: 如果不存在Application子类,则必须将添加的servlet命名为: 添加的servlet是什么?可以是任意servlet吗? 如果存在Application子类,并且已经定义了一个servlet,该servlet的servlet初始化参数为: 同样,这里的“ servlet”是什么? 如果存在不由现有Servlet处理的Applicati

  • 我正在研究Terraform以及如何使用它来设置AWS环境。到目前为止,我已经有了用3个公共子网、3个私有子网、一个互联网网关和3个Nat网关设置VPC的脚本。然而,我对如何在私有子网中部署和重新部署应用程序感到困惑? 在我的场景中,我们使用Spring Boot构建微服务。我们的想法是转移到一种状态,在这种状态下,我们可以将弹性负载平衡器连接到公共子网,并在私有子网中的自动缩放组中承载我们的应用

  • 我一直在努力研究如何利用BitBucket的Pipelines将我的(Laravel)应用程序自动部署到Vultr Server实例上。 我手动执行以下步骤,我正在尝试自主复制: 我我的更改并到比特桶回购 我使用终端登录我的服务器: 我 到正确的目录: 然后我从我的 BitBucket 存储库: 然后我运行一些命令:,等。 然后我注销: 我的理解是,你可以使用管道来实现自动化,这是真的吗? 到目前