背景
在BAE基础版和专业版上,java应用通过war包文件部署的时候,总会遇到一些小麻烦:
BAE专业版的svn/git有单文件40M的限制,所以在专业版的svn/git中上传超过40M的war包(很多war包都会超过40M)是不可行的
BAE基础版的svn/git,以及BAE专业版的打包上传,虽然没有单文件大小限制(BAE基础版的svn/git有所有文件加起来不能超过100M的限制),但是每次有任何改动,都需要上传整个war包,导致每次上传耗时很长
解决的办法很简单:将war包中的文件,解压到BAE专业版或基础版的svn/git中的ROOT目录下(tomcat为ROOT目录,jetty为root目录),再上传。
这样,既能避免了BAE专业版svn/git单文件40M的限制(war包中解压出来的文件一般不超过40M),也能避免每次都要上传整个war包的问题(只需要上传war包中有变化的文件,像依赖的jar包文件一般都是不会发生变化的)。
本文主要介绍,如何通过构建工具gradle,实现打war包、解压war包、上传svn的自动化流程。
注:本文并不包含gradle的使用教程,如果你并不熟悉gradle,建议阅读以下gradle入门系列文章:
方案
要实现打war包、解压war包、上传svn的自动化流程,只需要在gradle的构建脚本build.gradle中增加一段脚本,并执行gradle publish命令即可。
首先,在build.gradle中增加以下内容:
// 使用war插件打war包
apply plugin: 'war'
// svnUrl为BAE基础版或专业版的svn地址,可在控制台复制获得
def svnUrl = 'https://svn.bce.baidu.com/.../'
task updateSvn << {
if (file('svn').exists()) {
exec {
workingDir 'svn'
commandLine 'svn', 'update'
}
} else {
exec {
commandLine 'svn', 'checkout', svnUrl, 'svn'
}
}
}
task cleanSvn(dependsOn: ['updateSvn']) << {
file('svn').listFiles().findAll { it.name != '.svn' }.each {
delete it
}
}
task unzipWar(type: Copy, dependsOn: ['cleanSvn', 'war']) {
into 'svn/ROOT'
from zipTree(tasks.war.archivePath)
}
task publish(dependsOn: unzipWar) << {
def stdout = new ByteArrayOutputStream()
exec {
workingDir 'svn'
commandLine 'svn', 'status'
standardOutput = stdout
}
def status = stdout.toString().readLines()
status.each {
def filename = it[it.indexOf(' ')..-1].trim()
if (it.startsWith('?')) {
exec {
workingDir 'svn'
commandLine 'svn', 'add', filename
}
} else if (it.startsWith('!')) {
exec {
workingDir 'svn'
commandLine 'svn', 'rm', filename
}
}
}
exec {
workingDir 'svn'
commandLine 'svn', 'commit', '-m', System.getProperty('message')
}
}
需要上传时,只需要在命令行中执行以下指令(其中“{svn-ci-message}”为svn的commit信息):
$ gradle publish –Dmessage=”{svn-ci-message}”
工作原理
我们通过下图来看看上面的构建脚本是如何执行的:
updateSvn:如果项目目录下没有svn目录,则通过svn checkout命令,将BAE的svn库中的内容下载下来;如果有svn目录,则通过svn update命令,将该目录中的文件更新到最新版本
cleanSvn:将svn目录中,除了.svn(存放svn的元数据)外的文件和目录都删除掉。这一步是为了保证war包中已删除的文件,在svn中也能被删除
war:由gradle提供的打war包的命令
unzipWar:将步骤3打出的war包,解压到svn/ROOT目录下
publish:这个步骤又分为3步:
通过svn status目录,列出svn目录下的文件变化
对于新增的文件调用svn add命令;对于已删除的文件调用svn rm命令
调用svn commit命令,将变化的部分上传到svn
总结
本文介绍了通过解压war包并上传到svn/git的办法,避免了BAE专业版svn/git单文件40M的限制,以及每次都要上传整个war包的问题。本文还提供了一个gradle的构建脚本,上传代码时只需要执行gradle publish命令,就能实现打war包、解压war包、上传svn的自动化流程。
来源: