当前位置: 首页 > article >正文

docker部署jenkins,安装使用一条龙教程

Jenkins + k8s 实现CI/CD

image-20250214141257082

一、简介

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)团队以敏捷方式协同支持。

  • 持续集成:重点是将开发者的工作集中到代码仓库,一般情况每天都会有更新,持续集成可以更快的进行集成,更快的得到响应。

  • 持续部署:是一种更高程度的自动化,可以根据需求进行持续的自动的部署项目。

image-20250214143048342

二、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

      image-20250213223343991

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

      image-20250213223424827

三、Jenkins配置

  • 在浏览器访问 http://ip(jenkins 所在主机):8099(云服务器需要在安全组开放8099端口),出现如下界面需要等待些时间。

    image-20250213223701236

1、首页输入初始密码进入

image-20250213223718489

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

image-20250213223751152

image-20250214143652574

image-20250214145022449

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插件

    image-20250214165201687

  • 安装maven插件

    image-20250214160955157

  • 安装远程连接服务插件:Publish Over SSH

  • 安装发布插件:Deploy to container Plugin

  • 进入配置页

    image-20250214153656447

  • jdk配置

    image-20250214153815659

  • maven 配置

    image-20250214153920817

  • git配置

image-20250214153952351

  • 配置完点击保存

    image-20250214154051945

5.配置需要发布部署的远程服务器

  • 找到系统管理 -> 系统配置进入页面,找到publish over SSH

    image-20250312151345195

四.配置项目自动构建

  • 选择构建maven项目

    image-20250214155730725

image-20250214161214518

image-20250214165453687

image-20250214170710736

image-20250214161635540

image-20250312152218662

image-20250214163841339

image-20250214164329865

image-20250214164509721

五、自动部署(命令行方式,使用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、添加构建成功时后续部署动作

image-20250214224918400

#!/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

    image-20250215101308648

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

  • image-20250215101904210
  • image-20250215101957774
  • 前往钉钉添加机器人
    • image-20250215102219660
    • image-20250215102239440
    • image-20250215102257578

3.配置好后点击测试

  • image-20250215102450697
  • image-20250215102519327

4.构建测试

  • 构建配置添加钉钉机器人

    • image-20250215105200976

    • 自定义内容(玩法很多,还没研究)

      - 构建编号: 第${BUILD_NUMBER}次构建
      - 测试报告: ${BUILD_URL}allure
      - 构建日志地址: ${BUILD_URL}console ${GIT_BRANCH}
      
  • 成功提醒

    • image-20250215103257542
  • 失败提醒

    • image-20250215103741596
  • 邮箱提醒(太麻烦,没写教程,很多参数没研究明白)

    • image-20250215103455599

七、Jenkins API控制

1、Jenkins API 文档

  • http://你的jenkins地址:8099/api 可以看到当前Jenkins版本支持的api

2、创建访问key

image-20250312152813072

  • 此后的所有请求都需要在header中携带此token
    • Authorization : Basic eWQ6Mxxxxxxxxxxxxxxx
      • 此处eWQ6Mxxxxxxxxxxxxxxx 为创建token的base64编码!

3、获取Jenkins工作列表

  • url:http://jenkins地址:8099/api/json

image-20250312153217637

4、触发构建

  • url:http://jenkins地址:8099/job/工作名称/build

    • 注意,此处工作名称中文字符需要使用 URL 编码 如:“测试构建” 编码后是 %E6%B5%8B%E8%AF%95%E6%9E%84%E5%BB%BA。

    image-20250312153643475

    • 触发构建

      image-20250312153656696

5、其余api有需要自己翻阅文档!


http://www.kler.cn/a/582689.html

相关文章:

  • Chrome 扩展开发 API实战:Extension(五)
  • 基于javaweb的SpringBoot+MyBatis实验室管理系统设计和实现(源码+文档+部署讲解)
  • SSH 安全致命漏洞:渗透路径与防御策略
  • Java 实现 WebSocket 客户端
  • 麒麟操作系统和统信的区别,上面一般用什么OFFICE,excel软件?
  • git subtree更新子仓库的方式
  • java项目之基于ssm的在线学习系统(源码+文档)
  • EG82088串口边缘计算网关
  • 蓝桥杯——又是二分
  • Flutter 小技巧之通过 MediaQuery 优化 App 性能
  • Spring Boot 项目零风险升级 Tomcat 指南:锁定版本也能修复漏洞
  • 【Leetcode 每日一题】2269. 找到一个数字的 K 美丽值
  • Python+jupyter进行数据分析与数据挖掘
  • Docker基础入门(一)
  • React 中如何实现表单的受控组件?
  • Linux_17进程控制
  • Flink 1.17.2 版本用 java 读取 starrocks
  • c#如何直接获取json中的某个值
  • Java中的加盐加密:提升密码存储安全性的关键实践
  • 深度解读 | AI驱动下的新型金融对冲策略:稀疏奖励强化学习的应用