我们都知道Maven 支持两种版本发布 snapshot 和release。 我们在开发的时候都是使用snapshot 版本, 如果有里程碑发布就走release 版本。 但是项目中如果用到持续集成的话,我们真的还有必要使用snapshot 吗? 项目中涉及到 DEV, SIT, UAT, PREPROD 和 PROD 这N个不同的环境。 我们的的想法是build 出来的war 包能够先有开发人员在DEV 环境下自我验证通过, 然后相同的文件提交给 QA 来在SIT 环境下做集成测试。如果在SIT环境通过进一步提交相同的文件到UAT 环境做用户接受测试。 这里想要强调的重点是我们需要保持相同的文件。
刚开始我们的做法是在不同的环境都是重新build 出war 包 再运行deploy job。 这样的风险在于重新build 的文件可能跟开始测试的环境下的war 是不一样的。 我们知道svn 下的revision 版本号在同一个仓库中是唯一的。 如果我们能将revision 作为 jar 或者 war 的文件的名一部分,就能保证版本的唯一。
在parent pom 文件中 定义
<version>1.2.0-SNAPSHOT</version>
<properties>
<usecase.version>1.2.0</usecase.version>
<revision>SNAPSHOT</revision>
</properties>
在各个module 的pom 文件中 我们
<version>${usecase.version}-${revision}</version>
<parent> <version>1.2.0-SNAPSHOT</version></parent>
这里其实利用的Maven的child module 可以使用parent pom 中的properties。虽然maven 会给出一个warning说
<version>${usecase.version}-${revision}</version> 最好使用static 量。 我们可以在maven build 的时候通过 -Drevision 来指定svn 的版本号。 这样build 出来的 jar 文件就会形如
myapp-1.2.0-13645.jar
13645 就是 svn的版本号。 我们在Jenkins 中可以利用它的内建系统变量SVN_REVISION来获取revision 比如 -Drevision=${SVN_REVISION}, 这样build 出来的 jar 或者 war 都是 带svn 版本号而不是SNAPSHOT。 当然如果我们不传入这个revision系统变量,build 出来的就是默认的SNAPSHOT。
在Jenkins 中, 我们就不需要deploy 到 nexus 中了, 我们现在的做法是所有build 出来的war 都是通过 scp 插件拷贝到另外一台有比较大空间的server 来备份所有build 出来的war。 这样在后来的发布的job 都需要通过image name 参数指定 war包的文件名。 deploy job 会在这个备份的目录中找到需要deploy的war 文件将它拷贝到相应的tomcat 目录下。
这样做的另外一个好处是 以前有N多的deploy job 现在就简化成一个。 我们只需要一个带3个参数的job:
image name 指定 war 文件名
app 这个可以通过选择来指定我们的六个应用之一。
env 来指定deploy 的环境之一 : DEV, SIT 或者 PREPROD。
要知道以前我们的deploy 需要悲催的 几十个job, 在Jenkins 的job 列表中需要密密麻麻的 一坨。
另外需要说明的是采用了 <version>${usecase.version}-${revision}</version> 的pom 如果有间接依赖。间接依赖的包还是被用的是SNAPSHOT 版本, 我们需要消除这种间接依赖。
比如在我们的 inbound 的pom 中 我们依赖 inbound , inbound 会依赖 usecase-common jar。 这个时候我们发现 最终打出的war 里面包含的 usecase-common 不是 usecase-common-1.2.0-13645.jar , 而是 usecase-common-1.2.0- 加上一长串 timestamp 串, 明显是maven的snapshot过来的。 我们可以通过在inbound war的pom 文件中显示的 依赖 usecase-common 就可以解决这个问题。
分享到:
相关推荐
安装到本地 Maven 仓库: mvn install 存储在~/.m2/repository 中 将 SNAPSHOT 版本部署到本地 Nexus 只有二进制: mvn deploy 二进制文件,包括 javadoc 和源文件: mvn deploy -P release 执行 RELEASE :...
1.下载apache-maven-2.2.1-bin.tarhttp://www.apache.org/dyn/closer.cgi/maven/binaries/apache-maven-2.2.1-bin.tar.gz2.下载jenkins:http://mirrors.jenkins-ci.org/war/列出了jenkins的所有release版本,请选择...
releasehelper-maven-plugin 该插件将添加一些Mojos,以帮助发布,尤其是在Jenkins的上下文中。 地位:
环境需要以下构建环境来构建此插件java-1.6和maven-3.0.5建造要在本地构建插件: mvn clean verify释放释放插件: mvn release:prepare release:perform -B测试本地实例在本地Jenkins实例中进行测试 mvn hpi:run
// TODO wait for the release to be in maven central... } stage( ' UpdateBot ' ) { // now lets update any dependent projects with this new release // using the local file system as the tag
sbt-ci-release-early Sbt插件用于全自动发行,该版本中没有SNAPSHOT和git sha。 混合了和的最佳创意。 特征 从git标签(例如v1.0.0 )中检测上一个版本,并自动标记并发布下一个版本为v1.0.1 没有快照,没有手动...
常见的詹金斯DSL 该存储库包含Spring项目中使用Jenkins Job DSL的作业的通用构建基块。... maven { url " http://repo.spring.io/release " } // for jenkins-job-dsl plugin maven { url ' http://
D2ADADADMIN.D2ADADMIN.D2ADADADMIN.D2ADADMIN.D2ADADMIN.D2ADADMIN.D2ADADMIN.D2ADMIN.D2.D2.D2.SpringBoot2.0.5.5.release.release.release.release.releas2.release.releas1.sr1.sr1.sr1.spr春云finchley.sr1.sr1...
它也可以作为独立程序,Gradle插件,Maven插件或Jenkins插件运行。 完全可以使用模板进行配置。 这样可以: 存储到文件中,例如CHANGELOG.md 。 还有用于测试提供一些模板。 或者只是呈现为String 。 它可以与...
Spring Boot 2.2.2.RELEASE Lombok抽象 J2与H2的解释 Swagger 2 API文档 弹簧重试和断路器,用于外部服务呼叫 REST API模型验证 用于GIT REPO上外部配置的Spring Cloud配置 Cucumber和Spring Boot测试以进行集成...
Maven 站点报告包括 . 如何构建 先决条件: 克隆源代码并构建: cd < WORKSPACE > git clone https://github.com/amsa-code/risky.git cd risky mvn clean install 如何释放 仅适用于项目维护者。 这是将新版本...
组态UpdateBot使用一个简单的YAML文件来定义哪些git存储库和github组织,以便搜索要更新的存储库。 查看使用UpdateBot詹金斯管道当您刚刚创建发行版,标记源代码并等待工件在Maven Central或您的联系/工厂中时,在您...
api.jpi', 'matrix-auth.jpi', 'matrix-project.jpi', 'maven-plugin.jpi', 'momentjs.jpi', 'notification.jpi', 'pam-auth.jpi', 'parameterized-trigger.jpi', 'pipeline-build-step.jpi', 'pipeline-github-lib....
Integrating Jenkins with Docker Building pipelines Working with Kubernetes Concepts and components Running Kubernetes locally via Minikube Deploying an application Maintaining a cluster Summary Spring...