[Docker实现测试部署CI/CD----自由风格的CI操作[最终架构](5)]

目录

  • 11、自由风格的CI操作(最终)
    • Jenkins容器化实现方案
      • 修改 docker.sock 权限
      • 修改 Jenkins 启动命令后重启
    • Jenkins构建镜像推送到Harbor
      • 修改 daemon.json 文件
      • Jenkins 删除构建后操作
      • Jenkins 添加 shell 命令
      • 重新构建
    • Jenkins通知目标服务器拉取镜像
      • 目标服务器修改 daemon.json 文件
      • 定义脚本文件
      • Jenkins 添加端口号参数
      • Jenkins 添加构建后操作
      • 重新构建工程

11、自由风格的CI操作(最终)

        前面的架构存在的问题是,若有多个目标服务器都需要使用该镜像,那么每个目标服务 器都需要在本地构建镜像,形成系统资源浪费。若能够在 Jenkins 中将镜像构建好并推送到 Harbor 镜像中心,那么无论有多少目标服务器需要该镜像,都只需要从 Harbor 拉取即可

Jenkins容器化实现方案

        如果想在Jenkins中构建镜像,则需要Jenkins中有Docker引擎,指的是Jenkins容器内有Docker,因为我们的Jenkins是用docker起的,可以在Jennkins内再安装docker,但这种方式不太方便,不好维护,可以使用与宿主机共享Docker引擎。

修改 docker.sock 权限

        /var/run/docker.sock 文件是 docker clientdocker daemon 在本地进行通信的 socket 文件。默认的组为 docker,且 other 用户不具有读写权限,这样 Jenkins 是无法来操作该文 件的。

在这里插入图片描述

将其组调整为 root,且为其分配读写权限

在这里插入图片描述

修改 Jenkins 启动命令后重启

首先强制删除正在运行的 Jenkins 容器。

[root@jenkins run]# docker rm -f jenkins
jenkins

        然后在 Jenkins 启动命令中新增/var/run/docker.sock,docker 命令文件/usr/bin/docker, 及/etc/docker/daemon.json 文件为数据卷。
重启 Jenkins 容器。

[root@jenkins run]# docker run --name jenkins \
> --restart always \
> -p 8080:8080 \
> -p 50000:50000 \
> -v /var/jenkins_home:/var/jenkins_home \
> -v /var/run/docker.sock:/var/run/docker.sock \ 
> -v /usr/bin/docker:/usr/bin/docker \
> -v /etc/docker/daemon.json:/etc/docker/daemon.json \ # 实现推送harbor时使用的http信任,而不是https
> -d jenkins/jenkins:lts

进入Jenkins容器查看是否可以使用docker了。

在这里插入图片描述

Jenkins构建镜像推送到Harbor

        先把idea的compose.yml文件删除,push到gitlab,因为我们使用jenkins帮忙构建镜像然后推送到Harbor,不需要到目标服务器进行本地制作镜像并启动容器。(操作没截图,自己记得删除)

修改 daemon.json 文件

        Jenkins 是 Harbor 的客户端,需要修改/etc/docker/daemon.json 文件。修改后重启 Docker

[root@jenkins ~]# vim /etc/docker/daemon.json
[root@jenkins ~]# cat /etc/docker/daemon.json 
{
    "insecure-registries": [
        "192.168.40.138:8888" # harbor服务器所在的IP和端口
    ]
}

重启

[root@jenkins my_hellojenkins]# service docker restart

Jenkins 删除构建后操作

        原来的 Jenkins 中配置的“构建后操作”完成的是将代码推送到目标服务器后,让目标服务器通过 docker compose 完成镜像的构建与启动。但现在不需要了,因为镜像构建任务要由 Jenkins 自己完成了。在 Jenkins 当前任务下的“配置”中删除

在这里插入图片描述

Jenkins 添加 shell 命令

        在 sonarqube 对代码质量检测完毕后,再添加一个“构建步骤”。这个构建步骤通过 shell 命令方式完成。

在这里插入图片描述

在这里插入图片描述

mv target/*.jar docker/
cd docker
docker build -t hellojenkins .
docker login -u admin -p Harbor12345 192.168.40.138:8888
docker tag hellojenkins 192.168.40.138:8888/jks/hellojenkins
docker image prune -f
docker push 192.168.40.138:8888/jks/hellojenkins

重新构建

        Jenkins 中在返回的任务首页中,再次执行立即构建。构建成功后,在 Jenkins 主机中可以查看到构建好的镜像与重新tag 过的镜像。

在这里插入图片描述

在 harbor 的仓库中也可以看到推送来的镜像。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

Jenkins通知目标服务器拉取镜像

目标服务器修改 daemon.json 文件

        目标服务器是 Harbor 的客户端,需要修改/etc/docker/daemon.json 文件。修改后重启 Docker

在这里插入图片描述

定义脚本文件

        在目标服务器 PATH 路径下的任意目录中定义一个脚本文件 deploy.sh。例如,定义在/usr/local/bin目录下。然后再为其赋予可执行权限。这样该 deploy.sh命令就可以在任意目录下运行了。

文件内容如下

#!/bin/bash
#harbor的IP地址和端口
harbor_addr_port=$1
#harbor的项目名
harbor_proj=$2
#harbor里的镜像名
image_repo=$3
#标签
image_tag=$4
#容器内部端口
app_port=$5
#宿主机端口
export_port=$6
#镜像名
image=$harbor_addr_port/$harbor_proj/$image_repo:$image_tag
#如果容器已经存在,就删除容器
exist_container_id=`docker ps -a | grep $image_repo | awk '{print $1}'`
if [ -n "$exist_container_id" ];then
        docker stop "$exist_container_id"
        docker rm "$exist_container_id"
fi
#判断tag是否存在,如果存在就删除,然后拉取最新镜像
exist_image_tag=`docker images | grep $harbor_addr_port/$harbor_proj/$image_repo | awk '{print $2}'`
if [[ "$exist_image_tag" =~ "$image_tag" ]]; then
        docker rmi -f $image
fi
docker login -u admin -p Harbor12345 $harbor_addr_port
docker pull $image
docker run --name $image_repo -d -p $export_port:$app_port $image
echo "SUCCESS"

授予可执行权限

[root@target bin]# chmod +x deploy.sh 

执行脚本后可以看到

在这里插入图片描述

修改idea代码

在这里插入图片描述

再次构建,构建完成之后执行脚本

在这里插入图片描述

浏览器查看

在这里插入图片描述

Jenkins 添加端口号参数

在这里插入图片描述

Jenkins 添加构建后操作

还是在 Jenkins 当前任务下的“配置”中,为任务添加构建后操作
在这里插入图片描述

在这里插入图片描述

重新构建工程

        这次重新构建,可以看到出现了 export_port 的文本框。在这里可以修改容器对外暴露的端口号
在这里插入图片描述

        构建成功后可以看到,目标服务器中增加了新的镜像,该镜像是从 harbor 拉取的,还可以看到,该镜像的容器也已经启动。

在这里插入图片描述

浏览器访问没有问题

在这里插入图片描述

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

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

相关文章

【TypeScript】中定义与使用 Class 类的解读理解

目录 类的概念类的继承 :类的存取器:类的静态方法与静态属性:类的修饰符:参数属性:抽象类:类的类型: 总结: 类的概念 类是用于创建对象的模板。他们用代码封装数据以处理该数据。JavaScript 中的…

ChatGPT“侵入”校园,教学评价体制受冲击,需作出调整

北密歇根大学的教授奥曼在学生作业中发现了一篇关于世界宗教的“完美论文”。“这篇文章写得比大多数学生都要好......好到不符合我对学生的预期!”他去问ChatGPT:“这是你写的吗?”ChatGPT回答:“99.9%的概率是的。” ChatGPT“侵…

Python入门三

目录: 内置库os内置库sys内置库文件处理内置库科学计算内置库日期与时间处理内置库json内置库正则表达式re内置库多线程threding内置库pythonlogging内置库pythonlogging高级使用venv环境管理pip环境管理常用第三方库yaml常用第三方库pymysql常用第三方库urllib3学…

【微信小程序创作之路】- 小程序远程数据请求、获取个人信息

【微信小程序创作之路】- 小程序远程数据请求、获取个人信息 第七章 小程序远程数据请求、获取个人信息 文章目录 【微信小程序创作之路】- 小程序远程数据请求、获取个人信息前言一、远程数据请求1.本地环境2.正式域名 二、获取用户个人信息1.展示当前用户的身份信息2.获取用…

启动RocketMQ报错

说明:启动RocketMQ消费者时,报以下错误:java.lang.IllegalStateException:Failed to start RocketMQ push consumer. 解决:看下所有的监听器类,检查是不是有相同的消费者组名,注释掉其中一个即可…

vue运行在IE浏览器空白报错SCRIPT1006: 缺少‘)‘ -【vue兼容IE篇】

其他浏览器均正常,但是切换ie模式,打开空白,F12打开报错缺少‘)‘ ,如下图 在搜狗浏览器下点开报错:定格在crypto-js处 解决: 步骤一:使用npm安装babel-polyfill 依赖(已安装了可忽…

访问者模式(Visitor)

访问者模式是一种行为设计模式,可封装一些作用于当前数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。 Visitor is a behavior design pattern that encapsulates some operations that act on the elements of t…

Stable Diffusion - SDXL 模型测试 (DreamShaper 和 GuoFeng v4) 与全身图像参数配置

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/132085757 图像来源于 GuoFeng v4 XL 模型,艺术风格是赛博朋克、漫画、奇幻。 全身图像是指拍摄对象的整个身体都在画面中的照片&…

基于arcFace+faiss开发构建人脸识别系统

在上一篇博文《基于facenetfaiss开发构建人脸识别系统》中,我们实践了基于facenet和faiss的人脸识别系统开发,基于facenet后续提出来很多新的改进的网络模型,arcFace就是其中一款优秀的网络模型,本文的整体开发实现流程与前文相同…

wpf画刷学习1

在这2篇博文有提到wpf画刷, https://blog.csdn.net/bcbobo21cn/article/details/109699703 https://blog.csdn.net/bcbobo21cn/article/details/107133703 下面单独学习一下画刷; wpf有五种画刷,也可以自定义画刷,画刷的基类都…

怎么修改pdf文件中的文字?分享几种编辑方法

怎么修改pdf文件中的文字?PDF格式的文件通常具有很高的可读性和稳定性,但是如果需要修改其中的文字,就需要使用专门的PDF编辑器。本文将介绍几种PDF编辑的方法,下面就跟着我一起来看看这几款工具吧。 方法一:使用迅捷P…

【Linux后端服务器开发】Reactor模式实现网络计算器

目录 一、Reactor模式概述 二、日志模块:Log.hpp 三、TCP连接模块:Sock.hpp 四、非阻塞通信模块:Util.hpp 五、多路复用I/O模块:Epoller.hpp 六、协议定制模块:Protocol.hpp 七、服务器模块:Server.…

神策新一代分析引擎架构演进

近日,神策数据已经推出全新的神策分析 2.5 版本,该版本支持分析模型与外部数据的融合性接入,构建全域数据融合模型,实现从用户到经营的全链路、全场景分析。新版本的神策分析能够为企业提供更全面、更有效的市场信息和经营策略&am…

React Native元素旋转一定的角度

mMeArrowIcon: {fontSize: 30, color: #999, transform: [{rotate: 180deg}]},<Icon name"arrow" style{styles.mMeArrowIcon}></Icon>参考链接&#xff1a; https://reactnative.cn/docs/transforms https://chat.xutongbao.top/

HDFS集群滚动升级以及回滚相关

HDFS集群滚动升级以及回滚相关 介绍不停机滚动升级非联邦HA集群联邦HA集群 停机升级--非HA集群HDFS集群降级和回滚异同点共同点不同点 HA集群降级&#xff08;downgrade&#xff09;注意事项 集群回滚操作 介绍 在hadoop v2中&#xff0c;HDFS支持namenode高可用&#xff08;H…

windows编译zookeeker动态库供C++链接使用以及遇到的错误处理方法

windows下面C链接zookeeper资料不多&#xff0c;特此记录一下 编译环境VS 2015 一. 相关安装包安装下载 1. zookeeper zookeeper3.6.4 下载zip包解压即可 2. ant apache-ant-1.9.16 将包进行解压D:project\apache-ant-1.9.16&#xff0c;然后配置环境变量 新建 ANT_HOME 系…

OpenSource - 一站式API服务

文章目录 概述功能模块运行启动Docker启动功能预览首页接口开发接口属性请求参数在线预览应用创建接口列表数据库类型限流熔断接口申请申请审批 概述 Crabc是低代码开发平台&#xff0c;企业级API发布管理系统&#xff0c;采用SpringBoot、JWT、Mybatis等框架和SPI插件机制实现…

四、Unity中颜色空间

Unity中的设置 通过点击菜单Edit->Project Settings->Player页签->Other Settings下的Rendering部分进行修改&#xff0c;参数Color Space可以选择Gamma或Linear。 当选择Gamma Space时&#xff0c;Unity不会做任何处理。当选择Linear Space时&#xff0c;引擎的渲染…

排序八卦炉之冒泡、快排【完整版】

文章目录 1.冒泡排序1.1代码实现1.2复杂度 2.快速排序2.1人物及思想介绍【源于百度】2.2hoare【霍尔】版本1.初识代码2.代码分析3.思其因果 2.3挖坑版本1.初始代码2.代码分析3.思想比较 2.4指针版本1.初识代码2.代码分析3.问题探讨 2.5集体优化2.6极致优化2.7非递归版本1.初识代…

【ConcurrentHashMap1.7源码】十分钟带你深入ConcurrentHashMap并发解析

ConcurrentHashMap1.7源码 四个核心要点 初始化PUT扩容GET Unsafe 初始化 五个构造方法 /*** Creates a new, empty map with the default initial table size (16).*/public ConcurrentHashMap() {}/*** Creates a new, empty map with an initial table size* accommodati…