Eu configurei uma configuração yaml do azure-pipeline com um trabalho de pipeline que executa 5 scripts. A configuração de cada script tem o failOnStderr
sinalizador definido como true
. O script é executado com êxito, mas o estágio falha com uma saída de:
##[error]Bash wrote one or more lines to the standard error stream.
Ativei system.debug
a verbosidade e obtive mais detalhes como:
##[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;]
Tenho as seguintes perguntas:
- Por que o código de saída 0 está sendo interpretado como um erro?
- Algo mais está sendo enviado para erro padrão nos bastidores por causa do nosso motivo?
- Que solução/solução alternativa a comunidade recomenda fora da configuração oferecida pelo azure-pipelines? Eu poderia usar um shell
trap
, mas esperava encontrar algo que reduzisse o padrão nos scripts.
Responder1
Também tive problemas failOnStderr
e cheguei ao seguinte:
Eu acho que isso failOnStderr
deveriaapenasser usado para lidar com aplicativos quebrados que retornam 0, mas ainda falham e escrevem o motivo dessa falha no stdout.
No seu caso, a mensagem de erro ##[error]Bash wrote one or more lines to the standard error stream.
fornece pelo menos o motivo da falha da etapa.
No meu caso, a mensagem de erro ##[error]Script failed with error: Error: /bin/bash failed with return code: 0
nem menciona o fato de que realmente falhou devido a uma mensagem de log (não um erro) emitida para stderr.
Então
- Não é. Ele falha porque você especificou que deveria falhar se algo fosse gravado em stderr, o que parece ser o caso
- Alguns programas escrevem mensagens de registro no stderr (por exemplo,
az --version
emitem um aviso para o stderr se estiver desatualizado) - Acho que as soluções mais fáceis são as seguintes:
- Se seus scripts não usam aplicativos corrompidos que falham com um código de saída 0, não use o
failOnStderr
sinalizador - Se você precisar/ainda quiser usar
failOnStderr
, redirecione o stderr dos comandos que gravam suas mensagens de log para stderr(2 > /dev/null
)
- Se seus scripts não usam aplicativos corrompidos que falham com um código de saída 0, não use o