使用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
  - deploy


variables:
  ## 镜像版本号      
  Docker_ImageTag: "latest"


  ## 镜像名称
  Docker_Image: "eshop.webapi:$Docker_ImageTag" 


  ## 阿里云镜像名称
  Ali_Docker_Image: "$Ali_Docker_Registry/eshop/$Docker_Image"


build:
  stage: build
  script:
    ## 构建镜像  
    - 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_Image
  only:
    - main  



deploy:
  stage: deploy
  before_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_hosts


  script:
    ## 使用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命令免密登录到应用服务器执行部署命令。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows系统下通过nginx配置多项目

文章目录 前言大概思路实际操作记录:查看nginx 错误日志问下AI注意点: 当访问域名根路径时,重定向到/pc总结 前言 在windows电脑启动一个nginx 测试配置多前端项目,一个pc端(vue3tsvite ,history路由&…

Vue3专栏项目 -- 二、自定义From组件(下)

需求分析: 现在我们还需要一个整体的表单在单击某个按钮的时候可以循环的验证每个input的值,最后我们还需要有一个事件可以得到最后验证的结果,从而进行下一步的操作 如下,我们应该有一个form表单包裹着全部的input表单&#xf…

【C语言】整数和浮点数在内存中的存储

大家可能在学习的时候会经常疑惑数据在内存中是怎样存储的,今天用一篇博客给你讲清楚!!!从此不再疑惑!!! 文章目录 1. 整数在内存中的存储2. 大小端字节序和字节序判断2.1 什么是大小端2.2 为什…

[VulnHub靶机渗透] Hackademic: RTB1

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收…

day2_greedyIntervalsLRU/LFU

二、贪心算法之区间调度问题 0.计算一个区间集合中无重复的区间的最大数量(模板) public int intervalSchedule(int[][] intvs) {if (intvs.length 0) return 0;// 按 end 升序排序Arrays.sort(intvs, (a, b) -> Integer.compare(a[1], b[1]));// 至少有一个区间不相交in…

Baidu Comate 编程插件:提升开发效率的利器

文章目录 引言简介目的 Baidu Comate插件概述定义与功能市场现状竞品分析 安装与配置VsCode 安装:注意事项 版本选择 核心特性详解功能介绍代码生成实时续写错误纠正 使用体验体验地址 引言 简介 基于文心大模型,结合百度积累多年的编程现场大数据和外…

专业做护眼灯的有哪些品牌?几款专业儿童卧室灯品牌分享

在当今时代,我们观察到一个不容忽视的现象:孩子们的视力问题日益增多,这无疑向众多家长发出了警示。它提醒着我们,除了追求学术成就之外,孩子们的视觉健康同样重要,不容忽视。因此,选择一款适合…

leetcode刷题:对称二叉树

题目: 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true 示例 2: 输入:root [1,2,2,null,3,null,3] 输出:false 提示&#xf…

以导航产品为核心,东软想为车企扫除出海障碍

得益于新能源汽车领域多年的布局,以及在汽车智能化方面的先发优势,近年来,中国汽车品牌在质与量上都得到了极大提升,并带来强大的竞争力。 据海关总署公布的数据,过去三年,中国汽车出口规模连续突破式发展…

LeetCode算法题:7. 整数反转

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1] ,就返回 0。 假设环境不允许存储 64 位整数(有符号或无符号)。 示例 1: 输…

会赚钱的人都在做这件事:你了解吗?

在我们日常生活的点滴中,以及在各种场合的交互中,利他思维始终扮演着不可或缺的角色。当我们追求合作与共赢时,单方面的自我立场显然是不够的,真正的关键在于换位思考,寻找并满足对方的需求。 互利互赢的核心理念正是利…

【挑战30天首通《谷粒商城》】-【第一天】【10 番外篇】 解决docker 仓库无法访问 + MobaXterm连接VirtualBox虚拟机

文章目录 课程介绍 1、解决docker 仓库无法访问 2、 MobaXterm连接VirtualBox虚拟机 Stage 1:下载MobaXterm选择适合你的版本 Stage 2:vagrant ssh 连接,开启ssh访问 Stage 2-1:su获取root账号权限,输入密码(默认vagra…

纯血鸿蒙APP实战开发——阅读翻页方式案例

介绍 本示例展示手机阅读时左右翻页,上下翻页,覆盖翻页的功能。 效果图预览 使用说明 进入模块即是左右翻页模式。点击屏幕中间区域弹出上下菜单。点击设置按钮,弹出翻页方式切换按钮,点击可切换翻页方式。左右翻页方式可点击翻…

【软件测试】3.开发模型

目录 1.常见的开发模型 1.1瀑布模型 1.2螺旋模型 1.3增量模型和迭代模型 1.4敏捷模型 1.4.1特点: 1.5Scrum模型(三个角色和五个重要会议) 1.5.1三个角色: 1.5.2Scrum工作流程(五个会议) 1.6测试模…

如何选择适合自己网站的SSL证书提供商?

在互联网技术飞速发展的今天,确保数据安全已成为网站运营的基石。HTTPS证书作为一项重要的安全认证协议,对于保护数据传输的安全性至关重要。本文将为您提供一份详尽的指南,帮助您了解如何申请和部署HTTPS证书。 一、选择SSL证书提供商 首先…

JUC下的CompletableFuture详解

详细介绍 CompletableFuture是Java 8引入的一个实现Future接口的类,它代表一个异步计算的结果。与传统的Future相比,CompletableFuture提供了更丰富的功能,比如链式调用、组合异步操作、转换结果、异常处理等,极大地增强了Java在…

给网络镜像模式下的 WSL2 使用 127.0.0.1代理的方法

网络镜像模式下的WSL2虽然复制了宿主机windows的ip,但是仍然无法访问127.0.0.1的代理。经过调查,发现因为WSL2从应用商店下载而来,所以可能是UWP应用,所以需要用工具解除环回代理限制。

mysql 不停的重启关闭

早上在使用phpstudy的时候,发现自己的mysql5.7和5.8都出现了问题,就是不停的重启,在梳理了状况之后,可能是硬盘的内存空间不足,或者硬盘出现了问题;于是我将mysql 重新安装了一次,整个问题就解决…

数据结构(四)————二叉树和堆(中)

制作不易,三连支持一下呗!!! 文章目录 前言一、堆的概念及结构二、堆的实现三.堆的应用 总结 前言 CSDN 这篇博客介绍了二叉树中的基本概念和存储结构,接下来我们将运用这些结构来实现二叉树 一、堆的概念及结构 1…