使用Gradle自动发布Java Web到SAE

17 1月

现在像SAE这类的应用引擎已经比较多了,百度和腾讯都提供了相似的平台。

我很早的时候就开始用SAE,当时还为了迁就SAE学习了PHP(当时只支持PHP和另外一个什么语言)。后来SAE支持Java了,版本是6,容器是Jetty 7.4,而常用的框架也基本能跑。

代码的部署使用svn,稍微有点麻烦。最近在做一个Java Web的练习,代码放在github上,每次上传到SAE很烦。项目使用Gradle管理,所以琢磨着怎么把自动发布到SAE这个事情交给Gradle来做。

流程分析

先来看一下SAE这边。

建立默认版本,版本号为1。然后通过代码管理页面上传一个war包。

进入svn仓库看一看

其实就是把对应的war包放在版本号目录的根目录就可以了。

而调用


就可以生成war包,而文件地址通过以下方法获得


这样就只需要checkout原有代码,然后将新的war拷贝过去,然后commit就行了。

直接调用SVN命令

Gradle有一种任务类型是Exec,可以直接在命令行调用命令。

比如我们的checkout操作就可以这样


这样代码仓库就被签出到build/svn目录下了。

在使用copy指令


当然,gradle生成的war包的名字组成是


如果要重命名的话,可以使用rename,比如利用重命名去掉version信息


然后再次提交


为了方便调试还可以导出命令运行的输出,提交部分的任务如下


这样勉强可以完成任务,但是问题是我的运行环境不一定包含了svn。我平时用的也比较少,不想安装它。这样只有使用其他方法了。

在Gradle中调用SVNKit

SVNKit 是一个纯 Java 的 SVN 客户端库,使用 SVNKit 无需安装任何 SVN 的客户端,支持各种操作系统。使用它一方面不需要考虑安装问题,另一方面SVNKit在maven仓库中有,不需要手动管理,最新版本为1.7.8

首先在buildscript中配置SVNKit依赖


然后引用cli中的SVN,这样就可以直接调用程序的方法。


调用时使用


这是可以直接将上文的调用svn的地方全部改为调用SVN.main,但是这之前还有一个问题。

SVN.main实质上只有一句话,调用了svn目录下的SVN类,而这个类继承了AbstractSVNLauncher。而AbstractSVNLauncher的代码中包含了错误处理


对于System.exit()的调用明显是我们不希望的,即使SVNKit的运行出现了错误,我们依然期望其他任务继续运行。

通过Java的SecurityManager来达到目的


配置完成了,先来测试一下帮助信息的显示


运行


可以看到效果。

剩下的事情就简单了,把所有事情放到一个新的任务中去,命名为uploadWarToSae


试着运行看看,你可以会遇到一下问题

  • Server certificate verification failed
  • Fingerprint: * (R)eject, accept (t)emporarily or accept (p)ermanently?
  • failed: SSL error: certificate verify failed

从svn的帮助中可以找到这几个指令:—no-auth-cache —non-interactive —trust-server-cert

将它们加入doSvn中(其实也可以在调用的时候添加)


这样就没有问题了。

如果你觉得用户名和密码直接写入build.gradle不安全,你也可以考虑将私密信息写入gradle.properties中去。

集成Travis

Travis是一个和Github集成的非常好的CI。使用它你需要在项目中配置.travis.yml文件。

我希望让travis自动将每次的更改打包后上传到SAE中,当然直接调用


就行了。但是私密信息写在哪里?

Travis提供了利用RSA密匙加密的方法。具体细节参考文末链接。


这样就可以在命令行中调用了,比如


然后改造uploadWarToSae方法,让其可以接受参数。


运行效果如下:

结语

如果使用的是BAE的话,官方提供了maven的部署插件的…而SAE不知道有没有提供,反正从官方文档中没有看到。

附上几个参考地址:

AbstractSVNLauncher.java

Preventing System.exit() from API

disabling System.exit()

encryption-keys

发表评论

电子邮件地址不会被公开。