我有2个应用程序共享一个公共库。应用程序和库都在积极开发中。这两个应用程序都在其解决方案中包含项目文件。
文件夹在源代码管理中布局为:
Root
App1
App2
Library
我们目前有单独的巡航控制版本设置为在文件提交到app1,app2或库文件夹层次结构时运行。然后,成功构建的库将触发app1和app2的构建。
大多数情况下效果很好;问题是有人提交了对Library和App1(或app2)的更改。这通常是由于实现需要修改/添加要实现的库中的某些功能而导致的。发生这种情况时,将激活构建库(在库\ foo.cs中更改)和App1(在app1 \ bar.cs中更改)的触发器。两者都会看到文件Base \ Library \ foo.cs已被更改并尝试重建库。只有一个会成功,因为开始为Library编写目标文件的fire将获得一个独占文件锁;第二个立即失败。这已经发生过几次,迫使某人进入并手动重新运行因锁定而失败的构建。
为了再次尝试降低这种情况发生的风险,我们更改了每个触发器的轮询间隔,以便将它们设置为不同的值,以避免同时触发两次。它仍然不完美,因为Library和AppN之间的周期将在每N * M秒的同时发生(N和M是相应的轮询间隔)。
是否有更优雅或更不可能失败的解决方案?
答案 0 :(得分: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">