SpringCloud+Docker+Jenkins+GitLab+Maven实现自动化构建与部署实战
程序员闪充宝 文章源自JAVA秀-https://www.javaxiu.com/33902.html
收录于话题文章源自JAVA秀-https://www.javaxiu.com/33902.html
#实战11文章源自JAVA秀-https://www.javaxiu.com/33902.html
#程序员闪充宝3文章源自JAVA秀-https://www.javaxiu.com/33902.html
#经验分享7文章源自JAVA秀-https://www.javaxiu.com/33902.html
作者:寅务文章源自JAVA秀-https://www.javaxiu.com/33902.html
来源:https://www.jianshu.com/p/bdb0642b7495文章源自JAVA秀-https://www.javaxiu.com/33902.html
1、前言与初衷
本文章会涉及Docker常见命令基础知识点结合不同场景实操一起使用。文章源自JAVA秀-https://www.javaxiu.com/33902.html
本文章会涉及结合工作过程中部署不同环境服务器的项目案例场景为初心进行实际细讲。文章源自JAVA秀-https://www.javaxiu.com/33902.html
本文章主要讲述Docker、Jenkins、GitLab、Git、JDK、SpringBoot、Maven等技术结合实现自动化运维部署(DevOps)应用工程,适合SpringCloud部署。文章源自JAVA秀-https://www.javaxiu.com/33902.html
初衷想法:在学习过程中遇到比较有趣的问题、然而花了点心血和时间去整理,然而进行梳理出来一份文章比较完整有知识体系的DevOps自动化构建与部署工程文章,技术知识内容比较多,而且文章内容较长,然而分了几个章程来讲述文章源自JAVA秀-https://www.javaxiu.com/33902.html
2、什么是DevOps?
DevOps(Development和Operations的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合,它是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。文章源自JAVA秀-https://www.javaxiu.com/33902.html
它的出现是由于软件行业日益清晰地认识到:为了按时交付软件产品和服务,开发和运营工作必须紧密合作。文章源自JAVA秀-https://www.javaxiu.com/33902.html
3、需要准备的工作有哪些
4.1 工程结构文章源自JAVA秀-https://www.javaxiu.com/33902.html
打开IDEA或Eclipse新建一个SpringBoot的应用.文章源自JAVA秀-https://www.javaxiu.com/33902.html
文章源自JAVA秀-https://www.javaxiu.com/33902.html
文章源自JAVA秀-https://www.javaxiu.com/33902.html
文章源自JAVA秀-https://www.javaxiu.com/33902.html
4.2、SpringBoot配置和代码详解文章源自JAVA秀-https://www.javaxiu.com/33902.html
4.2.1工程的pom.xml配置文章源自JAVA秀-https://www.javaxiu.com/33902.html
SpringBoot和Docker依赖的jar配置文章源自JAVA秀-https://www.javaxiu.com/33902.html
<dependencies><!-- Springboot依赖的Jar包 --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><!-- Springboot热部署jar--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional></dependency><!--yml配置文件提示插件--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional></dependency><!-- spring-boot测试jar --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope></dependency> </dependencies> <build> <finalName>springboot</finalName> <!-- 一定要声明如下配置 打包xml 到Jar包 --> <!-- <resources> <resource> <directory>src/main/java</directory> 是否替换资源中的属性 <filtering>false</filtering> </resource> </resources> <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory> --> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <!-- 默认支持jdk1.8编译 --> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin><!--docke rmaven编译插件--> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.4.12</version> <configuration> <dockerDirectory>${project.basedir}</dockerDirectory> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <mainClass>com.flong.SpringbootApplication</mainClass> </manifest> </archive> </configuration> </plugin> </plugins></build>
4.2.2 no main manifest attribute错误解决文章源自JAVA秀-https://www.javaxiu.com/33902.html
配置工程主入口文章源自JAVA秀-https://www.javaxiu.com/33902.html
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <mainClass>com.flong.SpringbootApplication</mainClass> </manifest> </archive> </configuration></plugin>
4.2.3 env环境变量文件文章源自JAVA秀-https://www.javaxiu.com/33902.html
用于设置环境动态参数,文件是以.env为格式文章源自JAVA秀-https://www.javaxiu.com/33902.html
JAVA_OPTS_DEFAULT=-Xmx512m文章源自JAVA秀-https://www.javaxiu.com/33902.html
4.2.4 Dockerfile打包工程镜像细讲文章源自JAVA秀-https://www.javaxiu.com/33902.html
以开发环境的Dockerfile为例,如果是测试环境则,把所有路径包含springboot_dev改成springboot_test文章源自JAVA秀-https://www.javaxiu.com/33902.html
FROM frolvlad/alpine-oraclejdk8:slimMAINTAINER jilongliang@sina.comRUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeRUN mkdir -p /home/devsoft/springboot_devWORKDIR /home/devsoft/springboot_devEXPOSE 7011ADD ./target/springboot.jar ./CMD java ${JAVA_OPTS_DEFAULT} -Djava.security.egd=file:/dev/./urandom -jar springboot.jar
参数说明文章源自JAVA秀-https://www.javaxiu.com/33902.html
文章源自JAVA秀-https://www.javaxiu.com/33902.html
WORKDIR 工作目录说明进入容器此时会有一个.jar是在Dockerfile的ADD添加进去文章源自JAVA秀-https://www.javaxiu.com/33902.html
docker exec -it 容器名称或容器id /bin/sh 或要使用sh和bash要看COMMAND,-itdocker exec -it 容器名称或容器id/bin/bash
文章源自JAVA秀-https://www.javaxiu.com/33902.html
4.2.5 build.sh文件shell脚本详解文章源自JAVA秀-https://www.javaxiu.com/33902.html
注意点1:经过测试动态变量的【等号】不能有空格和tab键置位,否则获取不了值,而且在shell脚本代码里面不支持空格格式化,支持tab置位格式化。在终端(ssh软件端)或Jenkins客户端shell命令,『位置变量』的参数以空格隔开。如:sh build.sh 192.168.1.235 springboot 0.0.1 7011 /home/jenkins/workspace/springboot_dev文章源自JAVA秀-https://www.javaxiu.com/33902.html
IMG_VERSION这个IMG_VERSION版本(tag)参数不指定默认latest文章源自JAVA秀-https://www.javaxiu.com/33902.html
注意点2:通常情况下Docker是默认执行Dockerfile,但是可以自定义后缀文件进行编译,前提必须要-f(force)强制指定文件进行运行文章源自JAVA秀-https://www.javaxiu.com/33902.html
#!/usr/bin/env bash# 动态变量的【等号】不能有空格和tab键置位,否则获取不了值,而且在shell脚本代码里面不支持空格格式化,支持tab置位格式化。# 在终端(ssh软件端)或Jenkins客户端shell命令,参数以空格隔开。如:sh build.sh 192.168.1.235 springboot 0.0.1 7011 /home/jenkins/workspace/springboot_dev IMG_SERVER="$1"IMG_NAME="$2"IMG_VERSION="$3"IMG_PORT="$4"RUN_EVN="$5"IMG_PATH="$6"echo "服务地址:$IMG_SERVER"echo "工程镜像名称:$IMG_NAME"echo "工程版本号:$IMG_VERSION"echo "工程端口:$IMG_PORT"echo "服务环境:$RUN_EVN"#私服访问url路径和编译之后镜像文件存放到指定路径固定,不动态参数进行处理传值.REGISTRY_URL="192.168.1.235:5000"IMG_TAR_GZ_PATH="/home/img_tar_gz_path/"# 判断动态参数不为空字符串的时候才执行下面操作if [ "$IMG_SERVER" != "" ] && [ "$IMG_NAME" != "" ] && [ "$IMG_VERSION" != "" ] && [ "$IMG_PORT" != "" ]; then echo " .......进入删除 Container & Images 操作 ......." # 清理虚悬镜像,释放磁盘空间 #docker images|grep none|awk '{print $3 }'|xargs docker rmi # 获取容器ID CONTAINER_ID=`docker ps -a | grep $IMG_NAME | awk '{ print $1 }'` # 获取镜像ID IMAGE_ID=`docker images | grep $IMG_NAME | awk '{ print $3 }'` # 判断是否存在删除开发容器 if [[ "$CONTAINER_ID" != "" ]]; then docker rm -f $CONTAINER_ID fi # 判断是否存在删除开发镜像 if [[ "$IMAGE_ID" != "" ]]; then docker rmi -f $IMAGE_ID fi # $IMG_NAME:$IMG_VERSION 这个IMG_VERSION版本(tag)参数不指定默认latest,通过不同参数执行不同环境文件 # -f 表示强制指定Dockerfile文件进行编译 echo " .......进入Building & Images 操作 ....... " #方法1、指定不同文件存放默认的Dockerfile,使用-f进行强制编译 #docker build -t $IMG_NAME:$IMG_VERSION -f $IMG_PATH"env/"$RUN_EVN/Dockerfile $IMG_PATH #方法2、跟据不同Dockerfile文件的后缀进行编译不同环境的文件 docker build -t $IMG_NAME:$IMG_VERSION -f $IMG_PATH"env/"Dockerfile_$RUN_EVN $IMG_PATH # 将镜像打一下标签,然后安照标签进行推送到私服里面,标签名就以服务名即可 docker tag $IMG_NAME:$IMG_VERSION $REGISTRY_URL/$IMG_NAME:$IMG_VERSION # 推镜像到私服里面 docker push $REGISTRY_URL/$IMG_NAME:$IMG_VERSION # 判断是否存在文件夹 if [ -d "$IMG_PATH" ];then echo "已经存在:"$IMG_PATH else mkdir -p $IMG_PATH fi # 保存编译之后镜像文件存放到指定路径 docker save $IMG_NAME -o $IMG_TAR_GZ_PATH/$IMG_NAME.tar.gz echo " .......进入Runing操作 ....." docker run -d --network default_network --restart=always --env-file=./.env -e spring.profiles.active=$RUN_EVN --expose=$IMG_PORT --name=$IMG_NAME -p $IMG_PORT:$IMG_PORT $IMG_NAME:$IMG_VERSION echo " .......Build & Run Finish Success~...."else echo " .......Illegal Command Operation ......."fi
4.2.6 Docker (save、load、tag、push,pull)命令使用文章源自JAVA秀-https://www.javaxiu.com/33902.html
其中push,pull一个是推,一个是拉,在某种程度下,都是对在私服上面的镜像进行操作文章源自JAVA秀-https://www.javaxiu.com/33902.html
docker save命令是保存编译的tar.gz或tar压缩文件,语法如:文章源自JAVA秀-https://www.javaxiu.com/33902.html
docker save 镜像名 -o 路径/镜像名.tar.gz或docker save 镜像名 -o 路径/镜像名.tar
docker load 命令是用于导入使用 docker save 命令导出的镜像,此命令非常重要,由于有些客户要求项目工程要求部署在内网,此时这个命令在无网络的内网情况下部署项目的时候就体现它重要的地位了.语法 docker load [OPTIONS],在加载的过程有点慢,因为文件有点大,其中显示Loady Layer [======]输出信息,证实镜像是分层关系。文章源自JAVA秀-https://www.javaxiu.com/33902.html
docker load -i /home/img_tar_gz_path/springboot.tar.gz
文章源自JAVA秀-https://www.javaxiu.com/33902.html
参数说明文章源自JAVA秀-https://www.javaxiu.com/33902.html
文章源自JAVA秀-https://www.javaxiu.com/33902.html
docker tag和docker push命令是一起结合使用,先tag后push,每个镜像名和版本是以冒号区分,而docker pull根据情况使用.文章源自JAVA秀-https://www.javaxiu.com/33902.html
# 将镜像打一下标签,然后安照标签进行推送到私服里面,标签名就以服务名即可docker tag 镜像名:版本号 私服路径/镜像名:版本号\# 推镜像到私服里面docker push私服路径/镜像名:版本号
查看镜像文章源自JAVA秀-https://www.javaxiu.com/33902.html
文章源自JAVA秀-https://www.javaxiu.com/33902.html
浏览器验证docker push推送上私服的镜像文章源自JAVA秀-https://www.javaxiu.com/33902.html
文章源自JAVA秀-https://www.javaxiu.com/33902.html
4.2.7 虚悬镜像文章源自JAVA秀-https://www.javaxiu.com/33902.html
在docker编译不成功会或者是新版本覆盖旧版本归类为虚悬镜像,生成这个个镜像既没有仓库名,也没有标签,均为弊。一般来说,虚悬镜像已经失去了存在的价值,是可以随意删除的。文章源自JAVA秀-https://www.javaxiu.com/33902.html
文章源自JAVA秀-https://www.javaxiu.com/33902.html
4.2.8 不同环境的配置文件文章源自JAVA秀-https://www.javaxiu.com/33902.html
文章源自JAVA秀-https://www.javaxiu.com/33902.html
4.2.9 Controller测试代码文章源自JAVA秀-https://www.javaxiu.com/33902.html
@RestControllerpublic class SimpleController { //读取配置动态参数 @Value("${runEvn}") private String runEvn; @GetMapping("/test") public String test() { return "this spring boot " + runEvn +" date long " + System.currentTimeMillis(); }}
4、非多台机器免密远程登录&Jenkins部署详解
5.1 特别说明文章源自JAVA秀-https://www.javaxiu.com/33902.html
以开发环境为例子进行说明文章源自JAVA秀-https://www.javaxiu.com/33902.html
开发环境部署目标机器是与Jenkins机器同一台机器,一般情况,Jenkins是单独一台机器,这里为了节省自身电脑内存,故放在同一台机器进行演示与学习。文章源自JAVA秀-https://www.javaxiu.com/33902.html
5.2 新建maven工程文章源自JAVA秀-https://www.javaxiu.com/33902.html
点击Jenkins的新建任务菜单文章源自JAVA秀-https://www.javaxiu.com/33902.html
文章源自JAVA秀-https://www.javaxiu.com/33902.html
5.3 参数化构建过程说明文章源自JAVA秀-https://www.javaxiu.com/33902.html
5.3.1添加参数文章源自JAVA秀-https://www.javaxiu.com/33902.html
文章源自JAVA秀-https://www.javaxiu.com/33902.html
5.3.2 参数说明以开发环境为案例文章源自JAVA秀-https://www.javaxiu.com/33902.html
文章源自JAVA秀-https://www.javaxiu.com/33902.html
5.3.3 源码管理文章源自JAVA秀-https://www.javaxiu.com/33902.html
文章源自JAVA秀-https://www.javaxiu.com/33902.html
5.3.4 Build编译设置文章源自JAVA秀-https://www.javaxiu.com/33902.html
文章源自JAVA秀-https://www.javaxiu.com/33902.html
表示忽略测试单元类进行编译文章源自JAVA秀-https://www.javaxiu.com/33902.html
clean install -U -Dmaven.test.skip=true
5.4 SSH Publishers设置文章源自JAVA秀-https://www.javaxiu.com/33902.html
其中SSH Server Name就是在http://jenkins地址:端口/jenkins/configure设置好进行选择文章源自JAVA秀-https://www.javaxiu.com/33902.html
Transfer Set Source file传输文件的路径,可以使用参数构建的占位符${serverPath}获取文章源自JAVA秀-https://www.javaxiu.com/33902.html
Remote directory远程文件目录,同理也参数构建的占位符${serverPath}获取文章源自JAVA秀-https://www.javaxiu.com/33902.html
文章源自JAVA秀-https://www.javaxiu.com/33902.html
SSH Publishers shell脚本#!/bin/bash表示告诉终端使用bash解析器进行执行,而且只有第一行bash才有效。文章源自JAVA秀-https://www.javaxiu.com/33902.html
#!/bin/bash\# 创建目录mkdir -p ${serverPath}\# 切换目录cd ${serverPath}\# 运行脚本sh build.sh $server ${appName} ${version} ${port} ${env} ${serverPath}
5.5 构建与编译部署项目文章源自JAVA秀-https://www.javaxiu.com/33902.html
截图的构建参数都是在参数化构建过程配置的参数文章源自JAVA秀-https://www.javaxiu.com/33902.html
文章源自JAVA秀-https://www.javaxiu.com/33902.html
5.6 构建&运行&&部署结果文章源自JAVA秀-https://www.javaxiu.com/33902.html
构建过程文章源自JAVA秀-https://www.javaxiu.com/33902.html
文章源自JAVA秀-https://www.javaxiu.com/33902.html
部署结果文章源自JAVA秀-https://www.javaxiu.com/33902.html
文章源自JAVA秀-https://www.javaxiu.com/33902.html
5、多台机器免密远程登录&Jenkins部署流程详解
6.1 特别说明文章源自JAVA秀-https://www.javaxiu.com/33902.html
以测试环境为例子进行说明文章源自JAVA秀-https://www.javaxiu.com/33902.html
步骤流程几乎一样,唯一是在SSH Publishers 和源码存放路径不一样,测试环境部署目标机器是与Jenkins机器不同一台机器文章源自JAVA秀-https://www.javaxiu.com/33902.html
6.2 新建maven工程文章源自JAVA秀-https://www.javaxiu.com/33902.html
点击Jenkins的新建任务菜单文章源自JAVA秀-https://www.javaxiu.com/33902.html
文章源自JAVA秀-https://www.javaxiu.com/33902.html
6.3 参数化构建过程说明文章源自JAVA秀-https://www.javaxiu.com/33902.html
6.3.1添加参数文章源自JAVA秀-https://www.javaxiu.com/33902.html
文章源自JAVA秀-https://www.javaxiu.com/33902.html
6.3.2 参数说明以测试环境为案例文章源自JAVA秀-https://www.javaxiu.com/33902.html
文章源自JAVA秀-https://www.javaxiu.com/33902.html
6.3.3 源码管理文章源自JAVA秀-https://www.javaxiu.com/33902.html
文章源自JAVA秀-https://www.javaxiu.com/33902.html
Docker+Jenkins+GitLab+Maven+SpringBoot自动化构建镜像与部署文章源自JAVA秀-https://www.javaxiu.com/33902.html
6.3.4 Build编译设置文章源自JAVA秀-https://www.javaxiu.com/33902.html
文章源自JAVA秀-https://www.javaxiu.com/33902.html
6.4 SSH Publishers设置文章源自JAVA秀-https://www.javaxiu.com/33902.html
其中SSH Server Name就是在http://jenkins地址:端口/jenkins/configure设置好进行选择文章源自JAVA秀-https://www.javaxiu.com/33902.html
Transfer Set Source file传输文件的路径,可以使用参数构建的占位符${serverPath}获取文章源自JAVA秀-https://www.javaxiu.com/33902.html
Remote directory远程文件目录,同理也参数构建的占位符${serverPath}获取文章源自JAVA秀-https://www.javaxiu.com/33902.html
docker_server1表示与Jenkins部署同一个宿主机,使用脚本有远程机器shell脚本操作免登陆操作。文章源自JAVA秀-https://www.javaxiu.com/33902.html
文章源自JAVA秀-https://www.javaxiu.com/33902.html
docker_server1 Shell脚本#!/bin/bash表示告诉终端使用bash解析器进行执行,而且只有第一行bash才有效。文章源自JAVA秀-https://www.javaxiu.com/33902.html
#!/bin/bash\# 打印信息echo "用户名${userName}"echo "服务器${server}"echo "服务器目录${serverPath}"\# 远程创建存放远程上传的代码目录路径ssh $server mkdir -p ${targetServerPath}\# 远程拷贝代码到目标机器指定路径scp -r ${serverPath}/ ${userName}@${server}:${targetServerPath}
docker_server2表示要部署那台目标机器,所以它的脚本跟docker_server1不一样.文章源自JAVA秀-https://www.javaxiu.com/33902.html
文章源自JAVA秀-https://www.javaxiu.com/33902.html
docker_server2 Shell脚本文章源自JAVA秀-https://www.javaxiu.com/33902.html
#!/bin/bash\# 切换文件目录cd ${serverPath}\# 执行脚本sh build.sh ${server} ${appName} ${version} ${port} ${env} ${serverPath}
6.5 构建与编译部署项目文章源自JAVA秀-https://www.javaxiu.com/33902.html
截图的构建参数都是在参数化构建过程配置的参数文章源自JAVA秀-https://www.javaxiu.com/33902.html
文章源自JAVA秀-https://www.javaxiu.com/33902.html
6.6 构建&运行&部署结果文章源自JAVA秀-https://www.javaxiu.com/33902.html
构建过程文章源自JAVA秀-https://www.javaxiu.com/33902.html
文章源自JAVA秀-https://www.javaxiu.com/33902.html
部署结果文章源自JAVA秀-https://www.javaxiu.com/33902.html
文章源自JAVA秀-https://www.javaxiu.com/33902.html
终于明白 Java 为什么要加 final 关键字了!一款基于 Spring Boot 的BBS系统,APP和后台管理齐全,拿来即用(附项目地址)大厂为什么都很重视 API 网关?聊聊 API 网关的作用有了HTTP,为什么还要RPC?使用 JWT 来保护你的 SpringBoot 应用快手二面:a==1 && a==2 && a==3 是 true 还是 false?Spring Boot + Spring Security + Thymeleaf 实战教程!SpringBoot注解最全详解(整合超详细版本)为什么不推荐使用BeanUtils属性转换工具!老程序员都不用...文章源自JAVA秀-https://www.javaxiu.com/33902.html
阅读原文文章源自JAVA秀-https://www.javaxiu.com/33902.html

评论