Continuous integration “每夜”;“发布构建”;在CruiseControl.NET中

Continuous integration “每夜”;“发布构建”;在CruiseControl.NET中,continuous-integration,cruisecontrol.net,Continuous Integration,Cruisecontrol.net,我在CruiseControl.NET 1.6.7981.1下为公司的一系列项目管理CI服务器。这些项目在逻辑上形成一个“产品”,但(至少部分)彼此独立。相比之下,MS Office是一个由独立项目“Word”、“Excel”等组成的“产品” 每个项目都有自己的ccnet项目,每当变更提交到源代码管理时(通过IntervalTrigger),该项目就会得到构建。这个很好用 产品本身包括不同“子”项目的输出以及附加的静态数据(位图、示例数据等)。为此,我有一个单独的“发布”ccnet项目,它执行这

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

每个项目都有自己的ccnet项目,每当变更提交到源代码管理时(通过IntervalTrigger),该项目就会得到构建。这个很好用

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

我还有两个额外要求:

  • 因为“发布”会生成如此巨大的数据量,所以我想每晚运行它(除非有人手动触发它)。实际上,我们有两个版本的产品和所有在CI服务器上运行的子项目(dev和last release)。上一个版本只获得补丁,因此可能有几天子项目中什么都没有做。因此,“发布”只应在子项目已修改的情况下运行
  • 有人可能会破坏其中一个子项目的构建。在修复之前,不应运行父“发布”项目
  • 然而,我试图解决这个问题的方法并不正确。我当前的ccnet.config大致如下(仅限相关部分):

    所以一切都很顺利。然后我立即重新构建它,修复了构建:

    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
    

    因此,尽管先前的构建失败了(正如您在第一个日志中从匹配到失败中所看到的),但当前(成功)构建的previous build status属性显然不是Failure!我想我将不得不针对ccnet提交一个bug…

    对于你的第一个问题,我的想法和你的一样:我认为调度触发器一直处于激发状态,并等待多重“或触发器”被激发。请注意,当您反转角色时会出现这种行为:当成功生成子项目时,您希望等待第二个触发器触发(23:30)

    满足您需求的两个想法是:

    • 将成功添加到项目触发器(以防止异常)
    • 将项目触发器的innerTrigger设置为计划触发器,而不是默认的间隔触发器。设置为23:30触发的日程表触发器应该可以解决您的问题
    至于你的第二个问题,我不知道为什么项目不会重新启动,索威


    我个人设法解决了这些产品的问题,我们使用了将近一年,这让我松了一口气。

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


    对于第二个问题,我的猜测是,可能每个项目的lastStatusCondition不能正常工作,而是“全局的”。因此,如果另一个项目同时成功运行,则最后一个状态设置为success,即使项目的最后一个状态应继续为“failed”。使用项目触发器时存在一个问题:第一次触发内部触发器时,它没有以前的状态作为比较。所以它不知道该怎么办。默认间隔触发器没有问题(因为它每5秒触发一次)。但这意味着在服务器重启后,我们可以再等待一天,或者总是触发(即使没有必要)。非常感谢!我得测试一下它是否按计划工作。次要更正:在
    子项目更改()
    中,如果同时生成了子项目,则立即返回true。但是,尚未检查的子项目可能处于失败状态。在本地,我将其更改为将其保存到一个临时变量,并在最后返回它。
    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