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版本,老版本下插件各种报错,都是泪...

    shell 复制代码
    docker pull jenkins/jenkins:lts

2、创建宿主机目录

shell 复制代码
mkdir -p /mydata/jenkins/jenkins_home
mkdir -p /mydata/jenkins/logs
mkdir -p /mydata/jenkins/docker
chmod 777 /mydata/jenkins
  • 遇到权限问题

    shell 复制代码
    docker run -it --rm --volumes-from jenkins -u root ubuntu chmod -R 777 /var/jenkins_home

3、创建hudson.model.UpdateCenter.xml文件(修改清华镜像源下载插件用)

shell 复制代码
vim /mydata/jenkins/jenkins_home/hudson.model.UpdateCenter.xml
  • 内部输入如下内容

    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容器

shell 复制代码
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
  • 查看日志

    shell 复制代码
    docker logs -f jenkins
    • 复制保存密码 2e2bc3258f0c41deab36bb716a6ae930

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

三、Jenkins配置

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

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

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

3. 安装jdk和maven

  • 进入容器

    shell 复制代码
    docker exec -u root -it jenkins bash
  • 更新包管理器

    shell 复制代码
    apt update
  • 安装openjdk java17 (jenkins lts版本已放弃java8)

    shell 复制代码
    apt install -y openjdk-17-jdk
    
    # 验证安装
    java -version
  • 下载并解压 Maven

    shell 复制代码
    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的环境变量

    shell 复制代码
    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

    shell 复制代码
    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、配置服务器间免密登录

  • 生成公私钥

    shell 复制代码
    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 [email protected]:/root/.ssh/authorized_keys
  • 在jenkins容器内进行免密连接测试.

    shell 复制代码
    # 在jenkins服务器的/home/admin目录下创建filetest文件,并拷贝到应用服务器
    cd ~/
    touch filetest
    scp -p filetest [email protected]:/root/
    # 进入到应用服务器(111.229.7.217),检查/root目录下是否出现filetest
    
    # 在jenkins服务器上使用ssh进行免密连接测试,成功后会出现Last Login的提示
    ssh [email protected]
    Last login: Fri Feb 14 21:57:33 2025 from 223.80.70.133
    exit
  • 复制密钥给jenkins用户用

    shell 复制代码
    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发布脚本

shell 复制代码
#!/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

shell 复制代码
#!/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

shell 复制代码
#!/bin/bash

APP_ID=it235-boot
ps aux | grep ${APP_ID} | grep -v "grep" | awk '{print "kill -9 "$2}' | sh

5、添加构建成功时后续部署动作

shell 复制代码
#!/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.构建测试

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

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

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

  • 失败提醒

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

七、Jenkins API控制

1、Jenkins API 文档

2、创建访问key

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

3、获取Jenkins工作列表

4、触发构建

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

相关推荐
张敬之、24 分钟前
k8s-dashboard
云原生·容器·kubernetes
云上艺旅25 分钟前
K8S学习之基础二十九:K8S中的secret
学习·云原生·容器·kubernetes
Justice link31 分钟前
K8S的搭建
云原生·容器·kubernetes
厂里英才1 小时前
docker无法正常拉取镜像问题的解决
linux·docker
RedCong3 小时前
K8S之QoS详解
云原生·容器·kubernetes
大得3693 小时前
docker,centos容器开机启动程序
docker·容器·centos
白云千载尽4 小时前
docker入门篇
运维·docker·容器
最懒的菜鸟4 小时前
CentOS 系统安装 docker 以及常用插件
docker·eureka·centos
王军新4 小时前
Docker基础知识介绍
运维·docker·容器
Moshow郑锴4 小时前
基于SpringBoot3+Druid数据库连接池与外部PostgreSQL的Kubernetes Pod YAML全解析
数据库·容器·kubernetes