Jenkins自动化部署实战:从代码提交到Docker容器运行
Executive Summary
核心观点(金字塔原理)
结论先行: 通过Jenkins+Docker+GitHub的组合,可实现代码提交后自动构建、打包、部署的完整CI/CD流水线
支撑论点:
- 触发机制:GitHub webhook触发Jenkins构建任务,实现代码推送即部署
- 构建流程:Maven打包 -> JAR迁移 -> Docker镜像构建 -> 容器运行
- 运维保障:自动备份旧版本JAR,支持容器停止/删除/重建的完整生命周期管理
SWOT 分析
| 维度 | 分析 |
|---|---|
| S 优势 | 提供完整可运行的Shell脚本和Dockerfile,可直接复用 |
| W 劣势 | 未涵盖失败通知、回滚机制、多环境配置等生产级需求 |
| O 机会 | 适用于小型团队快速搭建自动化部署能力 |
| T 威胁 | 单机部署存在单点故障风险,无高可用设计 |
适用场景
- 个人项目或小团队的持续集成/持续部署入门实践
- SpringBoot + Docker技术栈的自动化部署方案参考
目标

开始
1. 准备好一个简单SpringBoot项目 参考jenkinsDemo
2. 从jenkins官网下载安装好jenkins软件, 并启动
3. jenkins创建任务流程
- 新建任务, 填写一个任务名称(jenkins-demo), 选择构建一个maven项目, 确定完成。
- 对jenkins-demo进行配置工作
- 选择Github项目, 项目URL
https://github.com/MichaelYgZhang/JenkinsDemo - 源码管理选择Git 仓库输入
https://github.com/MichaelYgZhang/JenkinsDemo.git, 如果需要权限则加入权限即可 - 构建触发器选择勾选 GitHub hook trigger for GITScm polling
- Pre Steps Build:
- Root POM:
pom.xml - Goals and options:
clean package -Dmaven.test.skip=true -U
- Root POM:
- Post Steps: 选择执行shell
- 选择Github项目, 项目URL
#操作/项目路径(Dockerfile存放的路劲)
BASE_PATH=/Users/michael/Gaia/DevOps/jenkins-work-space
# 源jar路径
SOURCE_PATH=/Users/michael/.jenkins/workspace
#docker 镜像/容器名字或者jar名字 这里都命名为这个
SERVER_NAME=jenkins-demo
#容器id
CID=$(docker ps -a | grep "$SERVER_NAME" | awk '{print $1}')
#镜像id
IID=$(docker images | grep "$SERVER_NAME" | awk '{print $3}')
DATE=`date +%Y%m%d%H%M`
# 最新构建代码 移动到项目环境
function transfer(){
echo "最新构建代码$SOURCE_PATH/$SERVER_NAME/target/$SERVER_NAME.jar.迁移至$BASE_PATH...."
cp $SOURCE_PATH/$SERVER_NAME/target/$SERVER_NAME.jar $BASE_PATH
echo "迁移完成"
}
# 备份
function backup(){
if [ -f "$BASE_PATH/$SERVER_NAME.jar" ]; then
echo "$SERVER_NAME.jar备份..."
cp $BASE_PATH/$SERVER_NAME.jar $BASE_PATH/backup/$SERVER_NAME-$DATE.jar
echo "备份$SERVER_NAME.jar完成"
else
echo "$BASE_PATH/$SERVER_NAME.jar不存在,跳过备份"
fi
}
# 构建docker镜像
function build(){
# 如果容器已经启动则停止,并且删除容器
if [ -n "$CID" ]; then
echo "存在$SERVER_NAME容器正在运行中,CID=$CID"
docker stop $CID
echo "已停止$SERVER_NAME容器,CID=$CID"
docker rm $CID
echo "已删除$SERVER_NAME容器,CID=$CID容器"
fi
# 如果存在镜像则删除,然后重新构建.如果不存在镜像,则新创建镜像
if [ -n "$IID" ]; then
docker rmi $IID
echo "存在$SERVER_NAME镜像,IID=$IID,已删除."
cd $BASE_PATH
docker build -t $SERVER_NAME .
echo "存在$SERVER_NAME镜像,IID=$IID 已重新构造完成."
else
echo "不存在$SERVER_NAME镜像,开始构建镜像"
cd $BASE_PATH
docker build -t $SERVER_NAME .
fi
}
# 运行docker容器
function run(){
backup
transfer
build
docker run --name $SERVER_NAME -d -p 8091:8091 $SERVER_NAME
echo "$SERVER_NAME容器创建完成"
# 容器直接全部重启
#if [ -n "$CID" ]; then
# echo "存在$SERVER_NAME容器,CID=$CID,重启docker容器 ..."
# docker restart $SERVER_NAME
# echo "$SERVER_NAME容器重启完成"
#else
# echo "不存在$SERVER_NAME容器,docker run创建容器..."
# docker run --name $SERVER_NAME -d -p 8091:8091 $SERVER_NAME
# echo "$SERVER_NAME容器创建完成"
#fi
}
#入口
run
Dockerfile
- 目录:
/Users/michael/Gaia/DevOps/jenkins-work-space当前目录下有文件:Dockerfile, jenkins-demo.jar和backup文件夹, 备份用的
FROM openjdk:8-jdk-alpine
COPY jenkins-demo.jar /opt
WORKDIR /opt
CMD java -jar jenkins-demo.jar
后续优化方向
- 基本完成自动化部署的流程
- 深入研究每个部分配置, 比如失败打包邮件通知, 参数配置, 发布仓库, 上线流程控制等等