Ошибка 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 & "\_PublishedWebsites\" & SCWebOutputFolder]" />
<mtbwa:WriteBuildMessage sap2010:WorkflowViewState.IdRef="WriteBuildMessage_16" Importance="[Microsoft.TeamFoundation.Build.Client.BuildMessageImportance.High]" Message="["Code Files copied to " & 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 & "\_PublishedWebsites\" & SCConfigSourceFolder & "\" & SCCDServerRole]" />
<mtbwa:WriteBuildMessage sap2010:WorkflowViewState.IdRef="WriteBuildMessage_17" Importance="[Microsoft.TeamFoundation.Build.Client.BuildMessageImportance.High]" Message="["Config Files copied to " & server & Environment.NewLine & "Copied from: " & BuildDetail.DropLocation & "\_PublishedWebsites\" & SCConfigSourceFolder & "\" & 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 & "\_PublishedWebsites\" & SCSitecoreFilesSourceFolder]" />
<mtbwa:WriteBuildMessage sap2010:WorkflowViewState.IdRef="WriteBuildMessage_18" Importance="[Microsoft.TeamFoundation.Build.Client.BuildMessageImportance.High]" Message="["Sitecore Files copied to " & server & Environment.NewLine & "Copied from: " & BuildDetail.DropLocation & "\_PublishedWebsites\" & SCSitecoreFilesSourceFolder]" mva:VisualBasic.Settings="Assembly references and imported namespaces serialized as XML namespaces" />
</Sequence>
</ActivityAction>
</ForEach>
3 ответа
CopyDirectory
действительно есть ошибка, которая выдает предупреждение только тогда, когда исходный каталог не существует. У него также есть проблемы с длинными путями (>248 символов).
Возможные обходные пути:
- использование
InvokeCommand
, БегRobocopy.exe
(лучше чемxcopy
) и проверка его кода результата. - Если вы должны использовать
CopyDirectory
, убедитесь, что исходный каталог существует.
Почему же тогда вы не используете действие "InvokeProcess"?
- Выберите занятие, откройте вкладку "Переменные" внизу.
- Добавьте переменную ResultCode типа Int32. Эта переменная будет содержать код выхода из процесса копирования.
- Добавьте действие "InvokeProcess" в рабочий процесс.
- Откройте действие "InvokeProcess" и удалите действие "WriteBuildMessage" в разделе "Обработка стандартного вывода".
- Установите для свойства Importance значение Microsoft.TeamFoundation.Build.Client.BuildMessageImportance.High. Установите для свойства Сообщение значение stdOutput.
- Удаление экземпляра действия WriteBuildError в раздел "Обработка вывода ошибок". Установите для свойства Message значение errOutput.
- Теперь установите свойства "InvokeProcess". FileName: "xcopy". Agruments: "Source" "Destination" \s \e \y Result: ResultCode
- Проверьте значение "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