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使用 | 留下评论

BAE玩转截图对比测试

BAE的截图测试可以精确地截取页面中某一元素的快照,单独的截图测试一般用于获取图源,作为后续图片处理分析的基础,而截图对比测试则可以用于页面样式的监控。网站的更新迭代往往伴随着页面样式布局的更新,而一些较为重点的元素,有时希望固定其样式不受样式更新的影响,截图对比测试就可以用于监控页面某元素,利用md5对比,捕捉其细微的变化。
以百度凤巢广告样式为例:广告样式模板的更新很快,每次ci都有可能会影响现有广告的样式,截图对比测试可以检测到广告样式是否变化,从而判断这次ci是否存在bug。
在截图对比之前,首先会使用截图测试获取一张基准图片,在bae自动测试中创建一个截图测试,指定页面url和被截取元素的查找方式即可。
继续阅读

发表在 BAE使用 | 留下评论

BAE玩转死链测试

由于网站的不断更新、内容更替、自身的bug等原因,页面中难以避免得会存在死链。死链会影响用户的浏览体验,而页面关键位置尤其是推广广告中发生死链,会直接影响网站主的收益。
死链主要分为协议死链和内容死链。协议死链是指通过HTTP协议状态码明确表示网页已无阅读价值,HTTP协议状态码400以上均为明确的死链,对用户的体验影响很大。

内容死链主要是由网站自身变化引起的,网页可以正常打开但是内容毫无价值,例如帖子被删除、内容已转移、空间被关闭、信息已过期、交易已关闭、页面未找到等。

继续阅读

发表在 BAE使用 | 留下评论

扩展日志服务的新功能介绍

2015年6月16日,BAE对扩展日志服务进行了升级,新版本的扩展日志服务为用户提供了更多的日志容量选择,更多可定制化的功能,本文将一一介绍此次升级给用户带来的新功能

1. 更多的日志容量选择
升级前,BAE仅支持1GB容量的日志套餐,而且是免费的。对于部分日志量不大的用户,这种方式是非常友好的,不花钱还很好用的东西,大家都喜欢。但是,对于日志量很大的大户来说,这种方式的弊端也很明显,1GB很快就会用完,用完了还想用,怎么办?不好意思,没办法,您经常性的手工清理一下日志吧。不知道别人怎么想,至少我表示很崩溃,有限的生命浪费在了无限的重复劳动里。
如果你属于后一种用户,那么恭喜你,这次升级绝对满足你的需求,1GB不够用?那10GB怎么样?还不够?那可以选择20、50、100GB,相信这4种新套餐容量应该可以满足99%的用户的需求了。当然,如果100GB还不够的话,直接找BAE的技术支持吧,他们肯定想办法满足你的需求。
继续阅读

发表在 未分类 | 标签为 | 留下评论

利用扩展服务实现基于websocket的聊天室

简介

BAE提供了丰富的扩展服务,利用这些扩展服务,可以开发出各种各样的应用。今天我们来介绍一下,如何利用扩展服务开发一个聊天室。

该聊天室是一个HTML5的网页,效果图如下图所示。用户打开聊天室的页面后,可以输入姓名和消息,点击发送之后,消息就会通过服务器,转发到所有已经连接到服务器的浏览器,这样消息就能在整个“聊天室”中显示出来。同样的,别的用户发送的消息,当前用户也能即时的显示出来。


继续阅读

发表在 未分类 | 留下评论

使用BAE本地日志系统来定位错误 – node.js篇

在互联网时代,我们的代码都是部署在远程,而且还有可能同时被好几个实例运行。这样的情况使得使用调试器的代价变得非常大。因此,查看log成为了我们最主要的调试手段。

这里,我们以node.js为例,来说明BAE中的本地日志系统是如何帮助我们查找错误的。

node.js中,最简单的打印log的语句莫过于console.log(…)了。按照惯例,每一个函数的入口都应该有log。而且在错误发生的时候,应该使用console.error(…)来记录每一个错误。

继续阅读

发表在 BAE使用 | 留下评论

BAE迁移到百度开放云BCE后AK/SK使用上的变化

先说说BAEdeveloper.baidu.comdeveloper应用、developer服务、BAE以及BAE扩展服务和AK/SK之间的关系

 

developer.baidu.com这个平台在后面的描述中简称为developer

先看图1:
图1

 

从图1可以看出在developer上一个开发账号可以拥有多个developer的工程,developer工程下面包含了BAE等各个服务,而每个工程都有自己的一对AK/SK。

这时在“工程1”下面使用BAE以及其他服务时,需要用到AK/SK地方都是需要使用“工程1”下面的AK/SK。所以对于BAE开发者来说,对于处于“工程1”下面的BAE应用无论在代码中使用的了BAE的扩展服务如公有的Mysql、Mongo 以及日志服务等, 还是使用了developer的其他服务如云存储、 云推送等时,都是统一使用“工程1”下的AK/SK进行认证。所以在开发过程中只要保证BAE应用的代码中的AK/SK同BAE所在的工程下面的AK/SK一致就能正确地使用各项服务。

同时,对“工程1”进行SK重置时,对于“工程1”下的所有BAE应用使用的AK/SK中的SK都要修改为重置后的新SK。

 

继续阅读

发表在 未分类 | 留下评论

BAE3.0入门:移植Discuz X3.1论坛系统

注:该移植是针对discuz x3.1的版本,其他版本的移植可能不同。

上一次我发了一篇关于部署wordpress的文章,很多朋友询问discuz的BAE移植部署问题,今天我就发一篇关于BAE上部署Discuz的文章。

1、首先,同样是部署BAE的运行环境,共分两部分:php和mysql。

先创建一个php-work工程,然后创建mysql数据库

继续阅读

发表在 未分类 | 留下评论

BAE3.0入门:移植WordPress3.9博客系统

注:该移植是针对最新的Wordpress3.9版本,其他版本移植方法可能不同。

BAE3.0众多新特性受到了广大用户的青睐,与此同时,越来越多的用户询问各种环境的部署问题。现在我们就来移植下WordPress 3.9博客系统。之所以要移植,是因为我们的程序要跑在BAE上,任何服务器都有出现异常的时候,可能导致我们的应用无法使用,我们又没有备份,岂不是很悲剧?所以我们要在本地配置好我们的应用,然后移植上去,即使服务器宕机,我们仍然在本地保留着我们的代码。

1、首先,要在本地安装配置好WordPress博客系统,并在BAE上创建工程。
继续阅读

发表在 未分类 | 留下评论

玩转BAE3: 自定义运行环境

打造属于你自己的运行环境

1. 什么是Runtime

  • Runtime是一组进程,提供一个完整的服务,通常用来提供一个WEB服务,但是也可以提供别的服务;
  • 例如 lighttpd + php-fpm ,就构成了一个 PHP WEB runtime
  • nginx + rails ,构成了一个 ruby runtime
  • nodejs 可以单独成为一个 runtime
  • 这一组进程,必须被BAE框架统一管理。它们要不一起启动,要不一起停止; 并且需要在某个进程出现故障后,能够被自动重启;
  • 在BAE系统里面,通过 supervisord 来管理这一组进程。

继续阅读

发表在 未分类 | 留下评论