docker部署jenkins,安装使用一条龙教程
Jenkins + k8s 实现CI/CD

一、简介
1. JenKins是什么?
- Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。
2. 什么是CI / CD?
-
CI/CD 是持续集成(Continuous Integration,CI)、持续交付(Continuous Delivery,CD)与持续部署(Continuous Deployment,CD)的简称。
-
为什么会有集成地狱这个“雅称”呢?我们一个项目部署的过程,
拉取代码->构建->测试->打包->部署,如果我们经常需要部署项目,特别是在微服务时代,服务特别多的情况下,不停的测试打包部署,那估计得有个人一整天专门做这事了,而这事又是繁琐的重复无意义的。 -
CI/CD是实现敏捷开发和Devops理念的一种方法,具体而言,CI/CD 可让持续自动化和持续监控贯穿于应用的整个生命周期(从集成和测试,到交付和部署)。这些关联的事务通常被统称为CI/CD 管道(Pipeline),由开发(RD)、测试(QA)、运维(OP)团队以敏捷方式协同支持。
-
持续集成:重点是将开发者的工作集中到代码仓库,一般情况每天都会有更新,持续集成可以更快的进行集成,更快的得到响应。
-
持续部署:是一种更高程度的自动化,可以根据需求进行持续的自动的部署项目。

二、docker方式安装JenKins(推荐)
1、拉取docker镜像
-
此处最好拉最新的lts版本,老版本下插件各种报错,都是泪…
docker pull jenkins/jenkins:lts
2、创建宿主机目录
mkdir -p /mydata/jenkins/jenkins_home
mkdir -p /mydata/jenkins/logs
mkdir -p /mydata/jenkins/docker
chmod 777 /mydata/jenkins
-
遇到权限问题
docker run -it --rm --volumes-from jenkins -u root ubuntu chmod -R 777 /var/jenkins_home
3、创建hudson.model.UpdateCenter.xml文件(修改清华镜像源下载插件用)
vim /mydata/jenkins/jenkins_home/hudson.model.UpdateCenter.xml
-
内部输入如下内容
<?xml version='1.1' encoding='UTF-8'?> <sites><site><id>default</id><url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url></site> </sites>
4、构造并启动docker容器
docker run -d -p 8099:8080 -p 50099:50000 \
--name jenkins \
--restart=always \
--privileged=true \
-v /mydata/jenkins/jenkins_home:/var/jenkins_home \
-v /mydata/jenkins/logs:/var/log/jenkins \
-v /etc/localtime:/etc/localtime:ro \
jenkins/jenkins:lts
-
查看日志
docker logs -f jenkins-
复制保存密码 2e2bc3258f0c41deab36bb716a6ae930

-
出现这个就是启动成功了

-
三、Jenkins配置
-
在浏览器访问
http://ip(jenkins 所在主机):8099(云服务器需要在安全组开放8099端口),出现如下界面需要等待些时间。
1、首页输入初始密码进入

2、选择安装社区插件(较慢,耐心等待)



3. 安装jdk和maven
-
进入容器
docker exec -u root -it jenkins bash -
更新包管理器
apt update -
安装openjdk java17 (jenkins lts版本已放弃java8)
apt install -y openjdk-17-jdk# 验证安装 java -version -
下载并解压 Maven
apt install -y wget apt install -y vimwget https://downloads.apache.org/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gztar -xzvf apache-maven-3.8.8-bin.tar.gz -C /opt/mv /opt/apache-maven-3.8.8 /opt/maven# 编辑settings.xml 里面的mirror标签的maven镜像地址为阿里云的 vim /opt/maven/apache-maven-3.8.8/conf/settings.xml<mirror><id>nexus-aliyun</id><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf></mirror> -
配置Maven的环境变量
echo "export M2_HOME=/opt/maven/apache-maven-3.8.8" >> ~/.bashrc echo "export PATH=\$M2_HOME/bin:\$PATH" >> ~/.bashrc source ~/.bashrc# 验证安装 mvn -version -
安装git
apt install git
4. jenkins配置jdk,maven,git路径
-
安装gitee插件

-
安装maven插件

-
安装远程连接服务插件:Publish Over SSH
-
安装发布插件:Deploy to container Plugin
-
进入配置页

-
jdk配置

-
maven 配置

-
git配置

-
配置完点击保存

5.配置需要发布部署的远程服务器
-
找到系统管理 -> 系统配置进入页面,找到publish over SSH

四.配置项目自动构建
-
选择构建maven项目









五、自动部署(命令行方式,使用Deploy to container Plugin插件的话不需要看)
1、配置服务器间免密登录
-
生成公私钥
docker exec -u root -it jenkins bash cd /root/.ssh/# 执行生成秘钥,输入后一路回车 ssh-keygen -t rsa -C "root" cat id_rsa.pub cat id_rsa# 接下来需要将公钥导入到认证文件中 cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys# 给对应文件授权 chmod 700 /root/.ssh chmod 600 /root/.ssh/authorized_keys# 将authorized_keys 文件拷贝到应用服务器的admin用户.ssh目录下. 首次需要输入密码scp -p /root/.ssh/id_rsa.pub root@111.229.7.217:/root/.ssh/authorized_keys -
在jenkins容器内进行免密连接测试.
# 在jenkins服务器的/home/admin目录下创建filetest文件,并拷贝到应用服务器 cd ~/ touch filetest scp -p filetest root@111.229.7.217:/root/ # 进入到应用服务器(111.229.7.217),检查/root目录下是否出现filetest# 在jenkins服务器上使用ssh进行免密连接测试,成功后会出现Last Login的提示 ssh root@111.229.7.217 Last login: Fri Feb 14 21:57:33 2025 from 223.80.70.133 exit -
复制密钥给jenkins用户用
sudo mkdir -p /var/jenkins_home/.ssh sudo chown jenkins:jenkins /var/jenkins_home/.ssh sudo chmod 700 /var/jenkins_home/.sshsudo cp /root/.ssh/id_rsa /var/jenkins_home/.ssh sudo chown jenkins:jenkins /var/jenkins_home/.ssh/id_rsa sudo chown jenkins:jenkins /var/jenkins_home/.ssh/id_rsa.pub sudo chmod 600 /var/jenkins_home/.ssh/id_rsa
2、编写jenins发布脚本
#!/bin/bashecho "部署的目录和项目名称"
DIR="/data/app" #部署路径
projectName="springboot" #项目名称echo "待部署的应用服务器,可多台"
server_ips="111.229.7.217" #多台用,号隔开
for server_ip in ${server_ips[@]}
doecho "ssh连接进行备份操作"
ssh -Tq -oStrictHostKeyChecking=no root@${server_ip} <<EOF
mkdir -p $DIR/backup/${projectName}# 如果存在则备份
if [ -f "$DIR/${projectName}/${projectName}.jar" ];thenmv $DIR/${projectName}/${projectName}.jar $DIR/backup/${projectName}/${projectName}-`date "+%Y%m%d_%H%M%S"`.jar
fi
EOFecho "拷贝jar包到目标服务器的tmp目录"
scp -q -oStrictHostKeyChecking=no ${WORKSPACE}/target/*.jar root@${server_ip}:/tmp/${projectName}.jarecho "ssh远程连接进行发布操作"
ssh -q -oStrictHostKeyChecking=no root@${server_ip} <<EOF
mv /tmp/${projectName}.jar $DIR/${projectName}/${projectName}.jar# 程序启停脚本
sh $DIR/${projectName}/stop.sh
sh $DIR/${projectName}/start.shEOFdoneecho "部署success"
3、 编写应用启动脚本放在程序服务器上 start.sh
#!/bin/bash
set -e #任何命令出错就退出
set -o pipefailAPP_ID=it235-boot
APP_DIR="/data/app"nohup java -Dspring.profiles.active=dev -jar ${APP_DIR}/${APP_ID}/${APP_ID}.jar > release_out.log &
start_ok=false
if [[ $? = 0 ]];thensleep 3tail -n 10 release_out.logsleep 5tail -n 50 release_out.log
fi
aaa=`grep "Started" release_out.log | awk '{print $1}'`
if [[ -n "${aaa}" ]];thenecho "Application started ok"exit 0
elseecho "Application started error"exit 1
fi
4、编写应用停止脚本放在程序服务器上 stop.sh
#!/bin/bashAPP_ID=it235-boot
ps aux | grep ${APP_ID} | grep -v "grep" | awk '{print "kill -9 "$2}' | sh
5、添加构建成功时后续部署动作

#!/bin/bash
set -e # 任何命令失败时立即退出echo "部署的目录和项目名称"
DIR="/data/app" # 部署路径
projectName="springboot" # 项目名称echo "待部署的应用服务器"
server_ips="111.229.7.217" # 多台用逗号隔开for server_ip in $(echo $server_ips | tr ',' ' '); doecho "操作服务器: $server_ip"echo "1. 备份旧版本"ssh -T -o StrictHostKeyChecking=no root@${server_ip} <<EOFmkdir -p $DIR/backup/${projectName}mkdir -p $DIR/${projectName}if [ -f "$DIR/${projectName}/${projectName}.jar" ]; thenmv $DIR/${projectName}/${projectName}.jar \\$DIR/backup/${projectName}/${projectName}-\$(date "+%Y%m%d_%H%M%S").jar# 保留最近5个备份ls -t $DIR/backup/${projectName}/*.jar | tail -n +6 | xargs rm -ffi
EOFecho "2. 拷贝新版本到临时目录"jar_source="${WORKSPACE}/target/${projectName}.jar"if [ ! -f "$jar_source" ]; thenecho "错误:构建产物不存在 - $jar_source"exit 1fi# scp命令scp -o StrictHostKeyChecking=no "$jar_source" "root@${server_ip}:/tmp/${projectName}.jar"echo "3. 发布新版本"ssh -T -o StrictHostKeyChecking=no root@${server_ip} <<EOFmv -f /tmp/${projectName}.jar $DIR/${projectName}/${projectName}.jar# 检查启停脚本是否存在if [ ! -f $DIR/${projectName}/stop.sh ] || [ ! -f $DIR/${projectName}/start.sh ]; thenecho "错误:启停脚本缺失!"exit 1fi# 重启应用sh $DIR/${projectName}/stop.shsh $DIR/${projectName}/start.sh
EOFdoneecho "部署成功!"
六、构建成功发送钉钉通知
1. jenkins添加钉钉插件
-
DingTalk

2.系统管理>钉钉 添加钉钉提醒


- 前往钉钉添加机器人
3.配置好后点击测试
4.构建测试
-
构建配置添加钉钉机器人
-

-
自定义内容(玩法很多,还没研究)
- 构建编号: 第${BUILD_NUMBER}次构建 - 测试报告: ${BUILD_URL}allure - 构建日志地址: ${BUILD_URL}console ${GIT_BRANCH}
-
-
成功提醒
-
失败提醒
-
邮箱提醒(太麻烦,没写教程,很多参数没研究明白)
七、Jenkins API控制
1、Jenkins API 文档
- http://你的jenkins地址:8099/api 可以看到当前Jenkins版本支持的api
2、创建访问key

- 此后的所有请求都需要在header中携带此token
- Authorization : Basic eWQ6Mxxxxxxxxxxxxxxx
- 此处eWQ6Mxxxxxxxxxxxxxxx 为创建token的base64编码!
- Authorization : Basic eWQ6Mxxxxxxxxxxxxxxx
3、获取Jenkins工作列表
- url:http://jenkins地址:8099/api/json

4、触发构建
-
url:http://jenkins地址:8099/job/工作名称/build
- 注意,此处工作名称中文字符需要使用 URL 编码 如:“测试构建” 编码后是 %E6%B5%8B%E8%AF%95%E6%9E%84%E5%BB%BA。

-
触发构建

5、其余api有需要自己翻阅文档!
相关文章:
docker部署jenkins,安装使用一条龙教程
Jenkins k8s 实现CI/CD 一、简介 1. JenKins是什么? Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。 2. 什么是CI / CD…...
短视频下载去水印,用什么工具好?
去除视频和图片水印是许多用户的需求,尤其是在分享或保存内容时。以下是6款超好用的工具,帮助你轻松去除水印,享受纯净的视觉体验: 1. 易下载去水印小程序 特点: 操作简单,支持抖音、快手、小红书、哔哩哔哩…...
达梦数据库中插入导出图片的方法与应用
达梦数据库中插入导出图片的方法与应用 在数据库的实际应用场景中,图片存储是一项常见且重要的需求。以电商平台为例,商品展示图片是吸引消费者的关键元素;而在社交软件里,用户头像更是个人形象的直观体现。针对达梦数据库&#…...
推理大模型时代,TextIn ParseX助力出版业知识资产重构
在大语言模型(LLM)与推理能力快速进化的技术浪潮下,出版机构沉淀数十年的非结构化数据资产,包括书籍、期刊、手稿及历史档案,正在焕发新的机遇。基于文档解析、NLP与大模型的推理生成能力,我们在图书馆层层…...
怎么删除百度搜索下拉框里的搜索引导词
搜索引擎已成为我们获取信息的主要渠道之一。百度,作为中国最大的搜索引擎,其下拉框中的搜索引导词(也称联想词或推荐词)不仅提升了搜索效率,还常常反映了用户的搜索习惯和热门话题。然而,当这些下拉词包含…...
网络爬虫-1:发送请求+维持会话+代理设置/超时设置
1.基于get发送请求 2.基于post发送请求 3.维持会话 4.代理设置/超时设置 一.基于get发送请求 1.获取网页源码1 使用json库中的json.loads(),将json格式的字符串变为Python的字典形式 以下通过http://httpbin.org/get网址进行基本练习操作 import requests import json urlh…...
GPU加速的国密SM2算法实现
目录 GPU加速的国密SM2算法实现一、前言二、国密SM2算法概述2.1 国密SM2算法背景2.2 SM2的数学基础2.3 SM2数字签名流程三、GPU加速在SM2算法中的应用3.1 高性能运算需求3.2 GPU加速优势3.3 加速实现思路四、基于Python的SM2算法实现与GPU加速4.1 算法模块设计4.2 主要数学公式…...
Redis 2025/3/9
Redis主从集群 搭建主从集群 Redis并发能力非常强,单节点能够达到数万的并发。 不过对一些用户规模大,并发量比较高的应用来讲,数万并发不太够。这时候就用到redis的集群了。因为Redis中的数据通常读多写少,所以最常用的集群方…...
2min搞定~Mac Pro 编译安装 Nginx 1.8.1
2min搞定~Mac Pro 编译安装 Nginx 1.8.1 一安装流程简述1、编译源码前,获取要依赖的源码包2、进行编译、安装nginx3、启动 二、实战部分:测试demo1、nginx.conf改动2、代码改动3、访问 一安装流程简述 阿哟啊哟老铁,别嫌我啰嗦奥…...
要在Unreal Engine 5(UE5)中实现角色打击怪物并让怪物做出受击反应,
UE5系列文章目录 文章目录 UE5系列文章目录前言一、实现思路二、最终效果 前言 ue5角色受击没有播放受击动画,主角达到怪物身上没有反应 一、实现思路 要在Unreal Engine 5(UE5)中实现角色打击怪物并让怪物做出受击反应,你需要…...
C++蓝桥杯基础篇(十一)
片头 嗨~小伙伴们,大家好!今天我们来学习C蓝桥杯基础篇(十一),学习类,结构体,指针相关知识,准备好了吗?咱们开始咯~ 一、类与结构体 类的定义:在C中&#x…...
【贪心算法4】
力扣452.用最少数量的剪引爆气球 链接: link 思路 这道题的第一想法就是如果气球重叠得越多那么用箭越少,所以先将气球按照开始坐标从小到大排序,遇到有重叠的气球,在重叠区域右边界最小值之前的区域一定需要一支箭,这道题有两…...
Leetcode 698-划分为k个相等的子集
给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。 示例 1: 输入: nums [4, 3, 2, 3, 5, 2, 1], k 4 输出: True 说明: 有可能将其分成 4 个子集&#…...
Word 小黑第2套
对应大猫42 Word1 从文件中导入新样式 样式组 -管理样式 -导入导出 -关闭Normal文件 -打开文件 -修改文件 -选中所需 -复制 调整字符宽度 调整字符间距 -字体组 加宽 适当修改磅值 文字效果通过文字组修改 另起一页,分隔符(布局 -分隔符 -分节符 -下一…...
【最后203篇系列】014 AI机器人-1
说明 终于开张了,我觉得AI机器人是一件真正正确,具有商业价值的事。 把AI机器人当成一笔生意,我如何做好这笔生意?一端是业务价值,另一端是技术支撑。如何构造高质量的内容和服务,如何确保技术的广度和深度…...
沉浸式CSS学习路径
好的!我将以魔法学院成长故事为框架,为您设计一套沉浸式CSS学习路径。以下是叙事化学习提纲: 第一卷:像素学徒的觉醒 章节1:被封印的魔法书 发现HTML的"素颜"本质,通过<!DOCTYPE html>解除网页封印用style标签打开CSS魔法书,学会给文字穿上color斗篷和…...
ctfshow做题笔记—栈溢出—pwn69~pwn72
目录 前言 一、pwn69(可以尝试用ORW读flag flag文件位置为/ctfshow_flag) 二、pwn70(可以开始你的个人秀了 flag文件位置为/flag) 三、pwn71(32位的ret2syscall) 四、pwn72 前言 学了一些新的东西,pwn69的文档忘保存了(悲),…...
重要!!! 改进 梯度方差(Fisher 信息近似) 指数移动平均
改进 梯度方差(Fisher 信息近似) 指数移动平均 目录 改进 梯度方差(Fisher 信息近似) 指数移动平均1. 指数移动平均(Exponential Moving Average, EMA)2. 引入正则化项3. 分簇加权计算一、指数移动平均(EMA)概述二、EMA 公式参数作用三、举例说明场景 1:股票价格波动分…...
同盾v2 2025版 blackbox , wasm加解密,逆向协议算法生成,小盾安全
声明 本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! # 欢迎交流 wjxch1004...
c++领域展开第十六幕——STL(vector容器的了解以及模拟实现、迭代器失效问题)超详细!!!!
文章目录 前言一、vector的介绍和使用1.1 vector的介绍1.2 vector的使用1.2.1 vector的定义1.2.2 vector iterator 的使用1.2.3 vector的空间增长问题1.2.4 vector的增删改查 二、vector在 oj 中的使用只出现一次的数删除有序数组中的重复项杨辉三角 总结 前言 在c专栏的上一篇…...
ubuntu2404 安装 过程中 手动设置网络
ubuntu2404 安装 过程中 手动设置网络 https://blog.csdn.net/2401_83947353/article/details/138454379 6.1 可以直接Done(不配置P) 6.2 可以配置ip地址,选择manual 6.2.1 search domains填 6.2.2 search domains不填 6.3 更深层次的…...
去北京的前端实习经历
趁现在对这部分还有深刻的感受记忆,赶紧记录下来。因为工作久了会发现真的对以前的事记不起来了。 公司: 北京的实习公司首先有学长学姐在,而且这个公司知名度还挺高的,但是工资比较低,3k左右吧,但是管2顿…...
QT创建项目(项目模板、构建系统、选择类、构建套件)
1. 项目模版 项目类型界面技术适用场景核心依赖模块开发语言Qt Widget ApplicationC Widgets传统桌面应用(复杂控件)Qt WidgetsCQt Console Application无 GUI命令行工具、服务Qt CoreCQt Quick ApplicationQML/Quick现代跨平台应用(动画/触…...
力扣热题 100:动态规划专题经典题解析
系列文章目录 力扣热题 100:哈希专题三道题详细解析(JAVA) 力扣热题 100:双指针专题四道题详细解析(JAVA) 力扣热题 100:滑动窗口专题两道题详细解析(JAVA) 力扣热题 100:子串专题三道题详细解析(JAVA) 力…...
变量赋值汇编
一、核心概念 寄存器:CPU内部的高速存储单元(如EAX、EBX、x86中的RAX、ARM中的R0等) 内存地址:变量存储在内存中的位置(如 0x1000) 指令:操作寄存器和内存的命令(如 MOV, STR, LDR…...
页面白屏出现的原因
🤖 作者简介:水煮白菜王,一位前端劝退师 👻 👀 文章专栏: 前端专栏 ,记录一下平时在博客写作中,总结出的一些开发技巧和知识归纳总结✍。 感谢支持💕💕&#…...
【大模型统一集成项目】让 AI 聊天更丝滑:WebSocket 实现流式对话!
🌟 在这系列文章中,我们将一起探索如何搭建一个支持大模型集成项目 NexLM 的开发过程,从 架构设计 到 代码实战,逐步搭建一个支持 多种大模型(GPT-4、DeepSeek 等) 的 一站式大模型集成与管理平台ÿ…...
boarding_passes(登机牌)表的作用
boarding_passes(登机牌)表的作用 boarding_passes 这张表的主要作用是记录旅客的登机信息,包括: 票号 (ticket_no) - 关联到 tickets 表,表示这张票属于哪个旅客。航班 ID (flight_id) - 关联到 flights 表…...
【2025】Electron Git Desktop 实战一(上)(架构及首页设计开发)
源代码仓库: Github仓库【electron_git】 Commit : bb40040 Github Desktop 页面分析 本节目标: 1、实现类似Github Desktop的「空仓库」提示页 2、添加本地仓库逻辑编写从 Github Desktop 我们看到 他的 主要页面分为三个区域 Head头部区域…...
14 | fastgo 三层架构设计
提示: 所有体系课见专栏:Go 项目开发极速入门实战课; 在实现业务代码之前,还需要先设计一个合理的软件架构。一个好的软件架构不仅可以大大提高项目的迭代速度,还可以降低项目的阅读和维护难度。目前,行业中…...








