Запуск сборки, когда другой успешно завершен в TFS 2008 - PullRequest
10 голосов
/ 27 сентября 2010

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

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

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

1 Ответ

6 голосов
/ 27 сентября 2010

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

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

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

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

<Target Name="CreateDependentBuildItemGroup">
    <ItemGroup>
        <DependentBuild Include="Integration">
            <!--Using 8dot3 format for "Mixed Platforms" as it's 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>

Надеюсь, это поможет ...

...