在两个存储库和文件系统中的任何一个发生更改时执行构建

时间:2012-03-27 20:21:22

标签: cruisecontrol.net

我有一个ccnet项目,可以监视两个SVN存储库以进行更改。使用多重类型的源控制块可以正常工作。现在项目需要观察两个存储库和一个文件。只有在两个存储库中的一个更改文件发生更改时,才需要构建它。

我尝试在多源控制块中嵌套多源控制块,如下所示(您可以忽略所有变量):

    <sourcecontrol type="multi">
        <requireChangesFromAll>True</requireChangesFromAll>
        <sourceControls>
        <sourcecontrol type="multi">
            <requireChangesFromAll>False</requireChangesFromAll>
            <sourceControls>            
                <filtered>              
                    <sourceControlProvider type="svn" autoGetSource="false">
                       <executable>$(svn-exe)</executable>
                       <timeout units="minutes">60</timeout>
                       <trunkUrl>$(svn-srcmwo)</trunkUrl>
                       <workingDirectory>$(mwo-localfull)</workingDirectory>
                    </sourceControlProvider>
                    <inclusionFilters>
                        <cb:mwo-include-filters/>                       
                    </inclusionFilters>
                </filtered>
                <filtered>
                    <sourceControlProvider type="svn" autoGetSource="false">
                        <executable>$(svn-exe)</executable>
                        <timeout units="minutes">10</timeout>
                        <trunkUrl>$(svn-orion)</trunkUrl>
                        <workingDirectory>$(orion-localfull)</workingDirectory>
                        <webUrlBuilder type="websvn">
                            <url>$(viewvc-orion){0}$(viewvc-config)</url>
                        </webUrlBuilder>
                    </sourceControlProvider>
                    <inclusionFilters>
                        <pathFilter>
                            <pattern>$(svn-orion-trunk)</pattern>
                        </pathFilter>
                    </inclusionFilters>
                    <exclusionFilters>
                        <pathFilter>
                            <pattern>$(svn-grsim-makfiles)</pattern>
                        </pathFilter>
                    </exclusionFilters>
                </filtered>             
            </sourceControls>               
        </sourcecontrol>
        <sourcecontrol type="filesystem">
            <repositoryRoot>e:\build_listen</repositoryRoot>
        </sourcecontrol>
      </sourceControls>
    </sourcecontrol>

但是CCValidator给出了错误:

检测到未使用的节点:&lt; sourcecontrol type =“filesystem”&gt;&lt; repositoryRoot&gt; e:\ build_listen&amp; lt / repositoryRoot&gt;&lt; / sourcecontrol&gt;

有没有人知道如何做到这一点 - 在文件系统和两个存储库上执行AND操作?

2 个答案:

答案 0 :(得分:4)

这个嵌套的源代码控件确实非常复杂。首先,您错过了外部多源控件块中的<sourceControls>标记。其次,CCNET documentation on multi sourcecontrol blocks中有一个重要的注释:

  

请注意,由于解析配置的方式,如果使用“多”块,则元素中的项不应是元素(如您所料)。相反,元素的名称应与使用元素时在“type”属性中放置的名称相同。

这就是源控件阻止在现有配置中工作的方式:<filtered>而不是<sourcecontrol type="filtered">

所以这应该可以解决你的问题:

<sourcecontrol type="multi">
  <requireChangesFromAll>True</requireChangesFromAll>
  <sourceControls>
    <multi>
      <requireChangesFromAll>False</requireChangesFromAll>
      <sourceControls>
        <filtered>
          <sourceControlProvider type="svn" autoGetSource="false">
            <executable>$(svn-exe)</executable>
            <timeout units="minutes">60</timeout>
            <trunkUrl>$(svn-srcmwo)</trunkUrl>
            <workingDirectory>$(mwo-localfull)</workingDirectory>
          </sourceControlProvider>
          <inclusionFilters>
            <cb:mwo-include-filters/>
          </inclusionFilters>
        </filtered>
        <filtered>
          <sourceControlProvider type="svn" autoGetSource="false">
            <executable>$(svn-exe)</executable>
            <timeout units="minutes">10</timeout>
            <trunkUrl>$(svn-orion)</trunkUrl>
            <workingDirectory>$(orion-localfull)</workingDirectory>
            <webUrlBuilder type="websvn">
              <url>$(viewvc-orion){0}$(viewvc-config)</url>
            </webUrlBuilder>
          </sourceControlProvider>
          <inclusionFilters>
            <pathFilter>
              <pattern>$(svn-orion-trunk)</pattern>
            </pathFilter>
          </inclusionFilters>
          <exclusionFilters>
            <pathFilter>
              <pattern>$(svn-grsim-makfiles)</pattern>
            </pathFilter>
          </exclusionFilters>
        </filtered>
      </sourceControls>
    </multi>
    <filesystem>
      <repositoryRoot>e:\build_listen</repositoryRoot>
    </filesystem>
  </sourceControls>
</sourcecontrol>

答案 1 :(得分:1)

我认为你不能有两个sourcecontrol块 你应该重构你的项目如下:

  1. 只有文件系统触发器的一个项目 这将成为下一份工作的触发器

  2. 使用您的多源控件触发器链接到上一个项目的另一个项目。

  3. 看看CruiseServer Control Task同步两个作业: