[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…...
Xbox手柄电量监控:告别游戏中断的终极解决方案
Xbox手柄电量监控:告别游戏中断的终极解决方案 【免费下载链接】XB1ControllerBatteryIndicator A tray application that shows a battery indicator for an Xbox-ish controller and gives a notification when the battery level drops to (almost) empty. 项目…...
探索SillyTavern:重新定义AI角色交互体验的开源平台
探索SillyTavern:重新定义AI角色交互体验的开源平台 【免费下载链接】SillyTavern LLM Frontend for Power Users. 项目地址: https://gitcode.com/GitHub_Trending/si/SillyTavern 在人工智能与人类交互日益紧密的今天,如何打破传统聊天界面的局…...
跨平台迁移零成本转换:MusicFree实现音乐收藏自由的完整指南
跨平台迁移零成本转换:MusicFree实现音乐收藏自由的完整指南 【免费下载链接】MusicFree 插件化、定制化、无广告的免费音乐播放器 项目地址: https://gitcode.com/maotoumao/MusicFree 当你从一个音乐平台转向另一个时,精心整理的歌单往往成为最…...
中微半导体冲刺港股:年营收11亿 利润2.8亿 周彦套现3.47亿
雷递网 雷建平 4月5日中微半导体( 深圳)股份有限公司(简称:“中微半导体”)日前递交招股书,准备在港交所上市。中微半导体2022年8月在科创板上市,发行6300万股,发行价为30.86元,募资总额19.44亿…...
granite-4.0-h-350m效果展示:中英双语问答、代码补全、文本摘要三连击
granite-4.0-h-350m效果展示:中英双语问答、代码补全、文本摘要三连击 今天带大家看看一个轻量级但能力不俗的AI模型——granite-4.0-h-350m。这个模型虽然只有3.5亿参数,但在多个任务上的表现却让人眼前一亮。我用Ollama部署了它的文本生成服务&#x…...
OpenClaw健康检查方案:千问3.5-35B-A3B-FP8长期运行维护指南
OpenClaw健康检查方案:千问3.5-35B-A3B-FP8长期运行维护指南 1. 为什么需要健康检查? 去年冬天的一个深夜,我被手机警报惊醒——部署在家庭服务器的OpenClaw千问3.5组合突然停止了响应。检查日志发现是显存泄漏导致进程崩溃,而当…...
QueryExcel:解锁3大核心功能的多Excel文件极速查询指南
QueryExcel:解锁3大核心功能的多Excel文件极速查询指南 【免费下载链接】QueryExcel 多Excel文件内容查询工具。 项目地址: https://gitcode.com/gh_mirrors/qu/QueryExcel 直击痛点:数据查询的效率困境 场景一:财务报表核对 月底需从…...
CHORD-X视觉战术指挥系统固件升级方案:远程安全更新边缘设备
CHORD-X视觉战术指挥系统固件升级方案:远程安全更新边缘设备 最近和几个做边缘计算设备的朋友聊天,大家普遍头疼一个问题:设备一旦部署出去,特别是像智能摄像头、单兵终端这类在户外或复杂环境下的设备,后续的固件更新…...
BetterJoy控制器配置终极指南:从零开始快速掌握Switch手柄PC使用技巧
BetterJoy控制器配置终极指南:从零开始快速掌握Switch手柄PC使用技巧 【免费下载链接】BetterJoy Allows the Nintendo Switch Pro Controller, Joycons and SNES controller to be used with CEMU, Citra, Dolphin, Yuzu and as generic XInput 项目地址: https:…...
Bidili Generator企业应用:广告公司客户提案阶段快速生成视觉概念稿
Bidili Generator企业应用:广告公司客户提案阶段快速生成视觉概念稿 1. 引言:提案阶段的视觉痛点与解决方案 在广告公司的日常工作中,客户提案阶段往往是最紧张、最考验创意执行效率的环节。传统的视觉概念稿制作流程通常是这样的ÿ…...
