TeamCity PowerShell 러너에서 전파할 오류를 표시하려면 어떻게 해야 합니까?
7 은 TeamCity 7의 ..ps1
다양한 TeamCity 매개 변수를 사용하여 스크립트를 작성합니다.
저는 그것이 단순한 설정의 문제가 되기를 희망했습니다.
대본
파일
스크립트 파일
%system.팀 시티build.workingDir%/Script.ps1
스크립트 실행 모드
"-File" 인수를 사용하여 .ps1 스크립트 실행
스크립트 인수
%system.팀 시티build.workingDir% - 옵션B %BuildConfigArg% %BuildConfigArg2%
그리고 나는 다음을 기대합니다.
- 인수를 망쳤는데 스크립트가 시작되지 않으면 빌드가 실패합니다.
- Script.ps1 스크립트가 느려지면 빌드가 실패합니다.
- 만약 대본이그인
exit
는 s가 아닌 됩니다.0
오류 레벨 빌드가 실패하기를 원합니다(아마도 이것은 관용적인 PS 오류 관리가 아닐 수도 있습니다 - .ps1은 예외가 없는 경우에만 성공을 보고해야 합니까?
질문:그것은 단지 작동하지 않습니다.어떻게 작동해야 하나요?제가 다른 옵션을 선택하여 고칠 수 있는 극단적으로 잘못하고 있는 것이 있습니까?
친절한 TeamCity 매뉴얼에 나와 있는 것처럼:
오류 출력을 로 설정하고 빌드 실패 조건을 추가
구문 오류 및 예외가 있는 경우 PowerShell은 이를 stderr에 씁니다.TeamCity가 빌드에 실패하도록 하려면 오류 출력 옵션을 오류로 설정하고 오류 출력 시 빌드에 실패하는 빌드 실패 조건을 추가합니다.
이 작업의 핵심은 두 가지 기본값을 변경하는 것입니다.
- 빌드 실패 조건의 최상위 수준에서 스위치 켜기 오류 메시지가 빌드 실행자에 의해 기록됩니다.
- [PowerShell] 빌드 단계에서 고급 옵션 표시 및 오류 출력 설정: 오류
9.1에서는 다음과 같은 작업이 수행되었습니다(이전 버전에서도 작동해도 이상하지 않습니다).
- 기본 옵션을 사용하여 PowerShell 빌드 단계 생성
- 드롭다운을 Script:로 변경합니다. 소스 코드
- 추가
trap { Write-Error "Exception $_" ; exit 98 }
의 맨 (선택 사항이지만 TeamCity 빌드 스크립트 내에서 적합한 스크립팅 유형에 대해 더 정확한 IMO)
고급 옵션 표시 및 옵션 켜기: 추가 - 프로파일 인수 없음
(선택 사항이지만, @Jamal Mavadat에서 제안한 것처럼 더 명확하게 렌더링되므로 기본값이 되어야 합니다.)
고급 옵션을 표시하고 오류 출력을 켭니다. 오류
(Aside @JetBrains: 라벨이 "Stderr 출력 형식을 다음과 같이 지정"한 경우 오해의 소지가 적을 것입니다.
여기에는 다음과 같은 경우가 포함됩니다.
- 오류 구문 분석 [예외로 거품을 내어 즉시 실행 중지]
- [예외
throw
n PS 코드에서 직접 또는 간접적으로 TC가 빌드를 중지하도록 종료 코드를 표시하고 트리거합니다]. - 인 명적
exit n
스크립트에서 빌드로 전파됩니다(0이 아닌 경우 실패).
TeamCity에는 원래 포스터가 알아차린 동작을 유발하는 알려진 버그가 있습니다.
하지만, 주변에서 일하는 것은 쉽습니다.
PowerShell 스크립트의 끝에 스크립트의 끝에 도달했음을 나타내는 출력을 추가합니다.
Echo "Packaging complete (end of script reached)"
그런 다음 반향 중인 텍스트가 출력에 없을 경우 실패하도록 빌드에 새 빌드 실패 조건을 설정합니다.
당신들은 너무 생각이 많아요.사용해 보십시오.
대본
File
스크립트 파일
Script.ps1
경로를 지정할 필요는 없습니다. 기본적으로 체크아웃 디렉토리에 상대적입니다.
스크립트 실행 모드
Put script into PowerShell stdin with "-Command -" arguments
이것이 바로 제가 팀시티 내에서 파워셸 스크립트를 실행하는 데 사용하는 것입니다.
갱신하다
powershell 스크립트의 실패가 빌드에 실패한다는 원래 게시물의 비트를 놓쳤습니다.미안해요!
저는 퍼즐의 그 부분을 두 가지 다른 방법으로 풀었습니다.
일반 파워셸 스크립트의 경우
.try...catch
예외가 발생하면 0이 아닌 정수 값을 반환합니다.성공적으로 실행하려면 0을 반환합니다.
성공을 위해 0을 반환하는 이 관습은 역사적으로 매우 오래 전으로 거슬러 올라갑니다. Unix/Linux 시스템, DOS, CP/M 등에서 사용됩니다.
PSake 빌드 스크립트의 경우
래퍼 powershell 스크립트를 사용하여 psake를 호출하고 stdout에 응답 메시지를 작성하여 팀 시티 빌드 결과를 직접 설정합니다.
스크립트를 시작할 때 실패를 나타내는 상태 메시지를 정의합니다.
$global:buildResult = "#teamcity[buildStatus status='FAILURE' text='It died.']
스크립트에서 update psake 스트내업트데이서에크립▁ps▁▁within.$global:buildResult
마지막으로 실행되는 전용 작업의 성공을 나타냅니다.
$global:buildResult = "#teamcity[buildStatus status='SUCCESS' text='It lives.']
래퍼 스크립트가 끝나면 상태 메시지를 출력합니다.
write-host $global:buildResult
빌드 스크립트에서 오류가 발생하면 해당 마지막 작업이 실행되지 않고 기본 메시지(실패를 나타냄)가 출력됩니다.
어느 쪽이든, 팀시티는 메시지를 수신하고 빌드 상태를 적절하게 설정합니다.
TeamCity 9에서 사용할 수 있는 승인된 답변에 대한 대안('빌드 실패 조건' 옵션을 변경하는 것은 모든 빌드 단계에 영향을 미치기 때문에 좋아하지 않습니다):-
PowerShell 오류가 빌드 단계에 실패하기를 원했지만, 메시지가 예쁘게 표시되었습니다.그래서 저는 오류 메시지를 던지고 오류 코드를 반환하고 싶었습니다. ..시도 / 캐치 / 마지막으로 구조를 요청합니다.
명확성을 위해 편집:이 스크립트는 실패해야 합니다.예외를 던지고 종료 코드를 반환하는 것이 가능하다는 것을 보여줍니다.따라서 팀 시티가 처리할 종료 코드와 문제가 발생한 위치를 보여주는 명확한 디버그 메시지가 모두 표시됩니다.
데모 스크립트:
Try {
Write-Host "Demoing the finally bit"
# Make sure if anything goes wrong in the script we get an exception
$ErrorActionPreference = "Stop"
# This will fail and throw an exception (unless you add the file)
Get-Content IDontExist.txt
}
Catch
{
# Throwing like this gives a pretty error message in the build log
throw $_
# These give less pretty/helpful error messages
# Write-Host $_
# Write-Host $_.Exception.Message
}
Finally
{
# 69 because it's more funny than 1
exit(69)
}
최신 TeamCity 버전을 사용할 수 있다면 PowerShell 빌드 러너의 몇 가지 개선 사항을 확인해 볼 가치가 있습니다.
특히, 변화하는 것은Error Output
채무 불이행으로warning
로.error
흥미를 끌 수 있습니다.
젠킨스와 함께 일할 필요가 없는 법을 칭찬해 주세요.유사한 문제에 PowerShell 단계를 사용할 수 없습니다.대신 예외 및 종료 코드에 대한 단계가 실패하는 다음 마법 래퍼를 호출하는 "cmd" 단계를 사용해야 합니다.
%SystemRoot%\sysnative\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile -WindowStyle Hidden -Command "& { $ErrorActionPreference = 'Stop'; & 'path\to\script.ps1 -arg1 -arg2; EXIT $LASTEXITCODE }"
이것은 9.x에서 제공하는 옵션으로 대체되었지만, 당시에는 확실히 방탄 처리가 되어 있었고 더 마음에 드는 다른 솔루션을 찾을 수 없었기 때문에 여기에 두겠습니다.
효과가 있는 일을 할 수도 있습니다.다음은 테스트를 통해 확인된 내용입니다.
- 스크립트 비트의 오류
- 누락된 파일
- 스크립트 종료 시 비-
0
오류 수준
TeamCity Powershell 러너 옵션에서 다음과 같이 설정합니다.
스크립트 파일
소스 코드
스크립트 소스
$ErrorActionPreference='Stop' powershell -NoProfile "Invoke-Command -ScriptBlock { `$errorActionPreference='Stop'; %system.teamcity.build.workingDir%/Script.ps1 %system.teamcity.build.workingDir% --OptionB %BuildConfigArgument% %BuildConfigArg2%; exit `$LastExitCode }"
(폐기된 버전:
powershell -NoProfile "Invoke-Command -ScriptBlock {
$errorActionPreference='Stop'; %system.teamcity.build.workingDir%/Script.ps1 %system.teamcity.build.workingDir% --OptionB %BuildConfigArgument% %BuildConfigArg2%; exit
$LastExitCode }"스크립트 실행 모드
"-Command -" 인수를 사용하여 PowerShell stdin에 스크립트 입력
추가 명령줄 매개 변수
-NoProfile
나는 이것이 최선의 답이 아니기를 희망합니다!
마지막 오류 코드를 확인하고 0이 아닐 경우 종료합니다.
If ($LASTEXITCODE -ne 0) {
Write-Host "The result was of the previous script was " $LASTEXITCODE
Exit $LASTEXITCODE
}
삽입했습니다.
$LASTEX 종료IT 코드
스크립트(powershell + cmd)가 끝날 때 npm 오류가 전파됩니다.
Powershell v2는 최소한 -File 옵션이 오류 코드를 엉망으로 만드는 문제가 있었습니다.그것이 어떻게 엉망이 되는지에 대한 몇 가지 세부 사항이 있습니다.
정답은 -Command 옵션으로 전환하거나 LastErrorCode를 확인하고 실패할 경우 1+를 반환하는 bat 파일로 래핑하는 것입니다.
http://zduck.com/2012/powershell-batch-files-exit-codes/
다음과 같은 방법을 사용합니다.
echo "##teamcity[buildStatus status='FAILURE' text='Something went wrong while executing the script...']";
참고로 Teamcity의 Reporting Build Status를 살펴봅니다.
언급URL : https://stackoverflow.com/questions/11647987/how-do-i-get-errors-to-propagate-in-the-teamcity-powershell-runner
'sourcecode' 카테고리의 다른 글
스칼라와 마리아를 이용한 간단한 curd rest api (0) | 2023.08.31 |
---|---|
양식 제출 이벤트에서 제출 원인이 된 버튼은 어떻게 받을 수 있습니까? (0) | 2023.08.31 |
AJAX CORS 및 보안 고려 사항 이해 (0) | 2023.08.31 |
PHP에서 업로드 형식의 파일 확장자 확인 (0) | 2023.08.31 |
jquery 및 ajax를 사용하여 json 개체를 mvc 컨트롤러에 게시합니다. (0) | 2023.08.31 |