Как сделать так, чтобы пользовательская задача сборки Visual Studio Team Services завершилась ошибкой (с помощью PowerShell)?

Я создал расширение Visual Studio Team Services, которое обеспечивает несколько задач сборки. Все задачи реализованы в виде скриптов PowerShell.

Казалось, все работает, как ожидалось, но потом я понял, что когда в задаче возникает ошибка, которая не нарушает сборку, как должна.

Я предполагал, что сценарий PowerShell, возвращающий ненулевой код выхода, нарушит сборку, но это не так. Чтобы подтвердить это, я создал очень простую задачу только с этой строкой:

exit 1

и проверил, что сборка прошла успешно.

Я также обнаружил, что неперехваченные исключения в скрипте вызывают сбой сборки.

Следовательно, как следует уведомлять о сбоях из задач сборки?

ОБНОВЛЕНИЕ: Я использую task.json и скрипт:

task.json:

{
 "id": "7CA6E75B-0700-4723-83A7-C167EA514988",
 "name": "ExampleTask",
 "friendlyName": "Example build task",
 "description": "Example build task for development purposes",
 "author": "eduardomhg",
 "category": "Utility",
 "visibility": [
   "Build",
   "Release"
 ],
 "demands": [],
 "version": {
   "Major": "0",
   "Minor": "0",
   "Patch": "1"
 },
 "minimumAgentVersion": "1.83.0",
 "instanceNameFormat": "Example Task",
 "groups": [
       {
           "name":"advanced",
           "displayName":"Advanced",
           "isExpanded":false
       }
   ],
 "execution": {
   "PowerShell": {
     "target": "$(currentDirectory)\\ExampleTask.ps1",
     "argumentFormat": "",
     "workingDirectory": "$(currentDirectory)"
   }
 }
}

ExampleTask.ps1:

 Write-Host "Executing example task..."
 exit 1

person Eduardo Hernández    schedule 10.01.2017    source источник
comment
Можете ли вы поделиться файлом task.json и любым вызываемым им скриптом?   -  person Luca Cappa    schedule 10.01.2017
comment
Вы пробовали просто использовать командлет write-error?   -  person baywet    schedule 11.01.2017
comment
Командлет write-error работает (приводит к сбою сборки), как и другие решения, предложенные в ответах, так что задайтесь вопросом, как правильно сообщать о сбоях ...   -  person Eduardo Hernández    schedule 11.01.2017


Ответы (3)


Попробуйте вместо этого использовать этот код:

[Environment]::Exit(1)
person starian chen-MSFT    schedule 11.01.2017
comment
Кажется, это работает! Однако мне трудно увидеть разницу между этим и ключевым словом exit. Интуитивно я бы сказал, что exit должно быть достаточно, чтобы сообщить об ошибке обратно вызывающей стороне, но я не являюсь экспертом в PowerShell, поэтому я могу упустить что-то очевидное здесь. - person Eduardo Hernández; 11.01.2017
comment
@ EduardoHernández Насколько мне известно, [Environment] :: Exit (1) завершает этот процесс и возвращает код выхода. Не можете найти подробную статью о различиях между ними, вы можете открыть новую тему для этого вопроса. С другой стороны, вы можете отметить это как ответ, если решите вашу проблему. - person starian chen-MSFT; 12.01.2017

TL; DR

При разработке нестандартной задачи на основе PowerShell:

  • Сценарий PowerShell должен возвращать 0, когда он выполнил свою работу, неуважительно, результат будет положительным или отрицательным.
  • Он должен возвращать значение, отличное от 0, если задача не может быть выполнена должным образом (например, проблема с инфраструктурой, синтаксическая ошибка или непредвиденное исключение и т. Д.).
  • Когда задача завершается, об ошибке или успехе всегда следует сообщать с помощью _ 1_ API-интерфейс VSTS Task Lib SDK (или команда ##vso[task.complete]).


Подробности: vsts-agent запускает сценарии PowerShell. с использованием классов C #, так называемых «обработчиков» , который вы указываете в разделе «выполнить» файла «task.json»; Возможные обработчики на основе PS:

  • PowerShell3
  • PowerShell
  • PowerShellExe

Обработчик 'PowerShell3' (или устаревший 'PowerShell'):

  • необходимо использовать при создании настраиваемой задачи на основе PowerShell; это означает, что ваша задача связана по крайней мере с одним сценарием PS, который указан в task.json в разделе «execute»;

  • ожидает, что код выхода будет равен 0 независимо от результата задачи (нормально или неуспешно);

  • ожидает значение, отличное от 0, когда во время выполнения скрипта произошла внутренняя ошибка, это означает, что скрипт не смог полностью завершить свое задание, то есть когда результат задания задачи даже не известен. Короче говоря, код выхода не зависит от положительного / отрицательного результата работы задачи. Когда задание завершено (положительно или отрицательно), код выхода должен быть 0. Требование кода выхода, равного 0, указано:

Это также ясно из сводки сборки, где вы загромождаете сводку сборки при возврате кода выхода, отличного от 0 (например, при использовании [Environment]::Exit(1), как показано в красных полях). Вместо этого вы получите чистую сводку сборки при корректном выходе из сбойной задачи с 0 кодом выхода и установке результата с помощью Write-VstsSetResult API (зеленые поля). пример результата сборки с использованием VSTS TaskLib SDK и без него

Вместо этого обработчик PowerShellExe выполняет сценарий PowerShell, предоставленный конечным пользователем: в этом случае этот обработчик следует обычному правилу, которое подчиняется обычной команде, а именно: - статус результата, равный 0, указывает на успешное выполнение; - результат, отличный от 0, указывает на сбой выполнения;


Дополнительная информация:

При разработке настраиваемой задачи на основе PowerShell с использованием функций VSTS Task SDK это можно передать агенту несколько команд . Один из них - сообщить результат (успех или сбой) выполнения задачи: это можно сделать, вызвав функцию API Write-VstsSetResult

В противном случае, если SDK невозможно использовать, в любом случае можно вывести на стандартный вывод следующую команду:

##vso[task.complete result=Succeeded|SucceededWithIssues|Failed|Cancelled|Skipped]

это та же команда, которая используется ниже функцией Write-VstsSetResult.

Агент действительно перехватывает и использует стандартный вывод задачи, он распознает команду и выполняет ее.

Когда задача смогла завершить свою работу (если это неудача или успех), она должна вернуть код выхода 0 и установить результат с помощью вышеупомянутой команды. Только когда задача не смогла завершить свою работу, об этом нужно сообщить с кодом выхода, отличным от 0.

person Luca Cappa    schedule 10.01.2017
comment
Я не использую одну из предопределенных задач PowerShell, предоставляемых Microsoft, а разрабатываю пользовательские задачи с помощью PowerShell (задачи могут быть реализованы несколькими другими способами). - person Eduardo Hernández; 10.01.2017

Вы можете добавить следующую строку, чтобы не выполнить задачу:

"##vso[task.complete result=Failed]"

Это сообщит VSTS, что задача не выполнена.

person Peter    schedule 10.01.2017
comment
Это работает, но [Environment]::Exit кажется более общим и простым. - person Eduardo Hernández; 11.01.2017