gradle+svn轻松搞定java代码上传

背景

在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入门系列文章:

  1. Gradle入门系列(1):简介
  2. Gradle入门系列(2):第一个Java项目
  3. Gradle入门系列(3):依赖管理
  4. Gradle入门系列(4):创建二进制发布版本
  5. Gradle入门系列(5):创建多项目构建
  6. Gradle入门(6):创建Web应用项目

方案

要实现打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}

工作原理

我们通过下图来看看上面的构建脚本是如何执行的:

  1. updateSvn:如果项目目录下没有svn目录,则通过svn checkout命令,将BAE的svn库中的内容下载下来;如果有svn目录,则通过svn update命令,将该目录中的文件更新到最新版本
  2. cleanSvn:将svn目录中,除了.svn(存放svn的元数据)外的文件和目录都删除掉。这一步是为了保证war包中已删除的文件,在svn中也能被删除
  3. war:由gradle提供的打war包的命令
  4. unzipWar:将步骤3打出的war包,解压到svn/ROOT目录下
  5. publish:这个步骤又分为3步:
    1. 通过svn status目录,列出svn目录下的文件变化
    2. 对于新增的文件调用svn add命令;对于已删除的文件调用svn rm命令
    3. 调用svn commit命令,将变化的部分上传到svn

总结

本文介绍了通过解压war包并上传到svn/git的办法,避免了BAE专业版svn/git单文件40M的限制,以及每次都要上传整个war包的问题。本文还提供了一个gradle的构建脚本,上传代码时只需要执行gradle publish命令,就能实现打war包、解压war包、上传svn的自动化流程。

此条目发表在 BAE使用 分类目录。将固定链接加入收藏夹。

发表评论