前面我们安装了docker,安装了jenkins,那接下来我们就要大展拳脚,把他们弄到一起玩玩了。膨胀!膨胀!膨胀!
一、准备工作
1.1、虚拟机上安装jdk、git、maven、docker、jenkins
1.2、准备一个springboot项目,可以像我这样的
配置文件是这样的:
还有这样的:
就这么一个简单的springboot项目
1.3、为了看看docker是怎么工作的,我们先做个实验,大家也可以跳过这一段
1.3.1、将项目打个jar包,传到虚拟机里
1.3.2、然后我们新建一个Dockerfile文件
Dockerfile里面是这样的
我这里解释的可能不对,大家可以多看看网上大佬们写的Dockerfile。
1.3.3、接下来我们用docker build命令把jar打成镜像
来看看我们打的镜像在不在
看来镜像已经打好了
1.3.4、运行镜像
我们用docker run命令来运行镜像
我们访问一下试试,记得开防火墙的端口哦
访问成功。这个案例可以让大家对docker有所了解。
1.4、改造我们的springboot项目
因为我们的项目要打成镜像,所以需要加一个dockerfile文件和dockerfile-maven-plugin的插件
1.4.1、dockerfile:
#依赖基础镜像
FROM java:8
#镜像作者
MAINTAINER hailin
#执行脚本/命令
#RUN localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
#卷
VOLUME /tmp
ARG JAR_FILE
#复制文件 jar包 镜像名
ADD ${JAR_FILE} /jenkins-test-1001.jar
#参数
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/jenkins-test-1001.jar"]
1.4.2、dockerfile-maven-plugin
<build>
<finalName>jenkins-test-1001</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.10</version>
<configuration>
<!--这里指定打包镜像的名称-->
<repository>${project.artifactId}</repository>
<!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
</plugins>
</build>
1.4.3、然后将项目上传到gitee上,如果你嫌麻烦,也可以用我弄好的这个
https://gitee.com/jiahailin/jenkins-test.git
二、配置jenkins
1.1系统管理-》全局工具配置,将jdk、maven、git都配置好
1.2、新建任务
1.3、随便填一下构建策略
1.4、配置git
1.5、构建jar包
1.6、构建成功后
构建成功后,我们需要把jar包打成docker镜像,然后运行起来,这就需要用到shell命令了
echo "build docker image"
mvn dockerfile:build
echo "current docker images:"
docker images | grep jenkins-test-1001
echo "start container----->"
docker run -d -p 1001:1001 --name jenkins-test-1001 jenkins-test-1001
echo "start success!"
1.7、执行
上面就完成了配置,点击保存后,我们来到首页
可以点击这里开始执行构建,或者点进去,点立即构建
构建完成,我们查看一下镜像和容器
这里看到镜像已经构建好了,并且已经运行起来了,然后访问页面
到这里就算是成功了!
三、优化
1.1、我们想要的是下次代码修改后再构建,可以删除旧的镜像,重新打成新的镜像,并且运行起来。那么开始修改
echo "stop container"
docker stop jenkins-test-1001
echo "delete container"
docker rm jenkins-test-1001
echo "delete image"
docker rmi jenkins-test-1001
echo "build docker image"
mvn dockerfile:build
echo "current docker images:"
docker images | grep jenkins-test-1001
echo "start container----->"
docker run -d -p 1001:1001 --name jenkins-test-1001 jenkins-test-1001
echo "start success!"
增加了三个命令,其他的都不变,这时候再构建的话,就会把之前旧的容器和镜像删除掉。
1.2、我们测试一下
先随便修改一下项目,然后提交到git
再次点击构建,构建成功后访问接口
大功告成!
2.1、继续优化
上面虽然成功了,可是,这就完美了吗?如果我们手动将docker中的容器删除掉
再次构建,发现会报错
就是执行docker stop jenkins-test-1001的时候发现这个容器不存在了。。。。。。。。。。。。。。。
那我们就给个判断,如果容器存在就停止,然后删除,如果容器不存在,那么就直接构建
2.2、继续优化
echo "stop and delete container"
CID=$(docker ps | grep "jenkins-test-1001" | awk '{print $1}')
if [ -n "$CID" ]; then
echo "has container,CID=$CID"
docker stop $CID
docker rm $CID
fi
echo "delete image"
docker rmi jenkins-test-1001
echo "build docker image"
mvn dockerfile:build
echo "current docker images:"
docker images | grep jenkins-test-1001
echo "start container----->"
docker run -d -p 1001:1001 --name jenkins-test-1001 jenkins-test-1001
echo "start success!"
2.3、测试
我们本地代码再修改一下,并提交到gitee上
重新构建,构建完成后访问接口
这,除了完美我还能说什么