2010-01-22 62 views
2

我有2个应用程序共享一个公共库。应用程序和库都在积极开发中。这两个应用程序都在他们的解决方案中包含项共享代码库和巡航控制测试

这些文件夹的源代码控制布局为:

Root 
    App1 
    App2 
    Library 

目前,我们有独立的巡航控制系统构建设置为运行文件被提交到APP1,APP2,或库文件夹层次结构的任何时间。一个成功的库构建将触发app1和app2的构建。

大多数情况下,这种方式很好;问题是有人对库和App1(或App2)提交更改时。这通常是由于实现一个功能需要修改/添加库中的某些内容来实现的结果。发生这种情况时,触发器将同时激活Library(Library \ foo.cs中的更改)和App1(更改app1 \ bar.cs中的内容)。两者都会看到文件Base \ Library \ foo.cs已被更改并尝试重建库。只有一个会成功,因为开始为Library编写一个目标文件的火灾将获得一个独占文件锁;第二个立即失败。这已经发生过几次,迫使某人进入并手动重新运行由于锁定而失败的内部版本。

为了试图减轻这种情况再次发生的风险,我们更改了每个触发器的轮询间隔,以便将它们设置为不同的值以避免同时触发两次触发。它还不完美,因为库和AppN之间的周期将在每N * M秒(N和M是相应的轮询间隔)同时发生。

是否有更优雅或不太可能的失败解决方案?

+0

很高兴我的回答对你起作用。去团队! – 2010-01-22 20:09:22

回答

4

是的。我相信你想把所有3个项目放在同一个队列中。这将阻止项目同时构建。

你会想这样的事情在你的ccnet.config文件:

<project name="Library" queue="Q1" queuePriority="1"> 
<project name="App1" queue="Q1" queuePriority="2"> 
<project name="App2" queue="Q1" queuePriority="3">