为你的 SpringBoot 服务生成或推送各平台的部署包

发布于: 18 小时前
为你的 SpringBoot 服务生成或推送各平台的部署包

一、前言

jpack 是一个能为 SpringBoot 服务打包为 WindowsLinuxDockerRancher 等平台下的在线或离线部署包的 Maven 插件。

SpringBoot 服务通常打出的部署包都是一个 jar 文件,使部署变得更简单了,当同时也意味着更“简陋”了。如果仅仅给运维人员一个 jar 包去部署服务,对运维人员来说还远远不够。大多数情况下都还需要数据库脚本、配置文件、部署文档、使用手册等等,需要将这些文件和 jar 包一起打到一个更大的 zip 或者 tar.gz 的压缩包中。

服务在各个平台(如:Windows Server、Linux、Docker、K8S Rancher)的部署和启动也各有差异,jpack 也为各个平台可执行部署包的构建、生成提供了支持。

二、jpack 主要功能

  • 专为 SpringBoot 服务和各个主流平台而设计的自动化 Maven 打包插件,基于约定优于配置的思想来构建各平台的部署包

  • 支持打包为 WindowsLinuxDockerRancher 下的发布部署包,也可单独选择打某些平台下的部署包

  • 生成的 Windows 部署包可以安装为 Windows 服务,从 Windows 的服务界面中来启动和停止应用服务,且默认为开机自启动

  • 生成的 Linux 部署包可以执行对应的 start.shstop.shrestart 等 shell 脚本来启停服务

  • 支持 Docker 的镜像构建、导出和推送镜像到远程私有镜像仓库等功能

  • 支持 Helm Chart 的打包、推送和连带所依赖的 Docker 镜像一起导出离线应用包,便于部署到 K8S Rancher 中

  • jpack 内部默认提供了一个简单通用的 Dockerfile 来构建 SpringBoot 服务的镜像,也支持自定义 Dockerfile 来构建镜像

  • 可自定义复制文件资源到部署包中,例如通常发布时需要的:数据库脚本、文档说明、配置文件说明等

  • 可自定义排除不需要的文件资源被打包到部署包中,例如默认生成的文件目录资源你可以选择性排除掉

三、使用示例

我将以一个新建的最新版本的 SpringBoot 2.3.1.RELEASE 的 web 项目作为示例来做介绍,源码地址:jpack-demo,版本 1.5.3,与 jpack 插件的版本保持一致 。

1. 项目准备

https://start.spring.io 项目中建一个新项目,并写一个 IndexController,用来访问首页根路径(/)时返回 Hello World! 即可,表明此服务可正常启动和访问。并在 application.yml 中也写一些简单的配置项。

然后,在项目根目录建一个 releases 目录,下面再创建 configdocsdbdocs-src 等目录,里面也存放一些简单的示例文件,用来表示我们打安装部署包时,需要自动化一起打进部署包的安装部署文档、配置文件或数据库脚本等等。

2. 如何生成 Windows 和 Linux 下的可部署包并构建 Docker 镜像

在项目的 Maven pom.xmlbuild -> plugins 节点中加入 jpack-maven-plugin 的插件配置:

<plugin>
<groupId>com.blinkfox</groupId>
<artifactId>jpack-maven-plugin</artifactId>
<version>1.5.3</version>
<executions>
<execution>
<goals>
<goal>build</goal>
</goals>
<phase>install</phase>
</execution>
</executions>
</plugin>

上面的配置,表明 jpack 插件会在 Maven 的 install 阶段执行构建,并默认会打包成 WindowsLinux 下的安装部署包,如果检测到你本地有 Docker 环境,也将会默认帮你为这个 SpringBoot 服务制作成 Docker 镜像。当然也会尝试做 Helm Chart 的相关构建,由于我们还没有配置 Helm Chart 相关的配置信息,所以,会跳过该平台任务的构建。

执行如下命令来开始构建打包:

mvn clean install

将输出如下构建结果信息:

[INFO] ---------------------------------- jpack start packing... ---------------------------------
__ __
|__|______ _____ ____ | | __
| |\____ \ \__ \ _/ ___\ | |/ /
| || |_> > / __ \_\ \___ | <
/\__| || __/ (____ / \___ >|__|_ \
\______||__| \/ \/ \/ v1.5.3
[INFO] 【Chart构建 -> 跳过】没有配置【<helmChart>】的构建目标【<goals>】,将跳过 HelmChart 相关的构建.
[INFO] 【构建打包 -> 成功】制作 linux 下的部署压缩包完成.
[INFO] 【构建打包 -> 成功】制作 windows 下的部署压缩包完成.
[INFO] 【构建镜像 -> 默认】将使用 jpack 默认提供的 Dockerfile 文件来构建镜像.
[INFO] 【构建镜像 -> 进行】正在构建【com.blinkfox/jpack-demo:1.5.3】镜像...
[INFO] 【构建镜像 -> 成功】构建【com.blinkfox/jpack-demo:1.5.3】镜像完毕,镜像ID: d761303ae702
[INFO] --------------------- jpack has been packaged to end. [costs: 6.57 s] ---------------------

:jpack 须要有 Maven 打包的 jar 包,才能来生成用于发布的各平台的部署包,所以至少须要执行 package 阶段的命令。

此时,可以在项目的 target/jpack/ 目录中看到各个平台的安装部署包了,这些部署包可以在各平台直接使用了。

  • jpack-demo-1.5.3.zip: 是 Windows 平台的部署包,可以直接进入 bin 目录,双击 install.bat 安装为 Windows 服务,且该服务会默认开机自启动,通过命令行 services.msc进入 Windows 服务界面或者双击 start.bat 来启动本服务,其它停止、重启等脚本同理,不再赘述。

  • jpack-demo-1.5.3.tar.gz:是 Linux 平台的部署包,可以直接进入 bin 目录,执行对应的 start.shstop.shrestart.sh 等 shell 脚本,来启停服务。

如果你本地有 Docker 环境,即时你项目中没有定义 Dockerfile 文件,jpack 默认也能为你构建出本服务可运行的 Docker 镜像。使用 docker images 命令,可以查看到 jpack 为你默认构建的镜像,当然镜像的各种自定义配置或者想自定义 Dockerfile 来构建,也可以通过 jpack 来配置实现。

REPOSITORY TAG IMAGE ID CREATED SIZE
com.blinkfox/jpack-demo 1.5.3 c8f91718f286 About a minute ago 123MB
openjdk 8-jdk-alpine a3562aa0b991 6 days ago 105MB

3. 如何推送 Docker 镜像到私有镜像仓库中

在不做任何配置的情况下,jpack 默认只会为你构建 Docker 镜像和打上 registry 对应的标签,你可以通过配置 jpack 中的其它配置信息来达到自定义构建 Docker 镜像或者推送镜像到公司的远程镜像仓库中。

接下来,我们在 jpack 插件的 configuration 标签下,做 docker 的相关配置,相关的注释也在下面,以下只是部分配置,更全的配置项,可以看更完整的文档:

<plugin>
<groupId>com.blinkfox</groupId>
<artifactId>jpack-maven-plugin</artifactId>
<!-- 此处内容省略. -->
<configuration>
<docker>
<!-- 公司的 Docker 镜像仓库地址. -->
<registry>registry.yourcompany.com:5000</registry>
<!-- Docker 镜像仓库的项目仓库分组,如果是 Harbor,就是指项目名,如果不填写,将默认使用 groupId. -->
<repo>blinkfox</repo>
<!-- 对外暴露的端口,不配置该值,将不会在 Dockerfile 中生成 EXPOSE 指令. -->
<expose>8080</expose>
<extraGoals>
<!-- 构建 docker 镜像和打标签之外的额外目标,push 表示推送镜像到远程的 registry 仓库,还有 save,表示导出离线镜像包. -->
<param>push</param>
</extraGoals>
<!-- Docker 镜像仓库的权限认证信息,你也可以直接写明文,我这里是经过加密的密文. -->
<registryUser>
<username>ENCRYPT#leSdRWZZesst0PRxA2uMYqWgmcBOuzQx</username>
<password>ENCRYPT#xrrHHzgJsGUQrfkEasF6WahbGnMXTg==</password>
</registryUser>
</docker>
</configuration>
</plugin>

然后执行 mvn clean install 进行构建,再最后将额外看到,输出如下片段信息:

[INFO] 【镜像标签 -> 成功】已对镜像打了标签:【registry.yourcompany.com:5000/blinkfox/jpack-demo:1.5.3】.
[INFO] 【推送镜像 -> 进行】正在推送标签为【registry.yourcompany.com:5000/blinkfox/jpack-demo:1.5.3】的镜像到远程仓库中...
[INFO] 【推送镜像 -> 进度】[==================================================>] 18.29MB/18.29MB
[INFO] 【推送镜像 -> 成功】推送标签为【registry.yourcompany.com:5000/blinkfox/jpack-demo:1.5.3】的镜像到远程仓库完成.

接下来,登录 Harbor 镜像仓库,进入 blinfox 的项目镜像仓库下,看到 jpack-demo 的镜像:

4. 如何打包、推送 Chart 以及导出离线 Rancher 应用包

4.1 Chart 包准备和 Helm 环境安装

要打包 Chart,首先需要生成和书写相关的 Chart yaml 配置文件,我这里制作了一个示例 Chart,取名为 jpack-chart 存放到了本示例项目的 jpack-chart 目录下,和项目源码一起用 Git 管理起来,便于以后继续维护和修改。

然后,需要使用到 Helm 环境。你可以点击这里下载 你对应操作系统下的 Helm 安装包,并将其设置到 path 环境变量中,Linux 或 Mac 环境中,将其复制到 /usr/local/bin 目录下,并设置可执行权限,最后通过 helm version 来命令验证是否安装成功即可。

4.2 jpack 中增加 Helm Chart 的相关配置

接下来就是在 jpack 中增加 Helm Chart 的相关配置信息,推送 Chart 所需的 registry 权限信息可以和 Docker 中的 registryUser 权限认证信息共享使用,所以在 helmChart 中不再需要额外配置,当然如果你没有在 Docker 中配置,那就在 helmChart 中配置也可以。

下面是 helmChart 的相关配置,每个配置项也有对应的说明。

<plugin>
<groupId>com.blinkfox</groupId>
<artifactId>jpack-maven-plugin</artifactId>
<!-- 此处内容省略. -->
<configuration>
<docker>
<!-- 此处内容省略. -->
</docker>
<helmChart>
<!-- helm chart 源文件的目录位置,目前仅支持本地文件的绝对或相对路径. -->
<location>jpack-chart</location>
<!-- 该值表示 save 导出时,是否使用本插件 Docker 构建的镜像,将其也导出到最终的镜像包中,默认为 false. -->
<useDockerImage>true</useDockerImage>
<!-- 构建目标,这里设置了 chart 打包、chart 推送和 Rancher 应用包导出. -->
<goals>
<param>package</param>
<param>push</param>
<param>save</param>
</goals>
</helmChart>
</configuration>
</plugin>

然后执行 mvn clean install 进行构建,将额外看到 Helm Chart 相关的构建信息:

[INFO] 【Chart打包 -> 成功】执行【helm package】命令打包成功.
[INFO] 【Chart推送 -> 开始】开始推送 Chart 包到远程 Registry 仓库中 ...
[INFO] 【Chart推送 -> 成功】推送 Chart 包到远程 Registry 仓库中成功.
[INFO] 【Chart导出 -> 开始】开始从 Docker 中导出 Chart 所需的镜像包 ...,要导出的镜像有:
[registry.yourcompany.com:5000/blinkfox/jpack-demo:1.5.3]
[INFO] 【Chart导出 -> 成功】从 Docker 中导出镜像包【/Users/blinkfox/ ... /jpack-demo/target/jpack/helmChart/images.tar】成功.
[INFO] 【构建打包 -> 成功】制作 helmChart 下的部署压缩包完成.

接下来,登录 Harbor 镜像仓库,进入 blinfox 的项目 Helm Charts 页签下,看到 jpack-chart 的 Chart:

5. 如何将文档、脚本等一起打包到各平台部署包中

发布的各平台离线安装部署包中,如果只有一些 jar 包或执行脚本等,显然是不够的,运维人员可能还需要详细的安装部署文档、使用手册、要执行的数据库脚本、或要参考修改的配置文件等等,这些文件也需要附带打入到安装部署包中。所以,jpack 在打包过程中,也支持在打包过程中复制或排除相关的文件资源。

以下便是将项目中 releases 目录中的 pdf 格式的文档、数据库脚本、配置文件等复制到各个平台的安装署包中,当然各个平台的配置中也可以单独配置要复制的资源,由于 releases 目录中有 docs-src 源 Markdown 文档,这些 Markdown 是源文档,不是给运维人员看的,需要从压缩包中排除掉。

所以,增加如下配置:

<plugin>
<groupId>com.blinkfox</groupId>
<artifactId>jpack-maven-plugin</artifactId>
<!-- 此处内容省略. -->
<configuration>
<docker>
<!-- 此处内容省略. -->
</docker>
<helmChart>
<!-- 此处内容省略. -->
</helmChart>
<!-- 复制 application.yml 到各平台的 config 目录中. -->
<configFiles>
<param>src/main/resources/application.yml</param>
</configFiles>
<!-- 复制项目中的 releases 目录中的所有文件到各平台根目录压缩包中. -->
<copyResources>
<copyResource>
<from>releases</from>
<to>/</to>
</copyResource>
</copyResources>
<!-- 排除各平台下的压缩包中的 docs-src 目录. -->
<excludeFiles>
<param>docs-src</param>
</excludeFiles>
</configuration>
</plugin>

然后执行 mvn clean install 进行构建,然后,你可以看到各个压缩包中均附带有了 configdocsdb 等发布所需的资源文件了。

6. 其它参数设置

jpack 中也支持设置 Windows、Linux 像等运行所需的 JVM 参数和 SpringBoot 服务程序运行所需的配置等。

<plugin>
<groupId>com.blinkfox</groupId>
<artifactId>jpack-maven-plugin</artifactId>
<!-- 此处内容省略. -->
<configuration>
<!-- JVM 运行所需的参数选项. -->
<vmOptions>-Xms512m -Xmx2048m</vmOptions>
<!-- 所集成的 SpringBoot 服务程序运行所需的参数,可以多个填写 SpringBoot 中的任意配置参数. -->
<programArgs>--loggin.level.root=warn</programArgs>
<!-- 其它内容省略. -->
</configuration>
</plugin>

jpack 中其它功能功能配置,如:如何只构建打包某个平台如何为某个平台定制化打包,可以参考相关的介绍文档

四、使用部署包来演示在 Rancher 中运行

如果是在与开发环境网络物理隔离的生产环境中,可以将之前 jpack 配置导出的 Helm Chart 离线应用包,导入到生产环境的镜像仓库中。该离线应用包中包含了所需的 Docker 镜像Chart 包,可以一起导入到生产环境的仓库中,在 Rancher 应用商店中使用即可。

如果你是在开发环境中,由于 jpack 已经推送了对应的 Docker 镜像和 Chart 包到 Harbor 私有镜像仓库中。所以,你只需要在 Rancher 的应用商店中找到你的 Chart,启动或升级即可。下面是我在 Rancher 的应用商店中的 Chart 和运行的示例:

下面是推送 Chart 到 Rancher 应用商店中的 jpack-chart

下面是应用商店中的 jpack-chart 的运行实例:

五、相关链接

发布于: 18 小时前 阅读数: 12
用户头像

华宇法律科技

关注

还未添加个人签名 2020.05.21 加入

还未添加个人简介

评论

发布
暂无评论
为你的 SpringBoot 服务生成或推送各平台的部署包