大致分为六个步骤
1. idea新建mvn项目,编写测试接口
2. 安装gitee插件
3. jenkins配置gitee
4. jenkins新建mvn项目并配置
5. 测试触发构建功能
6. 编写Dockerfile,shell脚本,构建镜像,创建运行容器
1、安装Tomcat、jenkins、mvn
参考https://www.jianshu.com/p/686e534a6fec
2、docker安装
参考https://www.jianshu.com/p/9bd3ed0b336b
注意:安装docker修改其加速镜像为阿里云的
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
一、idea新建mvn项目,编写测试接口
在idea中新建mvn项目,提交到gitee上,此步骤省略。
二、给jenkins安装gitee插件
安装完成插件之后重启jenkins服务
三、jenkins配置gitee
1、链接名:可按自己想法填写
2、Gitee 域名 URL: https://gitee.com,或者按gitee官方提示 (码云私有化客户输入部署的域名)
3、证书令牌:
3.1 点击新建
3.2、访问蓝色背景处的链接,在gitee上获取私人令牌
3.3、点击提交,系统会生成一串字符,复制过来填进去就OK了,ID和描述可按自己需求填写,没有什么限制条件
4、点击测试链接,完美的配置成功
5、保存返回
四、jenkins新建mvn项目并配置
1.源码配置
2、准备构建
3、构建设置以及shell
echo '脚本启动了'
if [ $(docker ps -a -q) != "" ]; then
echo "停止所有运行中的容器"
docker stop $(docker ps -a -q)
echo "删除所有容器"
docker rm $(docker ps -a -q)
fi
echo "启动helloworld"
/var/docker/docker_run.sh helloword "-p 8888:8888" "-m 0.5g"
docker_run.sh在服务的/var/docker下,内容为:
#!/bin/bash
#defined
export JAVA_HOME=/usr/local/java/jdk1.8.0_11
IMAGE="$1"
PORT="$2"
OPTIONS=""
JVM=""
#param validate
if [ $# -lt 2 ]; then
echo "you must use like this : ./deploy_run.sh <image> <port> [options]"
exit
fi
if [ "$3" != "" ]; then
OPTIONS="$3"
fi
if [ "$4" != "" ]; then
JVM="$4"
fi
#拿到容器ID后kill掉并删除。
delete_container(){
echo "the container id is $1"
if [ -n "$1" ]; then
echo "delete container:" $1
docker stop $1
docker rm -f $1
fi
}
echo ">>> Get old image $IMAGE container id"
CID=$(docker ps | grep "${IMAGE}" | awk '{print $1}')
#因为jenkins每次的build的时候,如果镜像的tag没有指定,那么新的镜像build成功后,之前的镜像名称就会变成none。
#所以我们找出为名字为none的就是之前的镜像。
if [ ! -n "$CID" ]; then
echo "get old image id"
OLD_IMAGE_IDS=$(docker images --no-trunc| grep none | awk '{print $3}')
echo $OLD_IMAGE_IDS
if [ -n "$OLD_IMAGE_IDS" ]; then
if [ -n ${OLD_IMAGE_IDS[1]} ]; then
for OLD_IMAGE_ID in $OLD_IMAGE_IDS
do
CID=$(docker ps | grep "${OLD_IMAGE_ID:0:12}" | awk '{print $1}')
echo "CID:" $CID
delete_container $CID
done
else
echo "OLD_IMAGE_IDS:" $OLD_IMAGE_IDS
delete_container $OLD_IMAGE_IDS
fi
fi
else
delete_container $CID
fi
#启动容器
echo "docker run -d $JVM -v /mnt:/mnt ${PORT} $IMAGE $OPTIONS"
docker run -d $JVM -v /mnt:/mnt ${PORT} $IMAGE $OPTIONS
echo "clean docker images"
#再次清理名称为none的docker镜像。
docker images --no-trunc| grep none | awk '{print $3}' | xargs -r docker rmi -f
#清理所有已经退出的容器
#docker rm `docker ps -a | grep Exited | awk '{print $1}'`
echo "finished"
五、测试触发构建功能
控制台输出
六、访问测试结果
备注:
项目结构中包含dockerfile
其内容为:
FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD helloworld.jar app.jar
EXPOSE 8888
ENTRYPOINT ["java","-D java.security.egd=file:/dev./urandom","-jar","/app.jar"]
pom文件中要包含docker打包工具:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>helloword</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>helloword</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>helloworld</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- docket 容器打包插件 -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<executions>
<!--绑定build命令到mvn package中-->
<execution>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
<!--绑定push命令到mvn deploy中-->
<execution>
<id>push-image</id>
<phase>deploy</phase>
<goals>
<goal>push</goal>
</goals>
</execution>
</executions>
<configuration>
<imageName>${project.artifactId}</imageName>
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
</project>