在CruiseControl.NET中每晚“发布构建”

我为我公司的一些项目管理CI服务器,在CruiseControl.NET 1.6.7981.1下运行。 这些项目在逻辑上构成了“产品”,但彼此之间(至少部分)是相互独立的。 作为比较,MS Office是由“Word”,“Excel”等独立项目组成的“产品”。

每个项目都有自己的ccnet-project,每当更改提交给源代码控制时(通过IntervalTrigger),就会生成它们。 这工作正常。

产品本身由不同“子”项目的输出以及附加的静态数据(位图,样本数据...)组成。 为此,我有一个单独的“发布”ccnet项目,它执行这些步骤,然后将数据复制到网络上的新输出文件夹。 这个“发布”也很好。 每次运行时,都会创建一个新文件夹; 目前每个文件夹是大约。 1GB大小。

我有两个额外的要求:

  • 由于“发布”会生成大量的数据,因此我希望每晚都运行它(除非有人手动触发它)。 我们实际上有两个版本的产品和所有在CI服务器上运行的子项目(dev和last-release)。 最后一个版本只能获得补丁,所以可能会有几天的时间在子项目中没有做任何事情。 所以“发布”应该只在一个子项目被修改的情况下运行。
  • 有人可能会破坏其中一个子项目的构建。 在修复之前,不应运行父项“发布”项目。
  • 然而,我试图解决它的方式无法正常工作。 我目前的ccnet.config看起来差不多。 如下所示(仅限相关部分):

    <project name="Child 1 dev" queue="dev" queuePriority="1">
        <!-- Build the project -->
        <publishers>
            <!-- Logger, statistics, ... -->
            <conditional>
                <conditions>
                    <statusCondition value="Success" />
                    <lastStatusCondition value="Failure" />
                </conditions>
                <tasks>
                    <cruiseServerControl>
                        <actions>
                            <controlAction type="StartProject" project="Publish dev" />
                        </actions>
                    </cruiseServerControl>
                </tasks>
            </conditional>
            <conditional>
                <conditions>
                    <statusCondition value="Failure" />
                </conditions>
                <tasks>
                    <cruiseServerControl>
                        <actions>
                            <controlAction type="StopProject" project="Publish dev" />
                        </actions>
                    </cruiseServerControl>
                </tasks>
            </conditional>
        </publishers>
    </project>
    
    <!-- Additional "child" projects as above -->
    
    <project name="Publish dev" queue="dev" queuePriority="10">
        <triggers>
            <multiTrigger operator="And">
                <triggers>
                    <multiTrigger operator="Or">
                        <triggers>
                            <projectTrigger project="Child 1" />
                            <projectTrigger project="Child 2" />
                            <projectTrigger project="Child 3" />
                        </triggers>
                    </multiTrigger>
                    <scheduleTrigger buildCondition="ForceBuild" time="23:30" />
                </triggers>
            </multiTrigger>
        </triggers>
        <!-- Do the publishing, a bunch of exec tasks. -->
    </project>
    

    问题:

  • 如果几天内没有在子项目中完成,则不会运行“发布”。 之后,只要儿童项目发生变化,“发布”就会运行。 我猜测ScheduleTrigger保持触发。 我尝试在FilterTrigger中包装ScheduleTrigger,但有时候根本没有构建。
  • 如果子项目的构建失败,则发布项目将停止。 但是,构建成功后再次启动项目通常不起作用。
  • 所以简而言之,我想解决方案会为“发布dev”触发一组触发器:

  • 每晚23:30(例如)。
  • 自上一个“发布开发”以来,任何子项目都已成功构建。
  • 并且没有任何子项目处于构建失败状态(即所有子项目都处于成功构建状态)。
  • 如果#2或#3错误,则下一次检查只应在​​第二天晚上进行。

    编辑:

    lastStatusCondition肯定有问题。 我有以下输出:

    构建失败:

    2011-04-01 10:14:06,105 [Child 1 dev] [DEBUG] - Checking conditions
    2011-04-01 10:14:06,105 [Child 1 dev] [DEBUG] - Checking status - matching to Success
    2011-04-01 10:14:06,105 [Child 1 dev] [INFO] - Conditions did not pass - running else tasks
    2011-04-01 10:14:06,105 [Child 1 dev] [INFO] - Tasks completed: 0 successful, 0 failed
    2011-04-01 10:14:06,105 [Child 1 dev] [DEBUG] - Checking conditions
    2011-04-01 10:14:06,105 [Child 1 dev] [DEBUG] - Checking status - matching to Failure
    2011-04-01 10:14:06,121 [Child 1 dev] [INFO] - Conditions passed - running tasks
    

    所以一切工作正常。 然后我立即重新构建它,并修复了构建:

    2011-04-01 10:18:36,078 [Child 1 dev] [DEBUG] - Checking conditions
    2011-04-01 10:18:36,078 [Child 1 dev] [DEBUG] - Checking status - matching to Success
    2011-04-01 10:18:36,078 [Child 1 dev] [DEBUG] - Checking last build status - matching to Failure
    2011-04-01 10:18:36,078 [Child 1 dev] [INFO] - Conditions did not pass - running else tasks
    2011-04-01 10:18:36,093 [Child 1 dev] [INFO] - Tasks completed: 0 successful, 0 failed
    2011-04-01 10:18:36,093 [Child 1 dev] [DEBUG] - Checking conditions
    2011-04-01 10:18:36,093 [Child 1 dev] [DEBUG] - Checking status - matching to Failure
    2011-04-01 10:18:36,093 [Child 1 dev] [INFO] - Conditions did not pass - running else tasks
    2011-04-01 10:18:36,093 [Child 1 dev] [INFO] - Tasks completed: 0 successful, 0 failed
    

    因此,尽管之前的构建失败了(正如您可以从匹配看到第一个日志中的失败),但当前(成功)构建的以前的构建状态属性显然不是失败! 我想我必须提交一个针对ccnet的错误...


    看看我的博客,我在那里提供了一个解决方案。 赞赏评论:

    http://rubenwillems.blogspot.com/2011/04/tuning-ccnet-to-your-whishes-new.html


    对于你的第一个问题,我的想法就像你的想法:我认为时间表触发器保持开启状态并等待多个“OR触发器”被触发。 请注意,在反转角色时需要此行为:当您成功构建子项目时,您希望等到第二个触发器触发(23:30)。

    适合您的要求的一些想法是:

  • 将<triggerStatus> Success </ triggerStatus>添加到项目触发器(以防止例外)
  • 将项目触发器的innerTrigger设置为计划触发器,而不是默认间隔触发器。 日程安排触发器于23:30发射应解决您的问题
  • 至于你的第二个问题,我不知道为什么这个项目不会重新开始。

    我personnaly设法处理这些产品与企业持续集成问题,我们使用了近一年,这是很大的安慰。

    链接地址: http://www.djcxy.com/p/23271.html

    上一篇: Nightly "publish build" in CruiseControl.NET

    下一篇: CruiseControl.Net build logs not showing on CCNet website after upgrade