Создание триггера, когда другой успешно завершен в TFS 2008

Это функция, с которой я привык от TeamCity - я мог указать, что определенная конфигурация сборки будет вызвана успехом другой конфигурации сборки.

Я мог бы даже передать результаты одной сборки другому, но, возможно, это слишком много.

Я ищу аналогичную функциональность в TFS2008, есть ли способ установить триггер в конфигурации сборки, который он должен начать после того, как другой закончен успешно?

Ответ 1

Я использую следующую цель в своем TFSBuild.proj:

Ввести новые цели в процесс сборки. Мы запускаем зависимые сборки только при успешном создании "drop":

<PropertyGroup>
    <DropBuildDependsOn>
        $(DropBuildDependsOn);
        CreateDependentBuildItemGroup;
        TriggerDependentBuilds;
    </DropBuildDependsOn>
</PropertyGroup>

Создайте группу элементов, которая содержит список зависимых сборок, которые мы хотим вызвать (атрибут Include будет отображать имя зависимой сборки, как он отображается в проводнике сборки), в моем случае ниже зависимая сборка называется "Интеграция" ). В нашем процессе сборки мы иногда хотим запускать более одной сборки, и мы хотим указать следующую сборку на двоичные файлы, которые были созданы текущей сборкой (в этом примере я хочу запустить тесты интеграции с создаваемыми исполняемыми файлами). Обратите внимание на хак, чтобы обойти пробелы в именах конфигураций - например, "Любой процессор" вызовет проблему в аргументах MsBuild. Используя этот формат, мы можем иметь настраиваемые аргументы MSBuild для зависимой сборки.

<Target Name="CreateDependentBuildItemGroup">
    <ItemGroup>
        <DependentBuild Include="Integration">
            <!--Using 8dot3 format for "Mixed Platforms" as it tricky (impossible?) to pass a space char within /msbuildarguments of tfsbuild-->
            <MsBuildArgs>/p:CallingBuildDropFolder=$(DropLocation)\$(BuildNumber)\Mixedp~1\Ship;CiSmallBuildNumber=$(CiSmallBuildNumber);BuildNumberPostFix=$(BuildNumberPostFix)</MsBuildArgs>
            <PriorityArg>/priority:AboveNormal</PriorityArg>
        </DependentBuild>
    </ItemGroup>    
</Target>

Теперь запустите сборку. Обратите внимание, что мы используем Custom GetOption: мы хотим убедиться, что зависимые сборки используют тот же набор изменений, что и используемая текущая сборка, - мы не можем использовать Latest, потому что кто-то может быть зарегистрирован за это время, - поэтому мы хотим, чтобы все зависимые сборки наша "цепочка" для всех будет основана на том же наборе изменений. Фактическая команда находится в Exec, а материал BuildStep должен убедиться, что мы сообщаем об успехе (или сбое) Exec.

<Target Name="TriggerDependentBuilds"
        Condition=" '$(CompilationStatus)' == 'Succeeded' ">
    <BuildStep TeamFoundationServerUrl="$(TeamFoundationServerUrl)"
               BuildUri="$(BuildUri)"
               Name="TriggerStep"
               Message="Triggering Dependent Builds">
        <Output TaskParameter="Id"
                PropertyName="TriggerStepId" />
    </BuildStep>

    <PropertyGroup>
        <TriggerBuildCommandBase>TfsBuild start $(TeamFoundationServerUrl) $(TeamProject)</TriggerBuildCommandBase>
    </PropertyGroup>

    <Exec
        ContinueOnError="true"
        WorkingDirectory="C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE"
        Command="$(TriggerBuildCommandBase) %(DependentBuild.Identity) /queue /getOption:Custom /customGetVersion:$(GetVersion) %(DependentBuild.PriorityArg) /msbuildarguments:&quot;%(DependentBuild.MsBuildArgs)&quot;">
        <Output TaskParameter="ExitCode"
                ItemName="TfsBuildResult"/>
    </Exec>

    <BuildStep Condition="'@(TfsBuildResult)'=='0'"
               TeamFoundationServerUrl="$(TeamFoundationServerUrl)"
               BuildUri="$(BuildUri)"
               Id="$(TriggerStepId)"
               Status="Succeeded" />
    <BuildStep Condition="'@(TfsBuildResult)'!='0'"
               TeamFoundationServerUrl="$(TeamFoundationServerUrl)"
               BuildUri="$(BuildUri)"
               Id="$(TriggerStepId)"
               Status="Failed" />
</Target>

Я надеюсь, что это поможет...