所有项目用Jenkins进行持续构建

最近在持续地完善Ant脚本,让构建更简单智能化。

现在客户化的步骤有:
1. 替代标准Android SDK的jar
2. 在构建前去SVN获取最新提交的SVN号,然后修改AndroidManifest.xml的versionName,让它包含SVN号、构建时间信息。方便查询。
3. 构建完之后,再把对AndroidManifest文件的修改revert回来。
4. 调用系统签名文件进行系统签名

这里需要用到的软件有:SlikSvn、xmltask。
感觉比较有成就感的是第二步。使得本地电脑只需要提供基本的版本号,如1.2.4,然后把这个修改提交到SVN,然后经过Ant的构建,apk的版本自动改成包含SVN、构建日期等信息,但构建完之后,本地文件又没有任何改动。

几个关键步骤:

获取SVN号:(如果本地有修改的文件的话,获取的SVN号后面会MP字样,在Jenkins因为都是最新代码,就不会有此问题)

<target name="-get-svnversion">

        <exec outputproperty="build.svnversion" executable="${svnversion.home}/svnversion">

            <arg line="-c" />

            <redirector>

                 <outputfilterchain>

                     <linecontainsregexp>

                         <regexp pattern="^*:"/>

                     </linecontainsregexp>

                     <tokenfilter>

                         <replaceregex pattern="[0-9]+\:\s*" flags="s" replace=""/>

                     </tokenfilter>

                 </outputfilterchain>

             </redirector>

        </exec>

        <echo> Current version is: ${build.svnversion}</echo>

    </target>

  提取AndroidManifest文件里面的版本号:

    <target name="-extract-version">

        <xmltask source="${android.manifest}"> 

            <copy path="manifest/@android:versionName" property="current.version"/>

        </xmltask> 

        <echo>${current.version}</echo>

    </target>

修改AndroidManifest里面的版本名称:

<target name="-update-version" depends="-get-svnversion,-extract-version">

        <property name="matchChannel.start" value='android:versionName=\"' />

        <property name="matchChannel.end" value='\"' /> 

        

        <tstamp>

          <format property="TODAY_UK" pattern="yyyyMMdd-HHmm" locale="en,UK"/>

        </tstamp>

        <echo>the current date is ${TODAY_UK}</echo>

        

        <replaceregexp file="AndroidManifest.xml" 

            match='${matchChannel.start}[^"]*${matchChannel.end}' 

            replace="${matchChannel.start}${ant.project.name}-${current.version}-${TODAY_UK}-${build.svnversion}${matchChannel.end}" />

        

    </target>

在使用xmltask之前,需要先下载该jar文件,然后把它放在某个位置。我这里就放在${ant.home}/lib/目录下。然后在xml前面写上:

<taskdef name="xmltask" 

            classname="com.oopsconsultancy.xmltask.ant.XmlTask" classpath="${ant.home}/lib/xmltask.jar"/>

值得注意的是:在调用SVN获取版本号的时候,可能会说SVN版本太低,需要升级。我的脚本里面没有调用svn upgrade的命令(或许后续应该考虑加进去),手动在命令行输入刚才的命令。

这样基本的构建脚本就完成了。每次要拿软件的时候,就直接在Jenkins上拿了。

你可能感兴趣的:(Jenkins)