Предотвращение разработки из сборки TFS при сбое теста

Я работаю с существующей настройкой управления сборкой и выпуском TFS и мало знаю о системе сборки XAML (теперь устаревшей), которую она использует.

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

<Sequence DisplayName="Overall build process">
<mtbac:SetBuildNumber DisplayName="Update build number" BuildNumberFormat="[BuildNumberFormat]" />
<mtbwa:AgentScope DisplayName="Run on agent" MaxExecutionTime="[AgentSettings.GetValue(Of TimeSpan)(&quot;MaxExecutionTime&quot;, new System.TimeSpan(0,0,0))]" MaxWaitTime="[AgentSettings.GetValue(Of TimeSpan)(&quot;MaxWaitTime&quot;, new System.TimeSpan(4,0,0))]" ReservationSpec="[AgentSettings.CreateAgentReservationSpec()]">
  <mtbac:InitializeEnvironment DisplayName="Initialize environment" />
  <mtbat:TfGetSources DisplayName="Get sources from Team Foundation Version Control" CleanWorkspace="[CleanWorkspace]" CreateLabel="[CreateLabel]" VersionOverride="[GetVersion]" />
  <mtba:AssociateChanges DisplayName="Associate the changesets that occurred since the last good build" UpdateWorkItems="[UpdateAssociatedWorkItems]" />
  <TryCatch DisplayName="Try" mtbwt:BuildTrackingParticipant.Importance="Low">
    <TryCatch.Try>
      <Sequence DisplayName="Compile, Test and Publish">
        <mtba:RunScript DisplayName="Run optional script before MSBuild" FilePath="[AdvancedBuildSettings.GetValue(Of String)(&quot;PreActionScriptPath&quot;, String.Empty)]" Arguments="[AdvancedBuildSettings.GetValue(Of String)(&quot;PreActionScriptArguments&quot;, String.Empty)]" />
        <mtba:RunMSBuild DisplayName="Run MSBuild" OutputLocation="[OutputLocation]" CleanBuild="[CleanBuild]" CommandLineArguments="[String.Format(&quot;/p:SkipInvalidConfigurations=true {0}&quot;, AdvancedBuildSettings.GetValue(Of String)(&quot;MSBuildArguments&quot;, String.Empty))]" ConfigurationsToBuild="[ConfigurationsToBuild]" ProjectsToBuild="[ProjectsToBuild]" ToolPlatform="[AdvancedBuildSettings.GetValue(Of String)(&quot;MSBuildPlatform&quot;, &quot;Auto&quot;)]" RunCodeAnalysis="[AdvancedBuildSettings.GetValue(Of String)(&quot;RunCodeAnalysis&quot;, &quot;AsConfigured&quot;)]" />
        <mtba:RunScript DisplayName="Run optional script after MSBuild" FilePath="[AdvancedBuildSettings.GetValue(Of String)(&quot;PostActionScriptPath&quot;, String.Empty)]" Arguments="[AdvancedBuildSettings.GetValue(Of String)(&quot;PostActionScriptArguments&quot;, String.Empty)]" />
        <mtba:RunScript DisplayName="Run optional script before Test Runner" FilePath="[AdvancedTestSettings.GetValue(Of String)(&quot;PreActionScriptPath&quot;, String.Empty)]" Arguments="[AdvancedTestSettings.GetValue(Of String)(&quot;PreActionScriptArguments&quot;, String.Empty)]" />
        <mtba:RunAgileTestRunner DisplayName="Run VS Test Runner" Enabled="[Not AdvancedTestSettings.GetValue(Of Boolean)(&quot;DisableTests&quot;, false)]" TestSpecs="[AutomatedTests]" ConfigurationsToTest="[ConfigurationsToBuild]" />
        <mtba:RunScript DisplayName="Run optional script after Test Runner" FilePath="[AdvancedTestSettings.GetValue(Of String)(&quot;PostActionScriptPath&quot;, String.Empty)]" Arguments="[AdvancedTestSettings.GetValue(Of String)(&quot;PostActionScriptArguments&quot;, String.Empty)]" />
        <mtba:RunTestImpact DisplayName="Get Impacted Tests" Enabled="[AdvancedTestSettings.GetValue(Of Boolean)(&quot;AnalyzeTestImpact&quot;, true)]" />
        <Sequence DisplayName="Process the release">
          <Sequence.Variables>
            <Variable x:TypeArguments="x:String" Name="buildDirectory" />
          </Sequence.Variables>
          <mtbwa:GetBuildDirectory DisplayName="Get the Build Directory" Result="[buildDirectory]" />
          <If Condition="[ProcessReleaseTokens]" DisplayName="If ProcessReleaseTokens is set">
            <If.Then>
              <Sequence DisplayName="Initialize tokens">

В настоящее время в случае сбоя теста шаг последовательности все еще выполняется, и развертывается сломанная сборка. У меня включена опция «Сбой сборки при сбое теста».

Мне нужно предотвратить развертывание при сбоях тестирования, либо остановив выполнение этапа выпуска, либо изменив процесс в управлении выпусками (я склонялся к тому, чтобы вообще не касаться управления выпусками в случае сбоя сборки).


person James Antrobus    schedule 30.06.2016    source источник
comment
Используете ли вы управление выпусками, интегрированное в TFS?   -  person Eddie Chen - MSFT    schedule 06.07.2016
comment
@ Eddie-MSFT, это предыдущая версия с клиентом Visual Studio 2015. Мы планируем перейти на новую сборку TFS в будущем, но пока надеялись найти обходной путь.   -  person James Antrobus    schedule 06.07.2016


Ответы (2)


Ваша сборка может просто выдать пакет WebDeploy (например, DeployTarget=Package), а затем добавить InvokeProcess в конце рабочего процесса, который запускает сценарий powershell для фактического развертывания.

person PatrickLu-MSFT    schedule 01.07.2016
comment
Как я могу проверить, прошли ли тесты? Буду ли я делать это в момент InvokeProcess или в сценарии powershell? - person James Antrobus; 01.07.2016
comment
Для сборки XMAL при сбое теста сборка все равно будет продолжена. Флаг Fail build on test failure означает, что при сбое теста сборка завершается сбоем. Если для этого флага установлено значение false, то в случае сбоя теста окончательный результат будет частично успешным. - person PatrickLu-MSFT; 01.07.2016
comment
Да, у меня включен этот флаг, поэтому моя сборка не работает (как и ожидалось) при неудачном тесте. Вы говорите, что InvokeProcess не будет запускаться в случае неудачной сборки? - person James Antrobus; 01.07.2016
comment
Еще одно предложение, которое вы можете использовать в сборке TFS 2015 Vnext, вы можете настроить этап развертывания после тестов, чтобы он продолжался, если этап теста не пройден. - person PatrickLu-MSFT; 01.07.2016
comment
Вы говорите, что InvokeProcess не будет запускаться в случае сбоя сборки? Нет, сборка все еще развернута. Однако он развернут как пакет. Я думаю, что это можно сделать в сценарии powershell. Если сборка проходит успешно, запустите фактический файл deploy. - person PatrickLu-MSFT; 01.07.2016

Для этого можно обновить шаблон определения XAML. Подробнее см. в ответе на этот вопрос: Управление релизами, включая выпуск неудачных сборок — Запуск выпуска из неудачных сборок

Процитируйте это здесь, если ссылка не работает:

  1. Действие «Если ReleaseBuild установлен» перемещено ниже «Если не DisableTests».
  2. Изменено условие «Если ReleaseBuild установлено» на: ReleaseBuild And (treatTestFailureAsBuildFailure = False Or (treatTestFailureAsBuildFailure And (BuildDetail.TestStatus ‹> Microsoft.TeamFoundation.Build.Client.BuildPhaseStatus.Failed))) And BuildDetail.CompilationStatus ‹> Microsoft.TeamFoundation .Build.Client.BuildPhaseStatus.Failed
  3. Внутри части Else действия «Если ReleaseBuild установлен» сообщение WriteBuildMessage изменено на: «Выполнение пропущено, потому что либо ReleaseBuild не установлен, либо некоторые тесты не удались, либо компиляция не удалась».
  4. Наконец, зарегистрируйте шаблон, и все, неудачные сборки не будут развернуты.
person Eddie Chen - MSFT    schedule 06.07.2016