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。
  -  触发构建  
 








