[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 client 和 docker 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" ];thendocker 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" ]]; thendocker 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 拉取的,还可以看到,该镜像的容器也已经启动。

浏览器访问没有问题

相关文章:
[Docker实现测试部署CI/CD----自由风格的CI操作[最终架构](5)]
目录 11、自由风格的CI操作(最终)Jenkins容器化实现方案修改 docker.sock 权限修改 Jenkins 启动命令后重启 Jenkins构建镜像推送到Harbor修改 daemon.json 文件Jenkins 删除构建后操作Jenkins 添加 shell 命令重新构建 Jenkins通知目标服务器拉取镜像目…...
纯JS+Vue实现一个仪表盘
在使用canvas的时候发现数值变化,每次都要重新渲染,值都从0开始,这和我的需求冲突。 1. 先绘制基本的圆环背景,利用border-color和border-radius将正方形变成基本的圆环。 <div class"circle"><div class&qu…...
标定(内参、外参)
在计算机视觉中,特别是在相机标定和立体视觉领域,内参(intrinsic parameters)和外参(extrinsic parameters)是非常重要的概念。它们与相机的几何属性和姿态有关。 内参(Intrinsic Parameters&am…...
基于ffmpeg与SDL的视频播放库
由于工作需要,自己封装的基于ffmpeg的视频编解码库,显示采用了SDL库。可以播放本地文件或网络流,支持多端口播放,支持文字叠加,截图、视频录制等等。 头文件代码: #pragma once #ifdef __DLLEXPORT #defin…...
基于二进制草蝉优化算法选择特征并使用 KNN 进行训练(Matlab代码实现)
目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨💻4 Matlab代码 💥1 概述 基于二进制草蝉优化算法选择特征并使用KNN(K-Nearest Neighbors,K最近邻算法)进行训练是一种…...
14-4_Qt 5.9 C++开发指南_QUdpSocket实现 UDP 通信_UDP组播
文章目录 1. UDP组播的特性2. UDP 组播实例程序的功能3. 组播功能的程序实现4. 源码4.1 可视化UI设计4.2 mainwindow.h4.3 mainwindow.cpp 1. UDP组播的特性 下图简单表示了组播的原理。UDP 组播是主机之间“一对一组”的通信模式,当多个客户端加入由一个组播地址定…...
ai图片合成软件帮你创造个性绚丽
嘿!悄悄告诉你一个小秘密,现在有一款超酷的软件,它能让你的图片变得活灵活现,就像跳出了屏幕一样!没错,这就是ai图片制作软件!想象一下,你拍摄了一张美丽的风景照片,但总…...
git 版本回退
git 没有push之前,可以用git reset --mixed回退,就是把add 的内容和commit的内容都撤销 在push之后,你只有2种操作 1.git reset 退回到你想要的那个版本 有配置选项 如果是soft就是当前版本删掉,之前改的代码保留,ha…...
使用Jackson自定义序列化操作(Jackson – Custom Serializer)
目录 Standard Serialization of an Object GraphCustom Serializer on the ObjectMapperCustom Serializer on the Class Standard Serialization of an Object Graph Data NoArgsConstructor AllArgsConstructor public class Item {public int id;public String itemName;p…...
Python-元组
元组(Tuples)详解 在Python中,元组(Tuples)是一种有序的数据类型,它可以包含任意类型的元素,包括数字、字符串、列表等。与列表相似,元组也是用来存储一组数据,但与列表…...
快速转换PDF文件: Python和PyMuPDF教程
解决问题 有时候将文档上传Claude2做分析,有大小限制,所以需要切割pdf文档为几个小点的文档,故才有了本文章。 如何用Python和PyMuPDF制作你想要大小的PDF? PDF是一种广泛使用的文件格式,可以在任何设备上查看和打印…...
规划模型Matlab代码
文章目录 数学规划定义一般形式分类 1.线性规划(linear programming)2.非线性规划(nonlinear programming)3. 整数规划(integer programming)4. 0-1规划(0-1 programming)5. 最大最小化模型6. 多目标规划模型7.敏感性分析(对权重)[例题] 数学规划定义 数…...
用html+javascript打造公文一键排版系统11:改进单一附件说明排版
一、用htmljavascript打造公文一键排版系统10中的一个bug 在 用htmljavascript打造公文一键排版系统10:单一附件说明排版 中,我们对附件说明的排版函数是: function setAtttDescFmt(p) {var t p;var a ;if (-1 ! t.indexOf(:))//是半角冒…...
snap xxx has “install-snap“ change in progress
error description * 系重复安装,进程冲突 solution 展示snap的改变 然后sudo snap abort 22即可终止该进程 之后重新运行install command~~ PS: ubuntu有时候加载不出来,执行resolvectl flush-caches,清除dns缓存…...
Elasticsearch 性能调优指南
目录 1、通用优化策略 1.1 通用最小化法则 1.2 职责单一原则 1.3 其他 2、写性能调优 2.1 基本原则 2.2 优化手段 2.2.1 增加 flush 时间间隔, 2.2.2 增加refresh_interval的参数值 2.2.3 增加Buffer大小, 2.2.4 关闭副本 2.2.5 禁用swap 2…...
学习Boost一:学习方法和学习目的
学习目的 Boost 的学习目的: 因为从知乎和CSND上根据了解内容来看,Boost作为一个历史悠久的开源库,已经脱离了一个单纯的库的概念了,他因庞大的涉及面应当被称之为库集。 并且,因为boost库优秀的试用反馈和开发人员的…...
c语言每日一练(1)
前言: 每日一练系列,每一期都包含5道选择题,2道编程题,博主会尽可能详细地进行讲解,令初学者也能听的清晰。每日一练系列会持续更新,暑假时三天之内必有一更,到了开学之后,将看学业情…...
iOS开发-CocoaLumberjack日志库实现Logger日志功能
iOS开发-Logger日志功能实现 在iOS开发中,常用CocoaLumberjack来作为日志功能实现的日志框架 一、CocoaLumberjack是什么? CocoaLumberjack 是 支持 iOS 和 Mac 平台的日志框架,使用简单,功能强大且不失灵活,它的主…...
深度学习(34)—— StarGAN(2)
深度学习(34)—— StarGAN(2) 完整项目在这里:欢迎造访 文章目录 深度学习(34)—— StarGAN(2)1. build model(1)generator(2&#…...
use lua
-- basic.lua print("hello ".."world") local a 1 --only this file can see b 2 -- global see -- not declare vaiable all asign to nil print(fuck) -- 字符串可以"" , ,[[]] -- 一些数值运算支持,进制数,科学数&a…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
