** 基础配置 Jenkins maven docker Git **

一,Jenkins配置

1)打开Jenkins构建一个任务,任务选取maven项目,取名docker_test,如下图所示

docker下springboot jenkins 部署 jenkins部署springboot到docker_jar

2)Jenkins中配置源码管理,切记要配置Git用户名密码

docker下springboot jenkins 部署 jenkins部署springboot到docker_docker_02

3)Jenkins中配置构建环境

docker下springboot jenkins 部署 jenkins部署springboot到docker_spring_03

4)Jenkins配置项目构建完成后,执行shell脚本(这一步才是向docker部署的关键),配置完成后保存配置即可

docker下springboot jenkins 部署 jenkins部署springboot到docker_spring_04

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

docker下springboot jenkins 部署 jenkins部署springboot到docker_jar_05

2)shell脚本构建日志,从中可以看见在执行脚本时,做了备份,创建镜像,启动容器

docker下springboot jenkins 部署 jenkins部署springboot到docker_spring_06

3)docker查看镜像,容器进程

docker images 查看镜像

docker下springboot jenkins 部署 jenkins部署springboot到docker_jar_07

docker  ps -a 查看容器进程

docker下springboot jenkins 部署 jenkins部署springboot到docker_docker_08

由此我们可以看出,容器已经启动,且容器内的Java实例也已经启动

浏览器测试,至此集成完成

docker下springboot jenkins 部署 jenkins部署springboot到docker_jar_09

 

写在最后的话:在集成过程中遇见的一些问题

①,查看容器进程是PORTS部分为空值,访问Java实例,提示端口拒绝链接,原因是Java实例未启动,只是容器启动了

②,容器于Java实例的端口最好配置一直,这样就可以直接用实例中的端口访问实例

③,Jenkins配置时,一定要清理工作空间,否则Build部分会一直找不到你的pom文件。一定要配置Git用户名密码,否则一直会创建失败

④,docker操作目录配置时,一定尽量少的放置文件,因为这些文件都会做成镜像放在你的容器里,导致你的容器很大