我们每次修改代码后,需要部署到生产环境时,都要经历编译、拷贝jar包、生成镜像、启动服务这些繁琐的步骤,尤其是当我们的生产环境以集群方式部署时,还要将jar拷贝到不同的主机上,然后分别构建镜像,这些繁琐而重复的工作总是让我们不胜其烦,而持续集成工具--jenkins,可以为我们完成上面的工作
提前在jenkins构建好项目后,然后只需轻轻点一下构建按钮,jenkins将自动拉取最新的代码,然后自动完成上面的步骤,实现自动化部署
下面是一个jenkins + docker stack + springboot + github 集成部署的实战例子:
1.安装docker swarm,我搭建的环境如下
主机名称 | ip | 节点性质 |
docker01 | 192.168.12.240 | manager |
docker02 | 192.168.12.241 | worker |
docker03 | 192.168.12.242 | worker |
2.安装jenkins,安装并配置插件git、jdk、maven,具体可参考https://blog.csdn.net/u010021282/article/details/102600681。我的jenkins装在了192.168.12.240,即docker01
3.编写项目代码,我的springboot项目很简单,只有一个hello接口
@RestController
public class HelloController {
@GetMapping("/")
public String hello(){
return "hello world!";
}
}
4.代码上传至github :https://github.com/blueiiii/web.git
5.在docker01,docker02,docker03,搭建好docker镜像目录,我的目录是/root/package,按照如下指令可完成构建
# 生成package目录
mkdir /root/package
vim docker-compose.yml
docker-compose.yml如下
version: "3"
services:
#注册中心
web:
build:
context: ./web
image: web:latest
deploy:
mode: replicated
replicas: 1
#endpoint_mode: dnsrr
restart_policy:
#none、on-failure、any(默认)
condition: any
#尝试重启的等待时间默认为0
delay: 10s
#放弃之前尝试重新启动容器次数默认从不放弃
max_attempts: 10
#决定重新启动是否成功之前的等时间
window: 120s
resources:
#资源限制
limits:
cpus: '0.95'
memory: 2048M
#资源保留
reservations:
cpus: '0.1'
memory: 50M
ports:
- "8088:8088"
接着生成docker镜像上下文目录
# 生成web目录
mkdir /root/package/web
# 进入web目录
cd /root/package/web
# 编写Dockerfile
vim Dockerfile
Dockerfile如下:
#继承基础镜像
FROM openjdk:8
#维护者信息
MAINTAINER blue
#将本机docker目录临时文件挂载到镜像的/tmp目录[tomcat使用的默认目录-用于数据持久化]
VOLUME /tmp
#将本机Dockfile所在目录文件拷贝并重命名到镜像中
ADD spring-boot-web-0.0.1.jar app.jar
#暴露端口给容器
EXPOSE 8088
#启动容器时执行的命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/.urandom","-Dfile.encoding=UTF-8","-server","-Xms128m","-Xmx128m","-Xss256k","-Xmn48m","-jar","/app.jar"]
docker02,docker03 如法炮制,也可以直接使用scp指令拷贝
6.进入jenkins页面,在系统配置中找到Publish Over SSH插件,进行配置(如果没有找到Public Over SSH,则需要去插件管理安装)
注意:
1.上面的key指的ssh的私钥,这里填了密码,应该就不用填私钥了
2.SSH servers的配置列表docker01,docker02,docker03都要配置,因为docker swarm服务要求每个实例上都要生成镜像
7.构建jenkin项目
新建item->输入项目名->Freestyle project->确定
源码管理使用git,填入github中的项目地址,然后点击下面添加按钮,输入giehub账号信息
输入giehub账号信息:
构建选择 Invoke top-level Maven targets,输入如下
继续增加构建步骤,选择 Send files or execute commands over SSH
Exec command的内容被挡住了,内容如下:
cd /root/package/web
docker rmi web
docker build -t web .
解释一下,这里的作用就是在我们的项目编译成功后,自动将编译的jar包拷贝到docker01的、root/package/web目录,并生成镜像
docker02,docker03这里也要进行一样的配置
接着,添加构建后步骤,选择 Send build artifacts over SSH:
这里的作用是:启动docker stack,只需要在manager执行即可,所以这里只需要配置docker01
点击左下方的保存,项目配置完成
8.构建
点击build now,开始构建项目
构建完成后,进入docker01,查看服务是否正常启动:
docker service ls
服务名: docker stack deploy 指定工程名称+"_"+docker-compose.yml的子服务名,所以我的服务名是: test_web,能看到说明已经正常启动
浏览器访问 192.168.12.240:8088(docker01:8088):
访问成功,jenkins一键部署项目完成!