百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Docker+Jenkins+GitLab+Maven+SpringBoot自动化构建镜像与部署

lipiwang 2024-11-22 17:19 5 浏览 0 评论

1、前言与初衷

  • 本文章会涉及Docker常见命令基础知识点结合不同场景实操一起使用。
  • 本文章会涉及结合工作过程中部署不同环境服务器的项目案例场景为初心进行实际细讲。
  • 本文章主要讲述Docker、Jenkins、GitLab、Git、JDK、SpringBoot、Maven等技术结合实现自动化运维部署(DevOps)应用工程,适合SpringCloud部署。
  • 初衷想法:在学习过程中遇到比较有趣的问题、然而花了点心血和时间去整理,然而进行梳理出来一份文章比较完整有知识体系的DevOps自动化构建与部署工程文章,技术知识内容比较多,而且文章内容较长,然而分了几个章程来讲述

2、什么是DevOps?

  • DevOps(Development和Operations的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合,它是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。
  • 它的出现是由于软件行业日益清晰地认识到:为了按时交付软件产品和服务,开发和运营工作必须紧密合作。

3 涉及软件环境搭建内容

  • 3.1 如何在Centos7安装JDK1.8-u121详解 https://www.jianshu.com/p/dfaaedeb6817
  • 3.2 如何在Centos7安装Maven3.6.1详解 https://www.jianshu.com/p/299eeef785f0
  • 3.3 如何在Centos7安装Git详解 https://www.jianshu.com/p/a22577232977
  • 3.4 如何在CentOS7与Git配置免密码登陆详解 https://www.jianshu.com/p/e4946edce9a4
  • 3.5 如何在Docker安装GitLab详解 https://www.jianshu.com/p/0bc9b4755082
  • 3.6 如何在Docker创建NetWork网络详解 https://www.jianshu.com/p/9784d63eff23
  • 3.7 如何在Docker安装Registry私服详解 https://www.jianshu.com/p/7827e40aaa71
  • 3.8 如何在Docker安装Jenkins详解 https://www.jianshu.com/p/72d05e43a8f3

特别说明

1、如何使用Maven结合Docker把SpringBoot应用编译成可用的镜像进行部署。

2、其中JDK和Maven是传统方式进行安装,由于本人Centos操作系统是有其他软件依赖它们,有时候传统方式安装软件会更好,这里不过多的阐述。有些软件在Docker安装过程与使用过程并没传统方式的简单,比如:Jenkins。

【CentOS-7-x86_64-Minimal-1810.iso下载地址】 http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1810.iso

4、需要准备的工作有哪些

4.1 工程结构

  • 打开IDEA或Eclipse新建一个SpringBoot的应用.



4.2、SpringBoot配置和代码详解

4.2.1工程的pom.xml配置

<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错误解决

<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_OPTS_DEFAULT=-Xmx512m

4.2.4 Dockerfile打包工程镜像细讲

FROM frolvlad/alpine-oraclejdk8:slim

MAINTAINER jilongliang@sina.com

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

RUN mkdir -p /home/devsoft/springboot_dev

WORKDIR /home/devsoft/springboot_dev

EXPOSE 7011

ADD ./target/springboot.jar ./

CMD java ${JAVA_OPTS_DEFAULT} -Djava.security.egd=file:/dev/./urandom -jar springboot.jar


docker exec -it 容器名称或容器id /bin/sh

或要使用sh和bash要看COMMAND,-it

docker exec -it 容器名称或容器id/bin/bash

4.2.5 build.sh文件shell脚本详解

#!/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"

echo "create $IMG_PATH"

mkdir -p $IMG_PATH

#私服访问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 rm -f $(docker ps -a | grep $IMG_NAME | awk '{ print $1 }')

docker rmi $(docker images | grep $IMG_NAME | awk '{ print $3 }')

# $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

# 创建目录

mkdir -p $IMG_TAR_GZ_PATH

# 保存编译之后镜像文件存放到指定路径

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)命令使用

docker save 镜像名 -o 路径/镜像名.tar.gz

docker save 镜像名 -o 路径/镜像名.tar

docker load 命令是用于导入使用 docker save 命令导出的镜像,此命令非常重要,由于有些客户要求项目工程要求部署在内网,此时这个命令在无网络的内网情况下部署项目的时候就体现它重要的地位了.语法 docker load [OPTIONS],在加载的过程有点慢,因为文件有点大,其中显示Loady Layer [======]输出信息,证实镜像是分层关系。

docker load -i /home/img_tar_gz_path/springboot.tar.gz


# 将镜像打一下标签,然后安照标签进行推送到私服里面,标签名就以服务名即可

docker tag 镜像名:版本号 私服路径/镜像名:版本号

# 推镜像到私服里面

docker push私服路径/镜像名:版本号


浏览器验证docker push推送上私服的镜像

4.2.7 虚悬镜像



4.2.9 Controller测试代码

@RestController

public class SimpleController {

//读取配置动态参数

@Value("${runEvn}")

private String runEvn;

@GetMapping("/test")

public String test() {

return "this spring boot " + runEvn +" date long "

+ System.currentTimeMillis();

}

}

5、非多台机器免密远程登录&Jenkins部署详解

5.1 特别说明

5.2 新建maven工程


5.3 参数化构建过程说明






clean install -U -Dmaven.test.skip=true

5.4 SSH Publishers设置


#!/bin/bash

# 创建目录

mkdir -p ${serverPath}

# 切换目录

cd ${serverPath}

# 运行脚本

sh build.sh $server ${appName} ${version} ${port} ${env} ${serverPath}

5.5 构建与编译部署项目


5.6 构建&运行&&部署结果



6、多台机器免密远程登录&Jenkins部署流程详解

6.1 特别说明

6.2 新建maven工程


6.3 参数化构建过程说明





  1. 其中SSH Server Name就是在http://jenkins地址:端口/jenkins/configure设置好进行选择
  2. Transfer Set Source file传输文件的路径,可以使用参数构建的占位符${serverPath}获取
  3. Remote directory远程文件目录,同理也参数构建的占位符${serverPath}获取
  4. docker_server1表示与Jenkins部署同一个宿主机,使用脚本有远程机器shell脚本操作免登陆操作。


#!/bin/bash

# 打印信息

echo "用户名${userName}"

echo "服务器${server}"

echo "服务器目录${serverPath}"

# 远程创建存放远程上传的代码目录路径

ssh $server mkdir -p ${targetServerPath}

# 远程拷贝代码到目标机器指定路径

scp -r ${serverPath}/ ${userName}@${server}:${targetServerPath}


docker_server2 Shell脚本

#!/bin/bash

# 切换文件目录

cd ${serverPath}

# 执行脚本

sh build.sh ${server} ${appName} ${version} ${port} ${env} ${serverPath}

6.5 构建与编译部署项目


6.6 构建&运行&部署结果



备注:部署操作动态图片



7、总结&建议&学习

7.1 总结与建议

7.2 个人简书

Docker+Jenkins+GitLab+Maven+SpringBoot&SpringCloud实现自动化构建镜像与部署详解

访问地址 https://www.jianshu.com/p/bdb0642b7495

相关推荐

前端 JavaScript 字符串中提取数字

varstr="4500元";varnum=parseInt(str);alert(num);//4500如果字符串前面有非数字字符,上面这种方法就不行了:var...

使用JavaScript如何获取网站网址(js如何获取浏览器信息)

在做网站开发时,我们有时候会获取当前页面的完整路径。在网页前端如何实现呢?请在网页脚本代码段中粘贴如下代码。functiongetRootPath(){//获取当前网址,...

java文本对比工具源码8(java比较文本相似度)

/***ParseatextualrepresentationofpatchesandreturnaListofPatch*objects.*@paramtextline...

JavaScript实现的9大排序算法(js排序方法)

笔试面试经常涉及各种算法,本文简要介绍常用的一些算法,并用JavaScript实现。1、插入排序1)算法简介插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通...

使用函数化的Javascript代码编写方式

对于Javascript介绍想必大家都耳熟能详啦,基于函数化的编程语言,基于浏览器运行的编程语言,web开发语言,前端开发必备语言,blablabla...Javascript是一个非常灵...

Js基础31:内置对象(js内置对象是什么意思)

js里面的对象分成三大类:内置对象ArrayDateMath宿主对象浏览器提供的对象(如bom、dom等等)自定义对象开发人员自己定义的对象内置对象——所谓内置对象,就是JavaScript自...

js获取上传文件类型以及大小的方法

前端web上传文件时,需要在上传之前判断一下文件的类型以及文件的大小,HTML为前端的标记语言是无法做到这一点,只能使用javascript动态脚本代码来实现。js获取上传文件大小的方法示例代码:&...

黑客入门实践:如何绕过前端过滤上传文件

今天开始,我们就要开始学习具体的漏洞了,但是希望大家学完后,不要轻易"入侵"网站哦,当时测试环境下除外。今天的课程是关于“文件上传漏洞”,据安界网的老师介绍,文件上传漏洞仅次于命令执行...

Java文件上传细讲(java文件夹上传)

什么是文件上传?文件上传就是把用户的信息保存起来。为什么需要文件上传?在用户注册的时候,可能需要用户提交照片。那么这张照片就应该要进行保存。免费学习资料获取方式上传组件(工具)为什么我们要使用上传工具...

鸿蒙上实现“翻译”功能(鸿蒙宴全文翻译)

本章节我们来制作中文翻译成英文的实例(运行在HarmonyOS上),通过HTTP去配合API进行实现。需求分析如下:文字输入HTTP协议使用文字翻译控件介绍①HTTP数据请求官方文档请求...

JavaScript从入门到精通(javascript 入门教程)

前几天,我们学习了JavaScript的入门课程,但是要想做网站,仅仅学会入门是不够的,今后的几天,我将带领大家精通JavaScript,希望大家好好学习!JS内置对象String对象:字符串对象,提...

第15天|16天搞定前端,javascript语法篇(干货)

JavaScript是互联网上最流行的脚本语言,这门语言可用于HTML和web,可广泛用于服务器、PC、笔记本电脑、平板电脑和智能手机等设备。它是一个脚本语言,它是一个轻量级,但功能强大的编程...

通过js来实现打字效果(js如何输入)

有时候浏览网页经常会看见一些页面出现一些打字的效果,那么是怎么实现的呢?逻辑确定目标容器,在哪个容器进行输出确定输出内容,当前直接根据目标容器确定输出内容即可需要控制输出频率,因此需要循环输出完毕代码...

手把手教你学会一键还原混淆js原理

1.短变量名在以下示例代码中,我们将变量“customerName”替换为“a”:vara="JohnSmith";console.log(a);2.随机变量名在以下示例代码...

sql中常用的字符串函数详解(sql字符串函数有哪些)

在日常开发中遇到处理最多的可能字符串要算其中一个了,什么替换啊截取啊大小写转换啊、删除空格啊等等,这些操作我们可以在前端操作,也可以直接在数据库的sql中操作,那么我们来看一下sql中处理字符串的...

取消回复欢迎 发表评论: