Bre*_*gby 0 svn cruisecontrol.net nant build-automation
为了加速我的NAnt/CruiseControl.Net/Ivy连续构建过程,我希望让NAnt在执行基于NAnt的更新后检查我的代码库是否在我的本地PC上发生了变化,然后如果代码已经改变,然后启动流程重新构建该项目,并可能提出一个标志来构建所有后续组件,而不管它们的更改状态如何.
原因是,我的构建过程目前花费了超过12分钟来完成大量工作,我想我可以通过不构建不会改变的代码以及保持开发人员来减少这段时间在办公室也更开心.
我们已经调查过从构建顺序中删除一些项目,但是如果构建树顺序进一步发生任何更改,它们都是必需的.
我可以看到几个选项
1 - 发出一个svn状态 - 在svn之前显示更新 - 如果有任何更改,则计算出来(应该像计算响应中的行一样简单 - 我认为最新文件夹只生成1行)
2 - 从svn-update任务更改为exec任务并将输出从svn重定向到测试文件,您可以发布进程以确定是否进行了任何更新(类似于第一个选项).
3 - 在svn之后使用基于http://jonathanmalek.com/wp/?p=244的任务获取svn日志,然后处理xml以确定是否进行了任何更改.这只有在保证仅增加1转数时才有效,因为它只获取最后一次修订的日志信息.对此的变化将是在svn之前和之后获取日志,然后比较它们.
我个人会选择2.在最新的工作目录上运行svn导致一行(在修订版)因此从使用svn更新任务更改为以下内容:
<target name="Svn-update">
  <!-- Default to true so failure mode is to build / signal build is required -->
  <property name="source.changed" value="true"/> 
    <exec 
          program="svn.exe" 
         commandline=’up? 
          output="_update.log" 
          failonerror="true"/> 
    <property name="updates.count" value="0"/>
    <foreach item="Line" in="_update.log" property="updates.line" trim="Both">
        <property name="updates.count" value="${int::parse(updates.count) + 1}"/>
    </foreach>
    <if test="${updates.count==1}">
        <!-- An up to date working directory generates a single line "At revision xxx" -->
        <property name="source.changed" value="false"/>
    </if>
</target>
现在您可以使用if ="$ {source.change =='true'}"并且除非="$ {source.changed =='true'}"来确定何时应该并且应该执行构建和通知的剩余部分