programing

Jenkins powershell 플러그인이 항상 성공적으로 빌드됨

iphone6s 2023. 10. 14. 09:54
반응형

Jenkins powershell 플러그인이 항상 성공적으로 빌드됨

Jenkins PowerShell 플러그인을 사용해서 프로젝트를 만들고 있습니다.

는 는 Jenkins 제 되었습니다.Windows PowerShell지휘.

예는 다음과 같습니다.

enter image description here

당신이 볼 수 있듯이.asdf법적 명령이 아닙니다젠킨스가 내게 줘야 합니다.FAILURE

하지만 콘솔 출력은 다음을 제공합니다.

Started by user admin
Building in workspace C:\Users\Administrator\.jenkins\jobs\Test\workspace
[workspace] $ powershell.exe -NonInteractive -ExecutionPolicy ByPass "& 'C:\Users\ADMINI~1\AppData\Local\Temp\hudson2092642221832331776.ps1'"
The term 'asdf' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At C:\Users\ADMINI~1\AppData\Local\Temp\hudson2092642221832331776.ps1:1 char:5
+ asdf <<<< 
    + CategoryInfo          : ObjectNotFound: (asdf:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Finished: SUCCESS

는 PowerShell 의에 생각합니다.$lastexitcode.

파워쉘 플러그인 버그인가요?

부터는 플러그인이 1.3부터는 플러그인이 누락된 명령어와 같은 예외를 처리하지 않습니다.를 사용하면 할수 있습니다.try/catch:

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

자세한 내용은 MSDN을 참조하십시오.

저는 대본이 오류가 나자마자 젠킨스에서 멈춰서 실패하기를 원했습니다.이를 위해 스크립트의 시작 부분에 다음을 추가했습니다.

$ErrorActionPreference = "Stop"

여기에서는 다음과 같이 설명합니다. [첫 번째 오류 시 PowerShell 스크립트를 중지하는 방법?][1]

[1]: 첫 번째 오류 PowerShell 스크립트를 중지하는 방법은 무엇입니까? ..................

플러그인의 최신 버전(버전 1.3 2015년 9월 18일)에 따라 $LastExitCode를 사용하여 빌드를 실패해야 합니다.

버전 1.3 (2015년 9월 18일)

  • 이제 PowerShell이 대화형 프롬프트가 빌드를 중단하는 것을 방지하기 위해 비대화형 모드로 실행됩니다.
  • 이제 PowerShell이 실행 정책 문제를 방지하기 위해 실행 정책을 "바이패스"로 설정한 상태에서 실행됩니다.
  • 이제 스크립트가 $LastExitCode로 종료되어 0이 아닌 종료 코드가 빌드에 실패한 것으로 표시됩니다.
  • 도움말 및 사용 가능한 환경 변수 목록 추가(영문 및 프랑스어 번역 포함)

것은 파워셸 는 입니다 으로 . 당신은 파워셸 스크립트가 끝나야 합니다.exit 안 돼요.return.

젠킨스 파이프는 다음과 같이 생겼습니다.

script {
  result = powershell(returnStatus: true, script: '''...if(error condition) { return 1 }''')
  
  if(result) { error }
}

사용하고 있었습니다.if(error condition) { return 1 }그리고 젠킨스 콘솔에 1이 반환 값으로 표시되는 동안에는 빌드에 실패하지 않았습니다.내가 사용했을때if(error condition) { exit 1 }했습니다.

이 합니다를 가 있다는이 될 이라고 생각합니다. - 를.exit 안 돼요.return 이 안 가요.하고 있어요. 요: 입니다입니다.result0이 아닌 것.입니까의 입니까?exit그리고.return을 만드는 if(result) { error }를 사용할 때 return?

2월 16일부터 2021년 2월까지 업데이트: 제 경험에 대한 몇 가지 참고 사항을 추가하기 위해 다시 시작합니다.저는 제가 하고 있던 일과 많은 사람들이 혼란스럽게 하는 일을 사용하는 것이라고 생각합니다.returnStdout아니면returnStatus그들을 확인하지도 않고, 혹은 무엇이 돌아올지 완전히 이해하지도 못합니다.

만약 당신이 그 매개 변수들 중 하나를 사용한다면, Jenkins는 그들의 가치에 따라 당신을 위해 아무것도 해주지 않을 것입니다.직접 확인하고 그에 따라 행동해야 합니다.반면에 사용하지 않으면 Jenkins는 실패 코드를 인식하고 파이프가 돌아오면 실패합니다.

생각해 보세요..returnStatus 것이 , 입니다, 에 대한 으로서 그 .returnStdout, 당신은 그것을 얻고 있습니다.stdout스트림 - 오류 코드 또는 어떤 것도 포함하지 않습니다.stderr. 따라서 원하는 것에 대한 반품을 확인해야 합니다. 그렇지 않으면 기대하는 행동을 얻지 못할 것입니다.

그 두 파라미터 중 것도 입니다를 설정하는 입니다.$ErrorActionPreference = 'Stop'모든 PowerShell 스크립트가 내 파이프에서 실행되기 시작할 때 말입니다.그러면 전원 셸 고장이 발생하면 파이프를 확인할 필요 없이 예상대로 자동으로 파이프에 장애가 발생합니다.

RRIROWER의 솔루션을 이렇게 구현했습니다.도움이 되길 바랍니다.

<yourscript>.ps1; exit $lastexitcode

파워셸 스크립트가 원하는 값으로 종료되는지 확인합니다.
실행."exit <value>"

궁극적으로, 저는 Jenkins에서 다음과 같은 구성을 사용할 수 밖에 없었습니다. 여기에 있는 어떤 해결책도 저에게 맞지 않았기 때문입니다.크리스 넬슨의 대답이 저를 올바른 길로 이끌었습니다.원격으로 셰프-클라이언트를 호출하기 때문에 원격 PS 세션에서 로컬에 대해 이야기하고 젠킨스에게 상태를 전달하기 위해 약간의 마법을 부려야 했습니다.

  • $res는 요리사와 고객의 생산량을 나타냅니다.
  • $last success는 PS 참여 규칙에 따라 참이거나 거짓입니다.

물론, 여러분은 여러분 자신의 환경 변수를 제공해야 할 것입니다!:)

 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

이 는 Powershell cmdlet 를 줍니다.$LASTEXITCODE 따라서 실행 파일을 실행하는 경우에만 유용합니다.

$LASTEXITCODE = 0 # Success
try {
  CommandDoesntExist
} catch {
  # Exit code is unchanged
  Write-Error $Error[0]
  Write-Host "Exit Code $LASTEXITCODE"
}

>> Error Message...
>> Exit Code 0

순수한 파워셸의 경우 오류를 처리하고 직접 종료 코드를 제공해야 합니다.전체 스크립트를 시도/캐치에 내포하지 않으려면 대신 트랩을 사용할 수 있습니다.실패할 것으로 예상되는 블록을 처리하는 데 로컬 시도/캐치를 계속 사용할 수 있습니다.

'갓차' 를 .ErrorActionPreference = 'Stop'설정되어 있고 당신은 사용합니다.Write-ErrorWrite-Output트랩은 출구로 가기 전에 멈출 겁니다

# Global error handling avoids nesting all
# code in a try/catch/finally.
trap { Write-Host $Error[0] -f Red; exit 1 }

# Block specific error handling
try {
  throw "Worst case scenario"
} catch {
  write-host "Handled error doesn't trigger trap"
}

# Finally example
try {
  throw "Worst case scenario"
} finally {
  write-host "I still cleanup"
}

exit 0

언급URL : https://stackoverflow.com/questions/34349333/jenkins-powershell-plugin-always-builds-successfully

반응형