A etapa do Azure Pipeline falha mesmo que o código de saída seja 0

A etapa do Azure Pipeline falha mesmo que o código de saída seja 0

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 failOnStderrsinalizador 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.debuga 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:

  1. Por que o código de saída 0 está sendo interpretado como um erro?
  2. Algo mais está sendo enviado para erro padrão nos bastidores por causa do nosso motivo?
  3. 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 failOnStderre cheguei ao seguinte:

Eu acho que isso failOnStderrdeveriaapenasser 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: 0nem menciona o fato de que realmente falhou devido a uma mensagem de log (não um erro) emitida para stderr.

Então

  1. Não é. Ele falha porque você especificou que deveria falhar se algo fosse gravado em stderr, o que parece ser o caso
  2. Alguns programas escrevem mensagens de registro no stderr (por exemplo, az --versionemitem um aviso para o stderr se estiver desatualizado)
  3. 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 failOnStderrsinalizador
    • Se você precisar/ainda quiser usar failOnStderr, redirecione o stderr dos comandos que gravam suas mensagens de log para stderr( 2 > /dev/null)

informação relacionada