Плагин Jenkins powershell всегда успешно строится

я использую плагин Jenkins PowerShell для создания проекта.

однако я обнаружил, что Дженкинс всегда считает мою сборку успешной, независимо от того, что я печатаю внутри

5 ответов


в последней версии плагина (Версия 1.3 18 Сентября 2015), вы должны использовать $LastExitCode для сбоя сборки.

Версия 1.3 (18 Сентября 2015)

  • PowerShell теперь работает в Неинтерактивном режиме, чтобы предотвратить интерактивные подсказки от зависания сборки
  • PowerShell теперь работает с ExcecutionPolicy, установленным в "обход", чтобы избежать проблем с политикой выполнения
  • скрипты теперь выходят с $LastExitCode, вызывая ненулевые коды выхода, чтобы отметить сборку как failed
  • добавлена справка и список доступных переменных среды (включая английский и французский переводы)

начиная с 1.3, плагин не будет обрабатывать исключения, такие как из отсутствующих команд. Вы можете сделать это сами с try/catch:

try
{
    asdf
}
catch
{
    write-host "Caught an exception"
    exit 1
}

посмотреть MSDN дополнительные.


для меня я хотел, чтобы сценарий остановился и потерпел неудачу в Дженкинсе, как только он попал в ошибку. Это было достигнуто путем добавления этого в начало скрипта:

$ErrorActionPreference = "Stop"

Это обсуждается здесь: как остановить сценарий PowerShell при первой ошибке?


вот как я реализовал решение RRIROWER. Надеюсь, это поможет.

<yourscript>.ps1; exit $lastexitcode

убедитесь, что сценарии powershell завершают работу с требуемым значением.
Запустить "exit <value>" в последней строке.


в конечном итоге, мне пришлось прибегнуть к следующей конфигурации в Jenkins как ни одно из решений работал для меня. Ответ Криса Нельсона вывел меня на правильный путь. Мы вызываем шеф-клиента удаленно, поэтому нам пришлось сделать немного магии, чтобы получить удаленный сеанс PS, чтобы поговорить с местным, а затем передать статус Дженкинсу.

  • $res дает выход шеф-повара-клиента.
  • $lastsuccess является истинным или ложным в соответствии с правилами PS engagment.

конечно, вам придется предоставить свои собственные переменные evironment! :)

 Write-host "Deploying $env:Computer with $env:Databag data bag... "
 $secstr = ConvertTo-SecureString $env:Password -AsPlainText -Force 
 $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $env:User, $secstr
 $s = New-PSSession -ComputerName $env:Computer  -Credential $cred
 $res = Invoke-Command -Session $s -ScriptBlock { try {chef-client} catch {exit 1}}
 $lastsuccess = Invoke-Command -Session $s -ScriptBlock {$?}
 Remove-PSSession $s
 write-host " --- "
 write-host $res
 write-host " --- "
 if($lastsuccess)
 {
  write-host "chef deployment completed"
  exit 0
 }
 write-host "chef deployment had errors"
 exit 1