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

news2025/3/13 10:39:23

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.coloradmin.cn/o/2314246.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

短视频下载去水印,用什么工具好?

去除视频和图片水印是许多用户的需求&#xff0c;尤其是在分享或保存内容时。以下是6款超好用的工具&#xff0c;帮助你轻松去除水印&#xff0c;享受纯净的视觉体验&#xff1a; 1. 易下载去水印小程序 特点&#xff1a; 操作简单&#xff0c;支持抖音、快手、小红书、哔哩哔哩…

推理大模型时代,TextIn ParseX助力出版业知识资产重构

在大语言模型&#xff08;LLM&#xff09;与推理能力快速进化的技术浪潮下&#xff0c;出版机构沉淀数十年的非结构化数据资产&#xff0c;包括书籍、期刊、手稿及历史档案&#xff0c;正在焕发新的机遇。基于文档解析、NLP与大模型的推理生成能力&#xff0c;我们在图书馆层层…

Redis 2025/3/9

Redis主从集群 搭建主从集群 Redis并发能力非常强&#xff0c;单节点能够达到数万的并发。 不过对一些用户规模大&#xff0c;并发量比较高的应用来讲&#xff0c;数万并发不太够。这时候就用到redis的集群了。因为Redis中的数据通常读多写少&#xff0c;所以最常用的集群方…

2min搞定~Mac Pro 编译安装 Nginx 1.8.1

2min搞定&#xff5e;Mac Pro 编译安装 Nginx 1.8.1 一安装流程简述1、编译源码前&#xff0c;获取要依赖的源码包2、进行编译、安装nginx3、启动 二、实战部分&#xff1a;测试demo1、nginx.conf改动2、代码改动3、访问 一安装流程简述 阿哟啊哟老铁&#xff0c;别嫌我啰嗦奥…

要在Unreal Engine 5(UE5)中实现角色打击怪物并让怪物做出受击反应,

UE5系列文章目录 文章目录 UE5系列文章目录前言一、实现思路二、最终效果 前言 ue5角色受击没有播放受击动画&#xff0c;主角达到怪物身上没有反应 一、实现思路 要在Unreal Engine 5&#xff08;UE5&#xff09;中实现角色打击怪物并让怪物做出受击反应&#xff0c;你需要…

C++蓝桥杯基础篇(十一)

片头 嗨~小伙伴们&#xff0c;大家好&#xff01;今天我们来学习C蓝桥杯基础篇&#xff08;十一&#xff09;&#xff0c;学习类&#xff0c;结构体&#xff0c;指针相关知识&#xff0c;准备好了吗&#xff1f;咱们开始咯~ 一、类与结构体 类的定义&#xff1a;在C中&#x…

Leetcode 698-划分为k个相等的子集

给定一个整数数组 nums 和一个正整数 k&#xff0c;找出是否有可能把这个数组分成 k 个非空子集&#xff0c;其总和都相等。 示例 1&#xff1a; 输入&#xff1a; nums [4, 3, 2, 3, 5, 2, 1], k 4 输出&#xff1a; True 说明&#xff1a; 有可能将其分成 4 个子集&#…

Word 小黑第2套

对应大猫42 Word1 从文件中导入新样式 样式组 -管理样式 -导入导出 -关闭Normal文件 -打开文件 -修改文件 -选中所需 -复制 调整字符宽度 调整字符间距 -字体组 加宽 适当修改磅值 文字效果通过文字组修改 另起一页&#xff0c;分隔符&#xff08;布局 -分隔符 -分节符 -下一…

ctfshow做题笔记—栈溢出—pwn69~pwn72

目录 前言 一、pwn69(可以尝试用ORW读flag flag文件位置为/ctfshow_flag) 二、pwn70(可以开始你的个人秀了 flag文件位置为/flag) 三、pwn71(32位的ret2syscall) 四、pwn72 前言 学了一些新的东西&#xff0c;pwn69的文档忘保存了&#xff08;悲&#xff09;&#xff0c…

同盾v2 2025版 blackbox , wasm加解密,逆向协议算法生成,小盾安全

声明 本文章中所有内容仅供学习交流&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; # 欢迎交流 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&#xff08;不配置P&#xff09; 6.2 可以配置ip地址&#xff0c;选择manual 6.2.1 search domains填 6.2.2 search domains不填 6.3 更深层次的…

去北京的前端实习经历

趁现在对这部分还有深刻的感受记忆&#xff0c;赶紧记录下来。因为工作久了会发现真的对以前的事记不起来了。 公司&#xff1a; 北京的实习公司首先有学长学姐在&#xff0c;而且这个公司知名度还挺高的&#xff0c;但是工资比较低&#xff0c;3k左右吧&#xff0c;但是管2顿…

力扣热题 100:动态规划专题经典题解析

系列文章目录 力扣热题 100&#xff1a;哈希专题三道题详细解析(JAVA) 力扣热题 100&#xff1a;双指针专题四道题详细解析(JAVA) 力扣热题 100&#xff1a;滑动窗口专题两道题详细解析&#xff08;JAVA&#xff09; 力扣热题 100&#xff1a;子串专题三道题详细解析(JAVA) 力…

变量赋值汇编

一、核心概念 寄存器&#xff1a;CPU内部的高速存储单元&#xff08;如EAX、EBX、x86中的RAX、ARM中的R0等&#xff09; 内存地址&#xff1a;变量存储在内存中的位置&#xff08;如 0x1000&#xff09; 指令&#xff1a;操作寄存器和内存的命令&#xff08;如 MOV, STR, LDR…

页面白屏出现的原因

&#x1f916; 作者简介&#xff1a;水煮白菜王&#xff0c;一位前端劝退师 &#x1f47b; &#x1f440; 文章专栏&#xff1a; 前端专栏 &#xff0c;记录一下平时在博客写作中&#xff0c;总结出的一些开发技巧和知识归纳总结✍。 感谢支持&#x1f495;&#x1f495;&#…

【大模型统一集成项目】让 AI 聊天更丝滑:WebSocket 实现流式对话!

&#x1f31f; 在这系列文章中&#xff0c;我们将一起探索如何搭建一个支持大模型集成项目 NexLM 的开发过程&#xff0c;从 架构设计 到 代码实战&#xff0c;逐步搭建一个支持 多种大模型&#xff08;GPT-4、DeepSeek 等&#xff09; 的 一站式大模型集成与管理平台&#xff…

【2025】Electron Git Desktop 实战一(上)(架构及首页设计开发)

源代码仓库&#xff1a; Github仓库【electron_git】 Commit &#xff1a; bb40040 Github Desktop 页面分析 本节目标&#xff1a; 1、实现类似Github Desktop的「空仓库」提示页 2、添加本地仓库逻辑编写从 Github Desktop 我们看到 他的 主要页面分为三个区域 Head头部区域…

14 | fastgo 三层架构设计

提示&#xff1a; 所有体系课见专栏&#xff1a;Go 项目开发极速入门实战课&#xff1b; 在实现业务代码之前&#xff0c;还需要先设计一个合理的软件架构。一个好的软件架构不仅可以大大提高项目的迭代速度&#xff0c;还可以降低项目的阅读和维护难度。目前&#xff0c;行业中…

【机器学习-基础知识】统计和贝叶斯推断

1. 概率论基本概念回顾 1. 概率分布 定义: 概率分布(Probability Distribution)指的是随机变量所有可能取值及其对应概率的集合。它描述了一个随机变量可能取的所有值以及每个值被取到的概率。 对于离散型随机变量,使用概率质量函数来描述。对于连续型随机变量,使用概率…