5개의 스크립트를 실행하는 파이프라인 작업으로 azure-pipeline yaml 구성을 설정했습니다. 각 스크립트의 구성에는 failOnStderr
플래그가 로 설정되어 있습니다 true
. 스크립트는 성공적으로 실행되지만 다음 출력과 함께 단계가 실패합니다.
##[error]Bash wrote one or more lines to the standard error stream.
자세한 내용을 활성화 system.debug
하고 다음과 같은 추가 세부 정보를 얻었습니다.
##[debug]Exit code 0 received from tool '/bin/bash'
##[debug]STDIO streams have closed for tool '/bin/bash'
##[error]Bash wrote one or more lines to the standard error stream.
##[debug]Processed: ##vso[task.issue type=error;]Bash wrote one or more lines to the standard error stream.
##[debug]task result: Failed
##[debug]Processed: ##vso[task.complete result=Failed;done=true;]
다음과 같은 질문이 있습니다.
- 종료 코드 0이 오류로 해석되는 이유는 무엇입니까?
- 우리가 추론하기 때문에 다른 것이 표준 오류로 전송되고 있습니까?
- azure-pipelines에서 제공하는 구성 외에 커뮤니티에서 권장하는 솔루션/해결 방법은 무엇입니까? 쉘을 사용할 수도 있지만
trap
스크립트 전체에서 상용구를 줄일 수 있는 것을 찾고 싶었습니다.
답변1
나는 또한 다음과 같은 문제가 있었고 failOnStderr
다음과 같은 결과를 얻었습니다.
내 생각엔 그래야 failOnStderr
한다고 생각해오직0을 반환하지만 여전히 실패하는 손상된 애플리케이션을 처리하고 해당 실패의 이유를 stdout에 기록하는 데 사용됩니다.
귀하의 경우 오류 메시지는 ##[error]Bash wrote one or more lines to the standard error stream.
적어도 단계가 실패한 이유를 제공합니다.
##[error]Script failed with error: Error: /bin/bash failed with return code: 0
내 경우에는 stderr에 발행된 로깅 메시지(오류 아님)로 인해 실제로 실패했다는 사실조차 언급하지 않은 오류 메시지가 있었습니다 .
그래서
- 그렇지 않습니다. stderr에 무언가가 기록되면 실패해야 한다고 지정했기 때문에 실패합니다.
- 일부 프로그램은 stderr에 로깅 메시지를 씁니다(예:
az --version
오래된 경우 stderr에 경고 표시). - 가장 쉬운 해결책은 다음과 같습니다.
- 스크립트가 종료 코드 0과 함께 실패하는 손상된 응용 프로그램을 사용하지 않는 경우 플래그를 사용하지 마십시오
failOnStderr
. - 를 사용해야 하거나 계속 사용하려면 로깅 메시지를 stderr( )
failOnStderr
에 기록하는 명령의 stderr을 리디렉션하세요.2 > /dev/null
- 스크립트가 종료 코드 0과 함께 실패하는 손상된 응용 프로그램을 사용하지 않는 경우 플래그를 사용하지 마십시오