Eu tenho algo parecido com isso em um Jenkinsfile (Groovy) e quero gravar o stdout e o código de saída em uma variável para poder usar as informações posteriormente.
sh "ls -l"
Como posso fazer isso, especialmente porque parece que você não pode realmente executar nenhum tipo de código groovy dentro do Jenkinsfile
?
Respostas:
A versão mais recente da
sh
etapa do pipeline permite que você faça o seguinte;Outro recurso é a
returnStatus
opção.Essas opções foram adicionadas com base nesse problema.
Veja a documentação oficial para o
sh
comando.fonte
WorkflowScript: 97: Expected a step @ line 97, column 17.
script
bloco de etapas. jenkins.io/doc/book/pipeline/syntax/#declarative-stepsA versão atual do Pipeline suporta nativamente
returnStdout
ereturnStatus
, o que torna possível obter saída ou status desh
/bat
steps.Um exemplo:
Uma documentação oficial .
fonte
script { }
etapa.resposta rápida é esta:
Eu acho que existe uma solicitação de recurso para poder obter o resultado da etapa sh, mas até onde eu sei, atualmente não há outra opção.
EDIT: JENKINS-26133
EDIT2: Não tenho certeza desde qual versão, mas as etapas sh / bat agora podem retornar a saída std, simplesmente:
fonte
Se você deseja obter o stdout AND saber se o comando foi bem-sucedido ou não, basta usá
returnStdout
-lo e envolvê-lo em um manipulador de exceções:pipeline com script
saída :
Infelizmente hudson.AbortException está faltando algum método útil para obter esse status de saída, portanto, se o valor real for necessário, você precisará analisá-lo da mensagem (ugh!)
Ao contrário do Javadoc https://javadoc.jenkins-ci.org/hudson/AbortException.html, a construção não falha quando a exceção é capturada. Ele falha quando é não pegou!
Atualização: se você também deseja a saída STDERR do comando shell, o Jenkins infelizmente não suporta adequadamente esse caso de uso comum. Um ingresso para 2017 JENKINS-44930 está preso em um estado de pingue-pongue opinativo, enquanto não progride em direção a uma solução - considere adicionar seu voto positivo a ele.
Quanto a uma solução agora , pode haver algumas abordagens possíveis:
a) Redirecione STDERR para STDOUT
2>&1
- mas você decide analisá-lo da saída principal e não obterá a saída se o comando falhar - porque você está no manipulador de exceções.b) redirecione o STDERR para um arquivo temporário (cujo nome você preparou anteriormente)
2>filename
(mas lembre-se de limpar o arquivo posteriormente) - ie. o código principal se torna:c) Vá para o outro lado, defina
returnStatus=true
, dispense o manipulador de exceções e sempre capture a saída em um arquivo, ou seja:Advertência: o código acima é específico para Unix / Linux - o Windows requer comandos shell completamente diferentes.
fonte
este é um exemplo de caso, o que fará sentido, acredito!
fonte
Para aqueles que precisam usar a saída em comandos shell subsequentes, em vez de groovy, algo como este exemplo pode ser feito:
Eu achei os exemplos no code maven bastante úteis.
fonte
A maneira mais fácil é usar dessa maneira
my_var=`echo 2` echo $my_var
saída: 2note que não é simples aspas simples é aspas posteriores (`).
fonte
sh
forma que as pessoas possam achar interessante, especialmente se não estiverem familiarizados com os scripts do bash. Eu apenas tentei no Jenkins, usando emls -l
vez deecho 2
e funciona. Eu já havia usado essa abordagem antes, mas estava procurando uma alternativa porque não é muito confiável. Eu tenho a saída de um comando mais complexo capturado em um shell padrão dessa maneira, mas quando portado para o Jenkins,sh
a variável não possui nada, por algum motivo desconhecido.