Jenkins+Maven+git+Tomcat对Spring boot项目进行打包发布

前言

大家一想到对项目通过jenkins打包构建并且发布这种活,不是运维干的么?假如现在运维请假了,这活没人来干了,那么只能自己来干了,谁说程序员只会写代码,做技术的也需要有对项目进行打包、构建、发布的本领才行;

项目打包

通常情况下,我们的Spring boot的项目要么打jar包、要么打war包,如果服务器上有需要配置的Tomcat那么就需要我们将项目打成war包,然后进行发布启动;

Maven打包

通常情况下,我们基于Maven对项目进行打包,首先要将我们熟悉的pom文件的配置进行修改,如果我们要打war包,则需要配置packaging标签为war

然后第一步需要执行mvn -clean,紧接着执行mvn -package

然后在我们项目下会有一个target目录,里面就有我们打好的war包,这样我们拿到这个war包,就可以配置tomcat进行启动;

Tomcat启动配置

我的resoucre目录下有针对不同环境的properties配置文件,所以在打包的过程中需要根据,不同环境读取不同的配置文件;

在使用tomcat启动项目的过程中就需要在/apache-tomcat-8.5.94/bin目录下的catalina.sh文件里面加入

ini 复制代码
//spring.profiles.active=de 表示该环境下读取de的配置文件
JAVA_OPTS="$JAVA_OPTS -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dspring.profiles.active=de"

Jenkins配置

同步至SVN

Svn这东西真的很多年没用了,但是一套完整的打包、发布、部署还是需要完整的流程的,例如这个样子; 开发所要关心依次是部署包、接口文档、数据库设计、概要设计、版本更新的包;

Jenkins Execute shell

将项目的war包通过Jenkins打包、部署,然后上传至SVN的部署包中,还是需要额为配置环境变量脚本,执行shell脚本才能实现;

bash 复制代码
#!/bin/bash
PROJECT_HOME=/home/jenkins/xxx  # 项目根目录
SVN_URL=https://xxx/svn/共享文档/xxx/7.版本更新/$(date '+%Y%m%d')/后台服务  # 项目在 SVN 服务器上的 URL
SVN_EXPLAIN=https://xxx/svn/共享文档/xxx/7.版本更新/$(date '+%Y%m%d')/提交说明  # 项目在 SVN 服务器上的 提交说明
WAR_FILE_NAME=xxx.war  # WAR 文件名以当前日期作为版本号
GIT_PROPERTIES=git.properties 
echo "进入项目目录"
cd $PROJECT_HOME
# 清理之前的构建结果
mvn clean
# 打包项目并生成 WAR 文件
mvn package
echo "删除 SVN 服务器 已存在的项目"
svn delete --username xxx --password xxx  $SVN_URL/$WAR_FILE_NAME -m "xxx($WAR_FILE_NAME)项目$(date '+%Y%m%d')发版打包,清空已有文件"
echo "将 WAR 文件提交到 SVN 服务器"
svn import --username xxx --password xxx $PROJECT_HOME/target/$WAR_FILE_NAME $SVN_URL/$WAR_FILE_NAME -m "xxx($WAR_FILE_NAME)项目$(date '+%Y%m%d')发版打包"
svn import --username xxx --password xxx $PROJECT_HOME/target/$GIT_PROPERTIES $SVN_EXPLAIN/$GIT_PROPERTIES -m "xxx($GIT_PROPERTIES)项目$(date '+%Y%m%d')git 提交说明"
echo "显示 SVN 提交日志"
svn log $SVN_URL/$WAR_FILE_NAME

git-commit-id-plugin

这里可以看到我不仅将maven打的版本包同步至SVN目录,还将git的提交记录(git.properties )文件放入"提交说明目录",方便我们看到版本包都做了哪些改变,并且当前git分支、版本号、提交时间、提交人等一些说明;

使用了git-commit-id-plugin这个插件,我这边配置了将git.properties文件生成在target目录下,以下是关于git-commit-id-plugin的pom文件配置;

xml 复制代码
<build>
        <finalName>dws_netyscf-${git.branch}-${git.build.time}</finalName>
            <plugin>
                <groupId>pl.project13.maven</groupId>
                <artifactId>git-commit-id-plugin</artifactId>
                <version>2.1.5</version>
                <executions>
                    <execution>
                        <id>get-the-git-infos</id>
                        <!--- 默认绑定阶段initialize --->
                        <phase>initialize</phase>
                        <goals>
                            <goal>revision</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <!---日期格式;默认值:dd.MM.yyyy '@' HH:mm:ss z;--->
                    <dateFormat>yyyy-MM-dd_HH-mm-ss</dateFormat>
                    <!---,构建过程中,是否打印详细信息;默认值:false;--->
                    <verbose>true</verbose>
                    <!--- ".git"文件路径;默认值:${project.basedir}/.git; ${project.basedir}:项目根目录,即包含pom.xml文件的目录--->
                    <dotGitDirectory>${project.basedir}/../../../.git</dotGitDirectory>
                    <!---若项目打包类型为pom,是否取消构建;默认值:true;--->
                    <skipPoms>false</skipPoms>
                    <!---是否生成"git.properties"文件;默认值:false;--->
                    <generateGitPropertiesFile>true</generateGitPropertiesFile>
                    <!---指定"git.properties"文件的存放路径(相对于${project.basedir}的一个路径);--->
                    <generateGitPropertiesFilename>/target/git.properties</generateGitPropertiesFilename>
                    <!---".git"文件夹未找到时,构建是否失败;若设置true,则构建失败;若设置false,则跳过执行该目标;默认值:true;--->
                    <failOnNoGitDirectory>true</failOnNoGitDirectory>

                    <!---git描述配置,可选;由JGit提供实现;--->
                    <gitDescribe>
                        <!---是否生成描述属性--->
                        <skip>false</skip>
                        <!---提交操作未发现tag时,仅打印提交操作ID,--->
                        <always>false</always>
                        <!---提交操作ID显式字符长度,最大值为:40;默认值:7; 0代表特殊意义;后面有解释;--->
                        <abbrev>7</abbrev>
                        <!---构建触发时,代码有修改时(即"dirty state"),添加指定后缀;默认值:"";--->
                        <dirty>-dirty</dirty>
                        <!---always print using the "tag-commits_from_tag-g_commit_id-maybe_dirty" format, even if "on" a tag.
                            The distance will always be 0 if you're "on" the tag.  --->
                        <forceLongFormat>false</forceLongFormat>
                    </gitDescribe>
                </configuration>
            </plugin>
        </plugins>
    </build>

Git.properties文件,可以看到有这些基本信息;

Jenkins Build now

手动通过Build now发布项目,日志可以看到我们已将项目包和项目的提交说明,同步至SVN;

总结

项目部署也属于开发的一个流程,我们也不能只关注代码的层面上,也要多多关注项目部署发布方面的流程,毕竟是一整套流程,本章分享的是传统的项目打包、部署的一些流程,可能在现如今docker、k8s纵横的天下,这种部署方式显的有点陈旧了,但是也要学习起来;

相关推荐
陈随易3 分钟前
兔小巢收费引发的论坛调研Node和Deno有感
前端·后端·程序员
迷茫运维路7 分钟前
Jenkins声明式Pipeline流水线语法示例
运维·pipeline·jenkins·声明式
聪明的墨菲特i8 分钟前
Django前后端分离基本流程
后端·python·django·web3
hlsd#1 小时前
go mod 依赖管理
开发语言·后端·golang
陈大爷(有低保)1 小时前
三层架构和MVC以及它们的融合
后端·mvc
亦世凡华、1 小时前
【启程Golang之旅】从零开始构建可扩展的微服务架构
开发语言·经验分享·后端·golang
河西石头1 小时前
一步一步从asp.net core mvc中访问asp.net core WebApi
后端·asp.net·mvc·.net core访问api·httpclient的使用
2401_857439691 小时前
SpringBoot框架在资产管理中的应用
java·spring boot·后端
怀旧6661 小时前
spring boot 项目配置https服务
java·spring boot·后端·学习·个人开发·1024程序员节
阿华的代码王国2 小时前
【SpringMVC】——Cookie和Session机制
java·后端·spring·cookie·session·会话