Docker部署jenkins

一、安装Jenkins

1、安装Jenkins

docker pull jenkins/jenkins:lts

使用Docker卷(自动管理权限)

docker volume create jenkins_home

或手动创建主机目录(需设置权限)

mkdir /mnt/jenkins_home

mkdir /mnt/jenkins_home/logs

#授权文件夹

chmod 777 /mnt/jenkins_home

chmod 777 /mnt/jenkins_home/logs

启动Jenkins容器

docker run -d -p 8888:8080 -p 50099:50000 \

--name jenkins \

--restart=always \

--privileged=true \

-v /mnt/jenkins_home:/var/jenkins_home \

-v /mnt/jenkins_home/logs:/var/log/jenkins \

-v /etc/localtime:/etc/localtime:ro \

jenkins/jenkins:lts

-d: 后台运行容器。

--name: 容器名称。

-p 8888:8080: 映射Web界面端口。

-p 50099:50000: 供Jenkins Agent连接的端口。

-v: 数据卷挂载,确保数据持久化。

2、查找密码

docker logs jenkins # 在日志中查找密码

或直接从容器中读取

docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword

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>

二、Jenkins配置

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

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

3. 安装jdk和maven
  • 进入容器

    docker exec -u root -it jenkins bash

  • 更新包管理器

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

pt 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

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 [email protected]:/root/.ssh/authorized_keys

在jenkins容器内进行免密连接测试.

在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容器内进行免密连接测试.

在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用户用

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 文档
2、创建访问key

此后的所有请求都需要在header中携带此token

Authorization : Basic eWQ6Mxxxxxxxxxxxxxxx

此处eWQ6Mxxxxxxxxxxxxxxx 为创建token的base64编码!

3、获取Jenkins工作列表

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

4、触发构建

触发构建

5、其余api有需要自己翻阅文档!
相关推荐
m0_684598531 小时前
如何开发英语在线训练小程序:从0到1的详细步骤
java·微信小程序·小程序·小程序开发
ml130185288742 小时前
开发一个环保回收小程序需要哪些功能?环保回收小程序
java·大数据·微信小程序·小程序·开源软件
爱知菜2 小时前
Windows安装Docker Desktop(WSL2模式)和Docker Pull网络问题解决
运维·docker·容器
zybishe2 小时前
免费送源码:Java+ssm+MySQL 酒店预订管理系统的设计与实现 计算机毕业设计原创定制
java·大数据·python·mysql·微信小程序·php·课程设计
月下雨(Moonlit Rain)4 小时前
Docker
运维·docker·容器
anlogic4 小时前
Java基础 4.12
java·开发语言
weisian1514 小时前
Java常用工具算法-7--秘钥托管云服务2(阿里云 KMS)
java·安全·阿里云
Alt.95 小时前
SpringMVC基础二(RestFul、接收数据、视图跳转)
java·开发语言·前端·mvc
寒页_5 小时前
2025年第十六届蓝桥杯省赛真题解析 Java B组(简单经验分享)
java·数据结构·经验分享·算法·蓝桥杯
技术小甜甜5 小时前
[Dify] 使用 Docker 本地部署 Dify 并集成 Ollama 模型的详细指南
运维·docker·容器·dify