Плагин 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