八、Docker+jenkins+maven+github+阿里云镜像仓库持续化部署spring boot项目

0. 提前准备:(可参考前面的博文)

1) CentOS服务器(阿里云ECS)
2) CentOS安装Docker
3)Docker安装Jenkins
4)Docker安装Portainer(非必须)
5)开通阿里云容器镜像服务

1. 创建一个Spring Boot项目docker-test,加入docker配置**

1)POM.xml文件如下

<?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>

    <groupId>com.kevin</groupId>
    <artifactId>docker-test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>docker-test</name>
    <description>Demo project for Docker Test</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <java.version>1.8</java.version>
        <skipTests>true</skipTests>
        <maven.build.version>${version}-${maven.build.timestamp}</maven.build.version>
        <maven.build.timestamp.format>yyyyMMddHHmmss</maven.build.timestamp.format>
        <docker.image.prefix>registry.cn-beijing.aliyuncs.com/kevin4j</docker.image.prefix>
    </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>${project.artifactId}.${maven.build.timestamp}</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>

            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.4.14</version>
                <configuration>

                    <!-- 注意imageName一定要是符合正则[a-z0-9-_.]的,否则构建不会成功 -->
                    <imageName>${docker.image.prefix}/${name}</imageName>
                    <imageTags>
                        <imageTag>${maven.build.version}</imageTag>
                    </imageTags>

                    <!-- 指定Dockerfile所在的路径 -->
                    <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>

                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.artifactId}.${maven.build.timestamp}.jar</include>
                        </resource>
                    </resources>

                    <!-- 与maven配置文件settings.xml一致 -->
                    <serverId>kevin4j-registry</serverId>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

说明:
docker.image.prefix 填写镜像仓库的命名空间地址
build引入docker-maven-plugin
imageName 镜像名称,对应云镜像仓库地址
imageTag 镜像版本号
dockerDirectory Dockerfile所在的路径
resource 构建镜像所含的资源文件
serverId 对应maven配置文件中的server配置

2) src/main/docker加入Dockerfile配置文件

FROM openjdk:8-jdk-alpine
WORKDIR /kevin4j
ADD *.jar docker-test.jar
ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Duser.timezone=GMT+08 -Dfile.encoding=UTF-8 -server -Xverify:none  -jar  ${jvmoptions}  docker-test.jar --spring.profiles.active=${profile}

3) 提供一个测试接口

@Controller
@ResponseBody
public class HelloController {

    @RequestMapping("/sayHello")
    public String sayHello(String name){
        return "Hello "+ (StringUtils.isEmpty(name) ? "World" : name);
    }
}

4)将项目上传至github(git)

2. jenkins配置maven

1)在jenkins->全局工具配置Maven自动安装

在这里插入图片描述

2)找到jenkins下maven的配置文件并加入server配置

/var/lib/docker/volumes/jenkins_home/_data/tools/hudson.tasks.Maven_MavenInstallation/maven/conf/settings.xml
在这里插入图片描述
加入以下配置:都是必填

<server>
  <id>kevin4j-registry</id>
  <username>阿里云账号</username>
  <password>镜像仓库密码</password>
  <configuration>
	<email>阿里云绑定的邮箱</email>
  </configuration>
</server>

3. jenkins配置任务

1)jenkins->系统配置中配置SSH Server,用来连接到服务器并执行脚本

在这里插入图片描述

2)jenkins->新建任务->构建一个maven项目

配置源码github

在这里插入图片描述

配置docker地址环境变量

在这里插入图片描述

配置打包指令

在这里插入图片描述

上传镜像后服务端执行指令,停止并删除服务,从镜像仓库拉取最新镜像并运行

在这里插入图片描述

start.sh脚本内容如下
#!/bin/sh

version=""

if [ "$1" ];then
	version=$1
else
	version="latest"
fi

docker stop docker-test
docker rm docker-test
docker login -u "镜像仓库账号" -p "镜像仓库密码" registry.cn-beijing.aliyuncs.com
docker pull registry.cn-beijing.aliyuncs.com/kevin4j/docker-test:$version
docker run -e profile='dev' --name docker-test --restart=always -p 8090:8090 -v /etc/localtime:/etc/localtime:ro  -v /kevin4j/docker-test/logs:/kevin4j/logs -d registry.cn-beijing.aliyuncs.com/kevin4j/docker-test:$version

3)执行任务,查看控制台输出

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4)调用服务,大功告成,注意服务器的安全组需要开放8090端口公网才可访问

在这里插入图片描述

可能存在问题:

1. 执行start.sh脚本时提示/bin/sh^M:bad interpreter: No such file or directory

原因:该脚本文件在windows系统中编辑过,引入了不可见的字符,这是不同系统的编码格式所致!

解决方案:
1.删除该脚本文件
rm start.sh //确保windows系统有备份
2.新建脚本文件
touch start.sh
3.修改脚本文件的权限
chmod 755 start.sh //增加脚本可执行权限
4.编辑脚本内容
vim start.sh
再将脚本内容复制过来,保存退出即可。(xshell软件操作)

猜你喜欢

转载自blog.csdn.net/guangcaiwudong/article/details/103027976