Ошибка TFS Build CopyDirectory не останавливает сборку

У меня есть шаг CopyDirectory в моем шаблоне сборки, и я предполагал, что если он найдет каталог, который не существует, он выдаст ошибки. Тем не менее, он только выдает предупреждение, и сама сборка помечается как успешная.

Я попытался обернуть его вокруг блока try/catch и вручную сделал шаг исключения, но все равно не сработало. Я попытался установить buildStatus на сбой, но это тоже не сработало. Любой другой способ, которым я могу достигнуть этого? Я не хочу, чтобы сборка была успешной, если какая-либо из папок копирования не удалась.

РЕДАКТИРОВАТЬ:

Вот фрагмент, где находится каталог копирования. Я перебираю список серверов и копирую несколько каталогов.

<ForEach x:TypeArguments="x:String" sap2010:WorkflowViewState.IdRef="ForEach`1_4" Values="[SCCDServers]">
                <ActivityAction x:TypeArguments="x:String">
                  <ActivityAction.Argument>
                    <DelegateInArgument x:TypeArguments="x:String" Name="server" />
                  </ActivityAction.Argument>
                  <Sequence sap2010:WorkflowViewState.IdRef="Sequence_37">
                    <mtbwa:CopyDirectory Destination="[server]" DisplayName="Copy Code Files" sap2010:WorkflowViewState.IdRef="CopyDirectory_14" Source="[BuildDetail.DropLocation &amp; &quot;\_PublishedWebsites\&quot; &amp; SCWebOutputFolder]" />
                    <mtbwa:WriteBuildMessage sap2010:WorkflowViewState.IdRef="WriteBuildMessage_16" Importance="[Microsoft.TeamFoundation.Build.Client.BuildMessageImportance.High]" Message="[&quot;Code Files copied to &quot; &amp; server]" mva:VisualBasic.Settings="Assembly references and imported namespaces serialized as XML namespaces" />
                    <mtbwa:CopyDirectory Destination="[server]" DisplayName="Copy Config Files" sap2010:WorkflowViewState.IdRef="CopyDirectory_15" Source="[BuildDetail.DropLocation &amp; &quot;\_PublishedWebsites\&quot; &amp; SCConfigSourceFolder &amp; &quot;\&quot; &amp; SCCDServerRole]" />
                    <mtbwa:WriteBuildMessage sap2010:WorkflowViewState.IdRef="WriteBuildMessage_17" Importance="[Microsoft.TeamFoundation.Build.Client.BuildMessageImportance.High]" Message="[&quot;Config Files copied to &quot; &amp; server &amp; Environment.NewLine &amp; &quot;Copied from: &quot; &amp; BuildDetail.DropLocation &amp; &quot;\_PublishedWebsites\&quot; &amp; SCConfigSourceFolder &amp; &quot;\&quot; &amp; SCCDServerRole]" mva:VisualBasic.Settings="Assembly references and imported namespaces serialized as XML namespaces" />
                    <mtbwa:CopyDirectory Destination="[server]" DisplayName="Copy Sitecore Files" sap2010:WorkflowViewState.IdRef="CopyDirectory_16" Source="[BuildDetail.DropLocation &amp; &quot;\_PublishedWebsites\&quot; &amp; SCSitecoreFilesSourceFolder]" />
                    <mtbwa:WriteBuildMessage sap2010:WorkflowViewState.IdRef="WriteBuildMessage_18" Importance="[Microsoft.TeamFoundation.Build.Client.BuildMessageImportance.High]" Message="[&quot;Sitecore Files copied to &quot; &amp; server &amp; Environment.NewLine &amp; &quot;Copied from: &quot; &amp; BuildDetail.DropLocation &amp; &quot;\_PublishedWebsites\&quot; &amp; SCSitecoreFilesSourceFolder]" mva:VisualBasic.Settings="Assembly references and imported namespaces serialized as XML namespaces" />
                  </Sequence>
                </ActivityAction>
              </ForEach>

3 ответа

Решение

CopyDirectory действительно есть ошибка, которая выдает предупреждение только тогда, когда исходный каталог не существует. У него также есть проблемы с длинными путями (>248 символов).

Возможные обходные пути:

  1. использование InvokeCommand, Бег Robocopy.exe (лучше чем xcopy) и проверка его кода результата.
  2. Если вы должны использовать CopyDirectory, убедитесь, что исходный каталог существует.

Почему же тогда вы не используете действие "InvokeProcess"?

  1. Выберите занятие, откройте вкладку "Переменные" внизу.
  2. Добавьте переменную ResultCode типа Int32. Эта переменная будет содержать код выхода из процесса копирования.
  3. Добавьте действие "InvokeProcess" в рабочий процесс.
  4. Откройте действие "InvokeProcess" и удалите действие "WriteBuildMessage" в разделе "Обработка стандартного вывода".
  5. Установите для свойства Importance значение Microsoft.TeamFoundation.Build.Client.BuildMessageImportance.High. Установите для свойства Сообщение значение stdOutput.
  6. Удаление экземпляра действия WriteBuildError в раздел "Обработка вывода ошибок". Установите для свойства Message значение errOutput.
  7. Теперь установите свойства "InvokeProcess". FileName: "xcopy". Agruments: "Source" "Destination" \s \e \y Result: ResultCode
  8. Проверьте значение "ResultCode". Я использую операцию IF и проверяю условие "ResultCode <> 0". В разделе "THEN" добавьте действие "THROW" и добавьте исключение: "New Exception(" Ошибка копирования файлов ")

Подробности здесь

Если копирование не удастся, установите статус setbuildproperties как сбой в вашем пользовательском рабочем процессе.

        <mtbwa1:SetBuildProperties DisplayName=“Set build status failed“  PropertiesToSet=“Status“ Status=“[Microsoft.TeamFoundation.Build.Client.BuildStatus.Failed]“ />

http://msdn.microsoft.com/en-us/library/bb399143(v=vs.100).aspx

Другие вопросы по тегам