1

複数の環境で実行する必要があるプロジェクト用の Cruisecontrol ビルドをセットアップしました。これは私が現在使用しているものです:

<parameters>
    <selectParameter>
        <name>Environment1</name>
        <display>Environment1</display>
        <allowedValues>
            <value name="No">No</value>
        <value name="Yes">Yes</value>
        </allowedValues>
    </selectParameter>
    <selectParameter>
        <name>Environment2</name>
        <display>Environment2</display>
        <allowedValues>
            <value name="No">No</value>
        <value name="Yes">Yes</value>
        </allowedValues>
    </selectParameter>
    <selectParameter>
        <name>Environment3</name>
        <display>Environment3</display>
        <allowedValues>
            <value name="No">No</value>
        <value name="Yes">Yes</value>
        </allowedValues>
    </selectParameter>
</parameters>

<conditional>
    <conditions>
    <compareCondition value1="Environment1" evaluation="equal" value2="Yes" />
    </conditions>
    <tasks>
        <msbuild>
            <executable>C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe</executable>
            <workingDirectory>$[DirectoryOfBuildScript]</workingDirectory>
            <projectFile>MSBuild.proj</projectFile>
            <buildArgs>/v:n /p:Environment=Environment1;Version=$[BuildVersion];</buildArgs>
            <targets>Deploy</targets>
            <timeout>3000</timeout>
            <logger>ThoughtWorks.CruiseControl.MsBuild.XmlLogger,C:\Program Files\CruiseControl.NET\webdashboard\bin\ThoughtWorks.CruiseControl.MsBuild.dll</logger>
        </msbuild>
    </tasks>
</conditional>

<conditional>
    <conditions>
    <compareCondition value1="Environment2" evaluation="equal" value2="Yes" />
    </conditions>
    <tasks>
        <msbuild>
            <executable>C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe</executable>
            <workingDirectory>$[DirectoryOfBuildScript]</workingDirectory>
            <projectFile>MSBuild.proj</projectFile>
            <buildArgs>/v:n /p:Environment=Environment2;Version=$[BuildVersion];</buildArgs>
            <targets>Deploy</targets>
            <timeout>3000</timeout>
            <logger>ThoughtWorks.CruiseControl.MsBuild.XmlLogger,C:\Program Files\CruiseControl.NET\webdashboard\bin\ThoughtWorks.CruiseControl.MsBuild.dll</logger>
        </msbuild>
    </tasks>
</conditional>

<conditional>
    <conditions>
    <compareCondition value1="Environment3" evaluation="equal" value2="Yes" />
    </conditions>
    <tasks>
        <msbuild>
            <executable>C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe</executable>
            <workingDirectory>$[DirectoryOfBuildScript]</workingDirectory>
            <projectFile>MSBuild.proj</projectFile>
            <buildArgs>/v:n /p:Environment=Environment3;Version=$[BuildVersion];</buildArgs>
            <targets>Deploy</targets>
            <timeout>3000</timeout>
            <logger>ThoughtWorks.CruiseControl.MsBuild.XmlLogger,C:\Program Files\CruiseControl.NET\webdashboard\bin\ThoughtWorks.CruiseControl.MsBuild.dll</logger>
        </msbuild>
    </tasks>
</conditional>

ご覧のとおり、すべての条件文で異なるのは環境名だけです。選択した環境名をループしてビルド呼び出しを一般化する方法はありますか (バージョンは異なりません)。このようなもの:

// Conceptually I want a for loop which iterates through the selected environments
foreach(environmentName in selectedEnvironments)
{
    <tasks>
        <msbuild>
            <executable>C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe</executable>
            <workingDirectory>$[DirectoryOfBuildScript]</workingDirectory>
            <projectFile>MSBuild.proj</projectFile>
            <buildArgs>/v:n /p:Environment=environmentName;Version=$[BuildVersion];</buildArgs>
            <targets>Deploy</targets>
            <timeout>3000</timeout>
            <logger>ThoughtWorks.CruiseControl.MsBuild.XmlLogger,C:\Program Files\CruiseControl.NET\webdashboard\bin\ThoughtWorks.CruiseControl.MsBuild.dll</logger>
        </msbuild>
    </tasks>
}
4

1 に答える 1

1

このようなものにプリプロセッサを使用することを検討します。どこにも文書化されていませんが、プリプロセッサには for-each 要素があるようです。ただし、CCNet ソースには、その使用方法を示すテストがあります。

質問に関しては、同様の概念実証を作成しましたが、条件に簡単に適応できるはずです。特定の環境を構築する代わりに、ping を実行するドメインのリストを提供するだけです。

ドメインをdefineとして提供し、 2 回以上繰り返さないようにします。

<cb:define name="domains">
    ['facebook', 'twitter', 'wired']
</cb:define>

次に、同じ方法でパラメーターを定義します。

<cb:define name="paramDef">
    <selectParameter>
        <name>$(domainName)</name>
        <display>$(domainName)</display>
        <allowedValues>
            <value name="No">No</value>
            <value name="Yes">Yes</value>
        </allowedValues>
    </selectParameter>
</cb:define>

...そしてタスクの場合:

<cb:define name="condTask">         
    <conditional>
        <conditions>
            <compareCondition>
                <value1>$[$(domainName)]</value1>
                <value2>Yes</value2>
                <evaluation>Equal</evaluation>
                <ignoreCase>true</ignoreCase>
            </compareCondition>
        </conditions>
        <tasks>
            <exec executable="ping">
                <buildArgs>$(domainName).com</buildArgs>
            </exec>
        </tasks>
    </conditional>
</cb:define>

( value1の奇妙な構造に注意してください- 名前に一致し、その名前の値を評価します)

これですべてが整ったので、必要なものだけを生成できます。パラメータの場合:

<parameters>
    <cb:for-each iterator-name="i" iterator-expr="$(domains)">
        <cb:scope domainName="$(i)">    
            <cb:paramDef />
        </cb:scope>
    </cb:for-each>
</parameters>

...そしてタスクについても同じです:

<tasks>
    <cb:for-each iterator-name="i" iterator-expr="$(domains)">
        <cb:scope domainName="$(i)">    
            <cb:condTask />
        </cb:scope>
    </cb:for-each>
</tasks>

以上です。次にpingする必要があるドメインは、ドメイン配列に入れるだけです。

いくつかのメモ:

  • cb:scope要素は、実際に定義された値をオーバーライドします。
  • 上記の場合、必要な値が Environment1、Environment2、Environment3 などの形式である場合、プリプロセッサの通常の forループを使用する方が少し簡単かもしれません(ドキュメントのサンプル)。
  • プリプロセッサのドキュメント: http://cruisecontrolnet.org/projects/ccnet/wiki/Configuration_Preprocessor
于 2013-01-30T15:50:23.107 に答える