使用GitLab自带的CI/CD功能在远程服务器部署项目(三)

前置内容:

通过Docker Compose部署GitLab和GitLab Runner(一)

使用GitLab自带的CI/CD功能在本地部署项目(二)

目录

一、在GitLab服务器上生成私钥与公钥

二、将公钥拷贝到应用服务器上

三、将私钥给到Docker Executor使用

1.在GitLab页面上设置全局的与SSH命令相关的CI/CD变量

2.在GitLab页面上设置全局的阿里云私人镜像仓库相关的CI/CD变量

3.编写.gitlab-ci.yml文件

四、验证

五、总结


要想在GitLab Runner容器中通过Docker Executor将eshop.webapi镜像部署到远程应用服务器上,最关键的步骤就是要能够在Docker Executor内通过ssh命令免密操作应用服务器上的docker进行部署,如下面的结构图所示。

ssh免密的核心就是通过私钥和公钥与想要连接的客户端建立连接,省去了需要用户输入客户端登录密码的步骤。那我们这个案例具体的实现步骤如下:

(1)在GitLab服务器上生成私钥与公钥

(2)将公钥拷贝到应用服务器上,并把公钥内容写入authorized_keys文件

(3)将私钥给到Docker Executor使用

下面将详细展开说明这三个步骤,尤其是步骤三很关键。

一、在GitLab服务器上生成私钥与公钥

在GitLab服务器上执行以下命令,会在/root/.shh/目录下生成两个文件,它们就是私钥 (id_rsa) 与公钥 (id_rsa.pub)文件

ssh-keygen -t rsa

注意:如果之前就已经生成过,就没必要执行这个命令重新生成了,它会覆盖原有的私钥公钥信息,会导致无法连接到曾经免密登录过的其他客户端。

二、将公钥拷贝到应用服务器上

在GitLab服务器上执行以下命令将公钥拷贝到应用服务器上:

scp /root/.ssh/id_rsa.pub root@172.24.142.64:/root/.ssh/id_rsa_gitlab.pub

在应用服务器上执行以下命令,将GitLab服务器的公钥内容写入authorized_keys文件

cat /root/.ssh/id_rsa_gitlab.pub >> /root/.ssh/authorized_keys

在GitLab服务器上执行以下命令,可以发现不用输入用户名密码就可以登录到应用服务器了

ssh 172.24.142.64

三、将私钥给到Docker Executor使用

通过上面两步操作之后,GitLab服务器已经可以使用自己的私钥通过ssh免密登录到应用服务器了。那GitLab Runner容器中的Docker Executor如果能拿到这个私钥,是不是也就能够ssh到应用服务器执行各种操作啦?我将通过以下步骤来实现这个方案:

(1)在GitLab页面上设置全局的与SSH命令相关的CI/CD变量;

(2)在GitLab页面上设置全局的阿里云私人镜像仓库相关的CI/CD变量;

(3)编写.gitlab-ci.yml文件,引用全局的CI/CD变量,将eshop.webapi镜像推送到阿里云私人镜像仓库,ssh到应用服务器从阿里云私人镜像仓库下载镜像并部署该镜像容器。

接下来将详细介绍这些步骤的操作过程。

1.在GitLab页面上设置全局的与SSH命令相关的CI/CD变量

可以参考GitLab官方的ssh key文档:Using SSH keys with GitLab CI/CD | GitLab

(1)将GitLab服务器的私钥内容设置成全局的CI/CD变量

使用以下命令查看私钥内容,然后复制它们

cat /root/.ssh/id_rsa

在GitLab页面上,通过 【Admin Area → Settings → CI/CD → Variables → Expand → Add Variable】菜单路径,执行添加私钥全局变量操作,如图所示:

注意:粘贴私钥内容后,一定要按回车符,添加新行

(2)将应用服务器SSH_KNOWN_HOSTS设置成全局的CI/CD变量

在GitLab服务器上使用以下命令收集应用服务器(IP:172.24.142.64)公钥相关内容,并复制它们:

ssh-keyscan 172.24.142.64

在GitLab页面上,通过 【Admin Area → Settings → CI/CD → Variables → Expand → Add Variable】菜单路径,执行添加SSH_KNOWN_HOSTS全局变量操作,如图所示:

注意:粘贴ssh-keyscan生成的内容后,一定要按回车符,添加新行

(3)将应用服务器IP设置成全局的CI/CD变量

与ssh相关的全局变量添加成功,如图所示:

2.在GitLab页面上设置全局的阿里云私人镜像仓库相关的CI/CD变量

如何使用阿里云私人镜像仓库,网上资料非常多,请大家自行学习,本篇文章不作介绍。假设你已经有了自己的阿里云私人镜像仓库,那么需要设置成全局变量的无非就是镜像仓库名称、用户名、密码,使用上述的方法:在GitLab页面上,通过 【Admin Area → Settings → CI/CD → Variables → Expand → Add Variable】菜单路径,继续添加这些全局变量,如图所示:

当然,读者可以试着使用其他云厂商镜像仓库(腾讯云,华为云等),也可以尝试使用私有部署的Harbor镜像仓库。

3.编写.gitlab-ci.yml文件

我们已经添加了6个全局的CI/CD变量:

重新修改上一篇文章介绍的使用.Net8开发的EShop.WebApi项目的.gitlab-ci.yml文件内容,文件中将会使用到上面定义的6个全局变量,如下:

stages:- build- deployvariables:## 镜像版本号      Docker_ImageTag: "latest"## 镜像名称Docker_Image: "eshop.webapi:$Docker_ImageTag" ## 阿里云镜像名称Ali_Docker_Image: "$Ali_Docker_Registry/eshop/$Docker_Image"build:stage: buildscript:## 构建镜像  - docker build -f "./EShop.WebApi/Dockerfile" -t $Docker_Image .## 将镜像标记为阿里云镜像名称- docker tag $Docker_Image $Ali_Docker_Image## 登录阿里云私人镜像仓库- docker login -u $Ali_Docker_UserName --password "$Ali_Docker_Password" $Ali_Docker_Registry## 将镜像推送到阿里云镜像仓库- docker push $Ali_Docker_Imageonly:- main  deploy:stage: deploybefore_script:## 安装ssh-agent- 'command -v ssh-agent >/dev/null || ( apt-get update -y && apt-get install openssh-client -y )'- eval $(ssh-agent -s)## 将GitLab服务器私钥添加到ssh-agent代理中- chmod 400 "$SSH_PRIVATE_KEY"- ssh-add "$SSH_PRIVATE_KEY"## 创建~/.ssh目录- mkdir -p ~/.ssh- chmod 700 ~/.ssh## 创建SSH_KNOWN_HOSTS- cp "$SSH_KNOWN_HOSTS" ~/.ssh/known_hosts- chmod 644 ~/.ssh/known_hostsscript:## 使用ssh免密登录应用服务器,执行部署eshop.webapi容器命令- ssh -t $ESHOP_SERVER_IP "(docker stop EShop.WebApi && docker rm EShop.WebApi || echo 'Container EShop.WebApi not found, skipping removal.') && docker login -u $Ali_Docker_UserName --password "$Ali_Docker_Password" $Ali_Docker_Registry && docker run -d --name EShop.WebApi -p 9527:80 $Ali_Docker_Image"only:- main

在.gitlab-ci.yml文件中我们通过ssh登录到应用服务器,然后使用docker命令进行部署,当然也可以使用docker compose命令部署,甚至可以使用k8s来部署,以后有机会将继续介绍如何通过k8s来部署。

关于ssh-agent的知识,可以参考这篇文章:了解ssh代理:ssh-agent_eval ssh-agent-CSDN博客

四、验证

在GitLab的EShopWebApi仓库页面手动执行Pipeline:

Pipeline执行成功之后,可以看到镜像已经推送到了阿里云镜像仓库:

并且应用服务器上已经部署了eshop.webapi容器:

在浏览器上输入接口地址:http://172.24.142.64:9527/WeatherForecast,可以看到返回的信息:

至此,通过GitLab自带的CI/CD实现远程服务器部署应用大功告成!

五、总结

远程部署的核心在于能够使用ssh命令免密登录到应用服务器执行部署命令。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/9759.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入解析Java中Set接口

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一…

静态工厂模式

静态工厂类替代构造方法 Boolean bBoolean.valueOf(true); 名字易于理解; 可以实现多态; 可以共享对象; jdbc的获得连接的操作也是静态工厂类,将实现交给了具体的数据库,解耦 DriverManager.getConnection(url,user,p…

Java面试题:描述一下Java中的堆内存是如何划分的,并解释每个区域的作用

在Java虚拟机(JVM)中,堆内存是用于存储对象实例的区域,它在JVM启动时被创建。堆内存的划分方式和每个区域的作用如下: 年轻代(Young Generation): Eden区:大多数对象首先…

Redis缓存篇

1.1 缓存击穿 缓存击穿跟缓存雪崩有点类似,缓存雪崩是大规模的key失效,而缓存击穿是某个热点的key失效,大并发集中对其进行请求,就会造成大量请求读缓存没读到数据,从而导致高并发访问数据库,引起数据库压…

web页面与原生android通信,调用原生android方法

注册初始化方法JsBridge //JS注册事件监听 function connectWebViewJavascriptBridge(callback) {if (window.WebViewJavascriptBridge) {callback(WebViewJavascriptBridge)} else {document.addEventListener(WebViewJavascriptBridgeReady,function() {callback(WebViewJav…

数据驱动实战二

目标 掌握数据驱动的开发流程掌握如何读取JSON数据文件巩固PO模式 1. 案例 对TPshop网站的登录模块进行单元测试 1.1 实现步骤 编写测试用例采用PO模式的分层思想对页面进行封装编写测试脚本定义数据文件,实现参数化 1.2 用例设计 1.3 数据文件 {"login…

设置LCD为第二终端

我一直使用xshell端,开发板通过串口和 xshell进行通信。 调试好LCD 驱动之后,可以设置 LCD 作为终端,也就是开发板使用自己的显示 设备作为自己的终端,然后接上键盘就可以直接在开发板上敲命令了,将 LCD 设置为终端控制…

IK分词器:深入了解中文分词的神兵利器

IK分词器:深入了解中文分词的神兵利器 文章目录 IK分词器:深入了解中文分词的神兵利器前言一、IK分词器简介二、IK分词器的工作原理三、IK分词器的特点四、IK分词器的应用场景 🌈你好呀!我是 山顶风景独好 💝欢迎来到我…

CPU探索:解密中央处理器的奥秘

前言 作为计算机的核心组件之一,CPU(Central Processing Unit,中央处理器)在计算机系统中扮演着至关重要的角色。本文将带您深入了解CPU的基本原理、组成结构、不同类型以及未来的发展趋势。 1.CPU的基本原理 CPU是计算机中的“…

(贪心05) 无重叠区间 划分字母区间 合并区间

一、无重叠区间 力扣第435题 第一种方法: 个人思路: 按照区间左边界排序,然后从左开始遍历,每遍历到一个区间就要保证该区间之前的集合为不重叠区间(贪心,局部最优解)。 难点在于如何把新遍历…

人民币数字和中文汉字转换

在PHP中,将人民币的中文汉字金额转换为数字,或者将数字转换为人民币的中文汉字金额,通常需要自定义一些函数来实现这一转换过程。下面分别给出这两个转换的示例代码。 数字转人民币中文汉字 function numberToChinese($num) { $cnNums arr…

Linux(利用gdb进行调试)

gdb: gdb是GNU debugger的缩写,是编程调试工具。 gdb功能 1.启动程序,可以按照用户自定义的要求随心所欲的运行程序。 2.让被调试的程序在用户所指定的调试的断点处停住 (断点可以是条件表达式)。 3.当程序停住时,可以检查此时程序中所发…

基于torch_dispatch机制生成Megatron-DeepSpeed调用关系图

基于torch_dispatch机制生成Megatron-DeepSpeed调用关系图 一.局部效果图二.运行训练过程,拦截算子,生成调用关系信息三.可视化,生成SVG图像 想知道Megatron-DeepSpeed训练过程中各模块之间的调用关系。torch_dispatch机制可以拦截算子,inspect又能获取到调用栈(文件,类名,函数…

笔记本电脑怎么查看硬盘型号?无需额外软件,五招让你轻松掌握

随着科技的进步,笔记本电脑已经成为我们日常生活和工作中不可或缺的工具。而在选购或维护笔记本电脑时,了解硬盘的型号和性能是至关重要的。本文以windows10系统为例,将向您介绍几招,帮助您轻松掌握查看笔记本电脑硬盘型号的方法。…

适合年轻人的恋爱交友脱单软件有哪些?中国十大社交软件排行榜分享

交友始祖:Tinder 一直很受欢迎,可以向上扫给 super like (每日有一次免费机会)。如果双方互相 like,代表配对成功,就可以开始聊天。另外,每日有 10 个 top picks 供选择,你可以免费选一位 主力编外&#xf…

博士阶段应该搞什么:-人才引进要求

目录 专利,高水平论文(一作),技能证书,职称,高端竞赛,科研成果奖 济宁学院

Java医院绩效考核系统源码maven+Visual Studio Code一体化人力资源saas平台系统源码

Java医院绩效考核系统源码mavenVisual Studio Code一体化人力资源saas平台系统源码 医院绩效解决方案包括医院绩效管理(BSC)、综合奖金核算(RBRVS),涵盖从绩效方案的咨询与定制、数据采集、绩效考核及反馈、绩效奖金核…

67万英语单词学习词典ACCESS\EXCEL数据库

这似乎是最多记录的英语单词学习词典,包含复数、过去分词等形式的单词。是一个针对想考级的人员辅助背单词学英语必备的数据,具体请自行查阅以下的相关截图。 有了数据才能想方设法做好产品,结合权威的记忆理论,充分调动用户的眼…

4.Spring Security重要接口

当什么都没有配置的时候,账号和密码是由spring security自定义生成的。在实际项目中账号和密码都是从数据库中查询出来的。所以要通过自定义逻辑控制认证逻辑。 UserDetailService 接口 1.创建类继承UsernamePasswordAuthenticationFilter,重写三个方法&#xff1…

Cocos creator实现《战机长空》关卡本地存储功能

Cocos creator实现《战机长空》关卡本地存储功能 Cocos creator在开放小游戏过程中,经常会出现设置关卡,这里记录一下关卡数据本地存储功能。 一、关卡设置数据 假如我们有关卡数据如下, let settings [ { level: 1, // 第1关 score: 0,…