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 vim wget https://downloads.apache.org/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz tar -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/.ssh sudo 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/bash
echo "部署的目录和项目名称"
DIR="/data/app" #部署路径
projectName="springboot" #项目名称
echo "待部署的应用服务器,可多台"
server_ips="111.229.7.217" #多台用,号隔开
for server_ip in ${server_ips[@]}
do
echo "ssh连接进行备份操作"
ssh -Tq -oStrictHostKeyChecking=no root@${server_ip} <<EOF
mkdir -p $DIR/backup/${projectName}
# 如果存在则备份
if [ -f "$DIR/${projectName}/${projectName}.jar" ];then
mv $DIR/${projectName}/${projectName}.jar $DIR/backup/${projectName}/${projectName}-`date "+%Y%m%d_%H%M%S"`.jar
fi
EOF
echo "拷贝jar包到目标服务器的tmp目录"
scp -q -oStrictHostKeyChecking=no ${WORKSPACE}/target/*.jar root@${server_ip}:/tmp/${projectName}.jar
echo "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.sh
EOF
done
echo "部署success"
3、 编写应用启动脚本放在程序服务器上 start.sh
#!/bin/bash
set -e #任何命令出错就退出
set -o pipefail
APP_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 ]];then
sleep 3
tail -n 10 release_out.log
sleep 5
tail -n 50 release_out.log
fi
aaa=`grep "Started" release_out.log | awk '{print $1}'`
if [[ -n "${aaa}" ]];then
echo "Application started ok"
exit 0
else
echo "Application started error"
exit 1
fi
4、编写应用停止脚本放在程序服务器上 stop.sh
#!/bin/bash
APP_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 ',' ' '); do
echo "操作服务器: $server_ip"
echo "1. 备份旧版本"
ssh -T -o StrictHostKeyChecking=no root@${server_ip} <<EOF
mkdir -p $DIR/backup/${projectName}
mkdir -p $DIR/${projectName}
if [ -f "$DIR/${projectName}/${projectName}.jar" ]; then
mv $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 -f
fi
EOF
echo "2. 拷贝新版本到临时目录"
jar_source="${WORKSPACE}/target/${projectName}.jar"
if [ ! -f "$jar_source" ]; then
echo "错误:构建产物不存在 - $jar_source"
exit 1
fi
# scp命令
scp -o StrictHostKeyChecking=no "$jar_source" "root@${server_ip}:/tmp/${projectName}.jar"
echo "3. 发布新版本"
ssh -T -o StrictHostKeyChecking=no root@${server_ip} <<EOF
mv -f /tmp/${projectName}.jar $DIR/${projectName}/${projectName}.jar
# 检查启停脚本是否存在
if [ ! -f $DIR/${projectName}/stop.sh ] || [ ! -f $DIR/${projectName}/start.sh ]; then
echo "错误:启停脚本缺失!"
exit 1
fi
# 重启应用
sh $DIR/${projectName}/stop.sh
sh $DIR/${projectName}/start.sh
EOF
done
echo "部署成功!"
六、构建成功发送钉钉通知
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。
-
触发构建