Springboot项目在Jenkins+Docker中实现自动化部署
一、环境准备
描述本文开发和部署的环境基础
1、项目开发环境
1.操作系统:Windows 7或以上版本
1.开发IDE:IntelliJ IDEA 2017.2.1 x64 或者 Eclipse Jee Oxygen
2.JDK:jdk1.8.0_181或者其他1.8版本以上的jdk
3.maven:maven3.5.3 或其他3.x.x其他版本
4.版本管理:SVN
以上软件和客户端安装这里就不描述了,准备好以上环境我们就可以开发一个简单的springboot项目。
2、Jenkins+docker运行环境
1.操作系统:Centos 7
2.Jenkins : Jenkins ver. 2.138.3
3.Docker : Docker version 18.09.0, build 4d60db4
以下会详细介绍Jenkins 和 Docker 的按照步骤。
二、Docker安装
Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。
Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE。社区版CE是免费的,这里我们安装CE版本的Docker。
通过 uname -r 命令查看你当前的内核版本:
uname -r
安装一些必要的系统工具:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
添加软件源信息:
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新 yum 缓存:
sudo yum makecache fast
安装 Docker-ce:
sudo yum -y install docker-ce
启动 Docker 后台服务:
sudo systemctl start docker
测试运行 hello-world:
docker run hello-world
创建Docker工作空间目录
mkdir -p /home/work/demo
创建备份目录
cd /home/work/demo
mkdir backup
创建Dockerfile文件
cd /home/work/demo
vi Dockerfile
Dockerfile文件内容如下:
#基于openjdk:8
FROM openjdk:8
ADD demo-0.0.1-SNAPSHOT.jar demo.jar
RUN bash -c 'touch /demo.jar'
ENTRYPOINT ["java","-jar","/demo.jar"]
三、Jenkins安装
-
访问Jenkins官方网站:https://jenkins.io/
点击"Download"
选择CentOS
按照官网的描述进行在线安装
-
启动、关闭、重启jenkins服务:
sudo service jenkins start/stop/restart -
防火墙设置:
firewall-cmd –zone=public –add-port=8080/tcp –permanent
firewall-cmd –zone=public –add-service=http –permanent
firewall-cmd –reload -
访问jenkins:
在浏览器中输入http://ip:8080即可
根据提示查看/var/lib/jenkins/secrets/initialAdminPassword这个文件,将密码复制出来,粘贴,继续进入配置页面,如下图:
选择推荐的插件进行安装即可 -
注册新用户
使用新用户登录之后的页面如下图:
-
设置用户权限
选择“系统管理”-“全局安全配置”
按照如下图进行配置:将刚刚注册的用户给予最大权限、 任何用户(Anonymous Users)给予可读权限
- 全局工具配置:
配置maven,使用默认的设置即可。CentOS 安装maven请参照:https://www.cnblogs.com/HendSame-JMZ/p/6122188.html
配置JDK,使用CentOS 7中安装的JDK目录,CentOS安装JDK请参照:https://www.cnblogs.com/sxdcgaq8080/p/7492426.html
配置Docker :
配置邮件:
在“系统管理”-“系统管理”中找到如下图的配置
邮件默认内容如下:
<hr/>
(本邮件是程序自动下发的,请勿回复!)<br/><hr/>
项目名称:$PROJECT_NAME<br/><hr/>
构建编号:$BUILD_NUMBER<br/><hr/>
svn版本号:${SVN_REVISION}<br/><hr/>
构建状态:$BUILD_STATUS<br/><hr/>
触发原因:${CAUSE}<br/><hr/>
构建日志地址:<a href="${BUILD_URL}console">${BUILD_URL}console</a><br/><hr/>
构建地址:<a href="$BUILD_URL">$BUILD_URL</a><br/><hr/>
变更集:${JELLY_SCRIPT,template="html"}<br/><hr/>
四、创建一个Springboot项目
1、使用IDE创建一个简单的springboot项目,用于实现自动编译部署流程。
一路Next到:
点击Finish,在pom.xml中加入了webmvc的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
在启动类中加入hello方法
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run( DemoApplication.class, args );
}
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello() {
return "hello world";
}
}
2、将项目上传到SVN版本库
通过SVN客户端创建文件夹demo:
分享项目到SVN:
添加SVN项目路径:
选择添加的SVN路径,选择一个默认路径后点击“Share”,分享到SVN后项目中的文件名变成绿色的,此时进行提交操作,将整个项目提交到SVN:
我们可以看到SVN版本库中代码已经全部提交上来了
五、Jenkins添加任务
1、新建任务
选择“新建任务”
输入任务名称,现在“构建一个自由风格的软件项目”点击“确定”
2、配置任务
General
源码管理
选择上面项目的SVN版本库路径,增加登陆凭证
点击“Add”添加SVN版本库登陆凭证
构建触发器
配置每次 SCM 版本变更,构建
构建环境
配置每次构建前,删除工作空间
构建
配置Maven,通过Maven进行构建,编写构建完成执行的Shell脚本:
Shell 脚本(run.sh):
#操作/项目路径(Dockerfile存放的路劲)
BASE_PATH=/home/work/demo
# 源jar路径
SOURCE_PATH=/var/lib/jenkins/workspace/demo/target
#容器id
CID=$(docker ps | grep "demo" | awk '{print $1}')
DATE=`date +%Y%m%d%H%M`
# 最新构建代码 移动到项目环境
function transfer(){
echo "最新构建代码 $SOURCE_PATH/demo-0.0.1-SNAPSHOT.jar 迁移至 $BASE_PATH ...."
sudo cp $SOURCE_PATH/demo-0.0.1-SNAPSHOT.jar $BASE_PATH
echo "迁移完成"
}
# 备份
function backup(){
if [ -f "$BASE_PATH/demo-0.0.1-SNAPSHOT.jar" ]; then
echo "demo-0.0.1-SNAPSHOT.jar 备份..."
sudo cp $BASE_PATH/demo-0.0.1-SNAPSHOT.jar $BASE_PATH/backup/demo-$DATE.jar
sleep 3
sudo rm -rf $BASE_PATH/demo-0.0.1-SNAPSHOT.jar
echo "备份 demo-0.0.1-SNAPSHOT.jar 完成"
else
echo "$BASE_PATH/demo-0.0.1-SNAPSHOT.jar不存在,跳过备份"
fi
}
# 构建docker镜像
function build(){
echo "开始构建镜像..."
cd $BASE_PATH
sudo docker build -t demo .
}
# 运行docker容器
function run(){
backup
transfer
build
if [ -n "$CID" ]; then
echo "存在demo容器,CID=$CID,重启docker容器 ..."
sudo docker stop $CID
sudo docker rm $CID
sudo docker run -d -p 9120:9120 demo
echo "demo容器重启完成"
else
echo "不存在demo容器,docker run创建容器..."
sudo docker run -d -p 9120:9120 demo
echo "demo容器创建完成"
fi
}
#入口
run
构建后操作
邮件通知
在一下红框部分加入想要通知的成员邮箱,多个邮箱以“,”或空格进行分割
六、自动化构建部署
修改代码,提交SVN
修改返回“hello world”为“hello world1”,提交SVN
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello() {
return "hello world1";
}
可以看到已经开始构建了
在服务器Docker工作路径下可以看见赋值过来的jar包
通过Docker命令可以查看到demo容器已经运行起来啦
可以看到端口的映射9120,这是我们在Jenkins任务构建配置的Shell脚本中指定的
现在让我们来访问一下hello接口
到此 完成