前言
大家一想到对项目通过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纵横的天下,这种部署方式显的有点陈旧了,但是也要学习起来;