设为首页 收藏本站
查看: 772|回复: 0

[经验分享] 使用Apache Ant及SVN进行自动化构建

[复制链接]

尚未签到

发表于 2017-1-11 11:07:21 | 显示全部楼层 |阅读模式
详见我的博客:http://www.zawaliang.com/2013/04/319.html
 

在团队里,一个项目通常对应多个开发人员,基于对性能优化的考虑,上线前往往需要对js、css等资源进行压缩、合并、修改时间戳,然后再按团队规范提交SVN,最后由SVN导出增量zip发布包进行发布。

传统的做法可能需要手工对一个个修改过的文件进行YUI压缩,然后更新相应的时间戳,最后根据SVN log提取文件打包。

既然工作流程都是基本固化的,作为懒人,就需要省时省力点的做法。

Apache Ant,一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具。没有了解过的同学自己Google学习,下面我就以一个Demo为例,给大家介绍下Ant的大部分常用功能,并达到自动压缩、合并、SVN提交、生成增量zip包的目的。

 

Demo

假设我们的目录架构如下,html5为根目录,app里放了一个lottery的应用,app.json.tpl为统一的版本号文件,build.xml为Ant的入口文件;res为资源目录,里面也放了lottery的资源文件。
我们现在需要把每个xx.js压缩为xx.min.js,xx.css压缩为xx_min.css,并将更改版本号应用到app.json文件里。

html5/---
|---app/
|---lottery/
|---a/
|---a.html
|---b/
|---b.html
|---index.html
|---app.json
|---app.json.tpl
|---build.xml
|---res/
|---app/
|---lottery/
|---css/
|---global/
|---global.css
|---index/
|---index.css
|---js/
|---common/
|---zepto.js
|---touch.js
|---app.js
|---index/
|---index.js
 

第三方库

因需要用到SVN、xpath、for循环等功能,需要引入第三方库,点击这里下载并解压到Ant的lib目录即可。

Ant-Contrib Tasks

http://ant-contrib.sourceforge.net/tasks/tasks/index.html

 

svnant

http://subclipse.tigris.org/svnant.html

 

svnant不支持svn1.7.x版本,这里使用svnkit1.7的版本

http://svnkit.com/download.php

 

其他支持svn1.7.x的方案,未验证


  • svnant不支持SVN1.7.X版本,所以这里使用优化过的svntask
  • https://github.com/opticyclic/svntask
  • svntask (功能比svnant少,但支持svn1.7.x)
  • http://code.google.com/p/svntask/

 

build.xml

详细请参考:https://github.com/zawaliang/AntSvnDemo
下面说明一些需要注意的点:


  • project的basedir需要定位到根目录,这也是取SVN基准地址的前提
    <project name="lottery" default="build" basedir="../../" xmlns:ac="antlib:net.sf.antcontrib">
  • 基于SVN Commit Message进行提取需要根据指定的规则进行,这里以“[xxx_v1.0] abcde”的格式提取,最后生成的zip包命名为“xxx_v1.0.zip”
    <property name="svn.version-regexp" value=".*(\[(.+)\]).*" />
  • app.json.tpl为版本号文件,这里需要替换的token格式为:{/html5/res/app/lottery/js/common/zepto.min.js},其中的地址为文件相对根目录的地址,这个token最终会被替换为文件校验和(MD5值)
  • SVN日志数限制是一个经验值,由于不能指定某个revision区间,这里取的是所有日志,但限定提取的条数,这个请根据实际项目的经验值调整。
    <property name="svn.log-limit" value="100" />
  • 文件压缩
    <apply executable="java" verbose="true" dest="${path.build.js}" failonerror="true" parallel="false">
    <fileset dir="${path.build.js}" includes="**/*.js" excludes="**/*${suffix.js}" />
    <arg line="-jar" />
    <arg path="${path.yuicompressor}" />
    <arg line="--charset ${encode.js}" />
    <arg value="--type" />
    <arg value="js" />
    <arg value="-o" />
    <targetfile />
    <mapper type="regexp" from="^(.*)\.js$" to="\1${suffix.js}"/>
    </apply>
  • 文件合并
    <concat encoding="${encode.js}" outputencoding="${encode.js}" destfile="${path.build.js}/common/lottery${suffix.js}">
    <header trimleading="yes">${copyright.zepto}</header>
    <path path="${path.build.js}/common/zepto${suffix.js}" />
    <path path="${path.build.js}/common/touch${suffix.js}" />
    <path path="${path.build.js}/common/app${suffix.js}" />
    </concat>
  • SVN初始化,由于写作时svnant官方还不支持svn1.7.x的版本,所以这里需要更新svnkit到1.7.9的版本方可
    <target name="svn-init">
    <echo level="info" message="正在初始化SVN..." />
    <path id="path.svnant">
    <pathelement location="${ant.library.dir}/svnant/svnant.jar" />
    <pathelement location="${ant.library.dir}/svnant/svnClientAdapter.jar" />
    <pathelement location="${ant.library.dir}/svnant/ganymed.jar" />
    <!-- svnkit-1.7.9 支持svn1.7.x -->
    <pathelement location="${ant.library.dir}/svnkit-1.7.9/svnkit-1.7.9.jar" />
    <pathelement location="${ant.library.dir}/svnkit-1.7.9/svnkit-javahl16-1.7.9.jar" />
    <pathelement location="${ant.library.dir}/svnkit-1.7.9/sqljet-1.1.7.jar" />
    <pathelement location="${ant.library.dir}/svnkit-1.7.9/antlr-runtime-3.4.jar" />
    <pathelement location="${ant.library.dir}/svnkit-1.7.9/sequence-library-1.0.2.jar" />
    </path>
    <typedef resource="org/tigris/subversion/svnant/svnantlib.xml" classpathref="path.svnant" />
    <svnSetting id="svn.settings" svnkit="true" javahl="false" username="${svn.user}" password="${svn.password}" failonerror="true" />
    </target>
  • 关于SVN基准路径的获取,基于svn内部变量来自动获取当前工作副本的svn映射路径
    <ac:propertyregex property="repourl" override="true" casesensitive="true" global="true" input="${svn.info.repourl}" regexp="\\" replace="\\\\\\\\" defaultValue="${svn.info.repourl}" />
    <ac:propertyregex property="repourl" override="true" casesensitive="true" global="true" input="${repourl}" regexp="\:" replace="\\\\:" defaultValue="${repourl}" />
    <ac:propertyregex property="repourl" override="true" casesensitive="true" global="true" input="${repourl}" regexp="\." replace="\\\\." defaultValue="${repourl}" />
    <ac:propertyregex property="svn.basedir" override="true" casesensitive="true" global="true" input="${svn.info.url}" regexp="${repourl}(.*)" select="\1" />
  • 提交新增的文件到SVN时注意不要使用fileset,否则会出现告警
    <!-- 使用fileset会导致失败 http://stackoverflow.com/questions/11402891/svn-ant-add-task-with-force-option-gives-is-already-under-version-control -->
    <add force="true" dir="${path.js}" />
    <add force="true" dir="${path.css}" />
    <add force="true" dir="${path.app}" />
  • SVN日志解析,文件路径提取及zip包处理
    <!-- 1. 查询commit message含指定版本号的节点 -->
    <!-- 2. 排除Action=Deleted的目录或文件 -->
    <copy property="log.paths" path="/log/logentry[contains(msg, '${svn.versionFormat}')]/paths/path[@action!='D']/text()" append="true" trim="true" propertySeparator="|" />
    先提取含指定版本号的节点,同时排除action为deleted的操作。在处理zip包时,对svnlog获取到的路径再加以判断,以排除那些delete操作的文件(夹)。

    <ac:var name="zip.isfile" unset="true" />
    <available file="${zip.file}" type="file" property="zip.isfile" />
    <ac:if>
    <isset property="zip.isfile" />
    <ac:then>
    <ac:if>
    <!-- ant build.xml不处理 -->
    <equals arg1="${zip.file}" arg2="${ant.file}" />
    <ac:else>
    <echo level="info" message="File: ${zip.file}" />
    <copy file="${zip.file}" tofile="${zip.tofile}" overwrite="true" preservelastmodified="true" />
    </ac:else>
    </ac:if>
    </ac:then>
    <ac:else>
    <!-- 不存在,有可能是svn deleted的目录或文件 -->
    <ac:var name="zip.isdir" unset="true" />
    <available file="${zip.file}" type="dir" property="zip.isdir" />
    <ac:if>
    <isset property="zip.isdir" />
    <ac:then>
    <!-- 空目录处理 -->
    <echo level="info" message="Dir: ${zip.file}" />
    <mkdir dir="${zip.tofile}" />
    </ac:then>
    <ac:else>
    <!-- 表明当前路径为svn deleted的文件或目录,不需要处理 -->
    </ac:else>
    </ac:if>
    </ac:else>
    </ac:if>

完整版请参考:https://github.com/zawaliang/AntSvnDemo
 
 
详见我的博客:http://www.zawaliang.com/2013/04/319.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-326999-1-1.html 上篇帖子: Apache Cassandra Learning Step by Step (4): Data Modeling 下篇帖子: java.lang.RuntimeException: Unable to load bean org.apache.struts2.dispatcher.mu
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表