所有项目用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上拿了。

原文地址:https://www.cnblogs.com/vinson1816/p/3137784.html