** 基础配置 Jenkins maven docker Git **
一,Jenkins配置
1)打开Jenkins构建一个任务,任务选取maven项目,取名docker_test,如下图所示
2)Jenkins中配置源码管理,切记要配置Git用户名密码
3)Jenkins中配置构建环境
4)Jenkins配置项目构建完成后,执行shell脚本(这一步才是向docker部署的关键),配置完成后保存配置即可
shell脚本代码如下,具体解释请看代码
#操作/项目路径(Dockerfile存放的路劲)
BASE_PATH=/docker/docker_test
# 源jar路径
SOURCE_PATH=/root/.jenkins/workspace
#docker 镜像/容器名字或者jar名字 这里都命名为这个
SERVER_NAME=docker_test
#jar包版本
JAR_NAME=docker-test
VERSION=1.0.1
#容器id
CID=$(docker ps | 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/$JAR_NAME-$VERSION.jar 迁移至 $BASE_PATH ...."
cp $SOURCE_PATH/$SERVER_NAME/target/$JAR_NAME-$VERSION.jar $BASE_PATH
echo "迁移完成"
}
# 备份
function backup(){
if [ -f "$BASE_PATH/$JAR_NAME-$VERSION.jar" ]; then
echo "$JAR_NAME-$VERSION.jar 备份..."
cp $BASE_PATH/$JAR_NAME-$VERSION.jar $BASE_PATH/backup/$JAR_NAME-$VERSION-$DATE.jar
echo "备份 $JAR_NAME-$VERSION.jar 完成"
else
echo "$BASE_PATH/$JAR_NAME-$VERSION.jar不存在,跳过备份"
fi
}
# 构建docker镜像
function build(){
if [ -n "$IID" ]; then
echo "存在$JAR_NAME-$VERSION镜像,IID=$IID"
else
echo "不存在$JAR_NAME-$VERSION镜像,开始构建镜像"
cd $BASE_PATH
docker build -t $JAR_NAME-$VERSION .
fi
}
# 运行docker容器
function run(){
backup
transfer
build
if [ -n "$CID" ]; then
echo "存在$JAR_NAME-$VERSION容器,CID=$CID,重启docker容器 ..."
docker restart $JAR_NAME-$VERSION
echo "$JAR_NAME-$VERSION容器重启完成"
else
echo "不存在$JAR_NAME-$VERSION容器,docker run创建容器..."
docker run --name $JAR_NAME-$VERSION -v $BASE_PATH:$BASE_PATH -d -p 9091:9091 $JAR_NAME-$VERSION
echo "$JAR_NAME-$VERSION容器创建完成"
fi
}
#入口
run
二,docker配置,该配置比较简单
1)创建操作目录,并创建Dockerfile文件,因为我目录已创建,所以只贴出Dockerfile文件内容
mkdir -p /docker/docker_test
Dockerfile 文件内容如下
#基于openjdk:8
FROM java:8
# 指定当前操作目录
WORKDIR /docker/docker_test
#容器启动后执行的操作
CMD java -jar docker-test-1.0.1.jar
2)因为在shell脚本中写了备份jar的部分,所以还需创建一个备份目录
mkdir -p /docker/docker_test/backup
三,spring boot项目相关配置如下
1)properties配置
#项目名称
spring.application.name=docker_test
#服务端口
server.port=9091
#项目访问根路径
server.servlet.context-path=/docker_test
2)pom文件配置
<?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 https://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.4.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.docker</groupId>
<artifactId>docker-test</artifactId>
<version>1.0.1</version>
<name>test</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<docker.image.prefix>docker_test</docker.image.prefix>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.restdocs</groupId>
<artifactId>spring-restdocs-mockmvc</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.asciidoctor</groupId>
<artifactId>asciidoctor-maven-plugin</artifactId>
<version>1.5.8</version>
<executions>
<execution>
<id>generate-docs</id>
<phase>prepare-package</phase>
<goals>
<goal>process-asciidoc</goal>
</goals>
<configuration>
<backend>html</backend>
<doctype>book</doctype>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.springframework.restdocs</groupId>
<artifactId>spring-restdocs-asciidoctor</artifactId>
<version>${spring-restdocs.version}</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.1.RELEASE</version>
<configuration>
<mainClass>
com.docker.test.TestApplication
</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- Docker maven plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
<!-- Docker maven plugin -->
</plugins>
</build>
</project>
3)controller类配置
@GetMapping(value = "/getTest")
public String getTest(){
return "Hello word";
}
}
四,以上所有配置完成,启动测试。
1)Jenkins自动部署测试,项目构建成功后jar包存放在 /root/.jenkins/workspace/docker_test/target/docker-test-1.0.1.jar
2)shell脚本构建日志,从中可以看见在执行脚本时,做了备份,创建镜像,启动容器
3)docker查看镜像,容器进程
docker images 查看镜像
docker ps -a 查看容器进程
由此我们可以看出,容器已经启动,且容器内的Java实例也已经启动
浏览器测试,至此集成完成
写在最后的话:在集成过程中遇见的一些问题
①,查看容器进程是PORTS部分为空值,访问Java实例,提示端口拒绝链接,原因是Java实例未启动,只是容器启动了
②,容器于Java实例的端口最好配置一直,这样就可以直接用实例中的端口访问实例
③,Jenkins配置时,一定要清理工作空间,否则Build部分会一直找不到你的pom文件。一定要配置Git用户名密码,否则一直会创建失败
④,docker操作目录配置时,一定尽量少的放置文件,因为这些文件都会做成镜像放在你的容器里,导致你的容器很大