Como verifico o status da compilação Jenkins na linha de comando?

40

Como verifico o status da compilação Jenkins sem mudar para o navegador?

Se necessário, posso criar um script usando a API JSON, mas fiquei pensando se já existe algo assim embutido.

Catskul
fonte
Você também pode usar ferramentas especializadas, como o CatLight Build Monitor, que mostrará o status da construção na bandeja.
alex
Cada post aqui parece apontar para "última compilação". Existe uma consulta semelhante para verificar o status do trabalho / número da construção X? Algo que você está verificando em tempo real ou após o fato.
David

Respostas:

38

Não consegui encontrar uma ferramenta integrada, então criei uma:

#!/usr/bin/python
#
# author: ajs
# license: bsd
# copyright: re2


import json 
import sys
import urllib
import urllib2

jenkinsUrl = "https://jenkins.example.com/job/"


if len( sys.argv ) > 1 :
    jobName = sys.argv[1]
    jobNameURL = urllib.quote(jobName)
else :
    sys.exit(1)

try:
    jenkinsStream   = urllib2.urlopen( jenkinsUrl + jobNameURL + "/lastBuild/api/json" )
except urllib2.HTTPError, e:
    print "URL Error: " + str(e.code) 
    print "      (job name [" + jobName + "] probably wrong)"
    sys.exit(2)

try:
    buildStatusJson = json.load( jenkinsStream )
except:
    print "Failed to parse json"
    sys.exit(3)

if buildStatusJson.has_key( "result" ):      
    print "[" + jobName + "] build status: " + buildStatusJson["result"]
    if buildStatusJson["result"] != "SUCCESS" :
        exit(4)
else:
    sys.exit(5)

sys.exit(0)
Catskul
fonte
Como você é um usuário Jenkins autenticado em seu script?
Aman Varshney
11

Verifique se uma compilação está sendo executada ou não

Eu tentei o script Python na resposta a esta pergunta, mas não consegui fazê-lo funcionar. Eu não conheço Python e não queria investir tempo em depuração, mas consegui ler o script o suficiente para obter inspiração.

Tudo o que preciso fazer é verificar se uma compilação está sendo executada ou não. Para fazer isso, usei curl e grep, assim:

curl http://myjenkins/job/myjob/lastBuild/api/json | grep --color result\":null

  • Se uma construção estiver em andamento, um grep para result\":nullretornará 0.
  • Se uma construção for concluída, um grep for result\":nullretornará 1.

Não é especialmente elegante, mas funciona bem o suficiente para minhas necessidades.

Por exemplo, eu tenho um script Bash que inicia uma compilação e aguarda a conclusão:

JOB_URL=http://jenkins.local/job/stevehhhbuild
JOB_STATUS_URL=${JOB_URL}/lastBuild/api/json

GREP_RETURN_CODE=0

# Start the build
curl $JOB_URL/build?delay=0sec

# Poll every thirty seconds until the build is finished
while [ $GREP_RETURN_CODE -eq 0 ]
do
    sleep 30
    # Grep will return 0 while the build is running:
    curl --silent $JOB_STATUS_URL | grep result\":null > /dev/null
    GREP_RETURN_CODE=$?
done

echo Build finished

Obrigado pela inspiração, Catskul!

Steve HHH
fonte
Fui e verifiquei minha implementação atual, que está funcionando, e é um pouco diferente da versão que eu coloquei na resposta devido a alguns requisitos de senha. Você sabe por que não estava funcionando para você?
Catskul
O script Python funciona muito bem se um trabalho já terminou, mas se um trabalho está sendo executado, o script Python falha: TypeError: cannot concatenate 'str' and 'NoneType' objects. Como não conheço Python, mudei para o shell e marquei sua resposta com +1 como inspiração. Obrigado!
27512 Steve
Você pode adicionar || e depois a condição para o código de saída 1, enrolar --silent $ JOB_STATUS_URL | resultado grep \ ": null> / dev / null || se [" $? "==" 1 "]; então GREP_RETURN_CODE = $? Portanto, você não recebe o código de saída '1' caso esteja executando no Jenkins build e você não quer que falhe #
Shachar Hamuzim Rajuan
6

Um ex-colega meu escreveu https://github.com/txels/autojenkins, que possui vários recursos de conveniência e material do tipo API para trabalhar com uma instância Jenkins do Python ...

Tom O'Connor
fonte
4

Outra solução Python:

from jenkinsapi.jenkins import Jenkins

jenkins_url = 'http://<server url>/'
server = Jenkins(jenkins_url, username = 'myUser', password = myPass)

job_instance = server.get_job('the job name')
running = job_instance.is_queued_or_running()
if not running:
   latestBuild = job_instance.get_last_build()
   print latestBuild.get_status()
ddtraveller
fonte
4

Você pode usar um script Groovy:

  1. Via jenkins-cli

    echo 'println(jenkins.model.Jenkins.instance'\
    '.getItem("<JOB-NAME>").lastBuild.building)' \
        | java -jar jenkins-cli.jar -s <JENKINS-URL> groovy =

    , onde =significa padrão. Você pode se autenticar com --username <USER> --password <PASS>ou com -i <SSH-PRIVATE-KEY>.

  2. Via jenkins-cli sobre SSH

    echo -e 'println(jenkins.getItem("JOB-NAME").lastBuild.building)\nexit' \
    | ssh -p <JENKINS-SSH-PORT> <JENKINS-HOST> groovysh
Tworec
fonte
3

Eu acho que encontrei uma maneira mais fácil. Se entendi corretamente, você deseja verificar o resultado da construção - se foi um sucesso ou um fracasso, em outras palavras.

O comando "build" da Jenkins CLI altera o código de saída, dependendo do resultado da build, desde que você use a opção -sou -fno final.

Por exemplo,

java -jar jenkins-cli.jar -s <url of Jenkins instance> build <project> -s

ou

java -jar jenkins-cli.jar -s <url of Jenkins instance> build <project> -f

Observe que a opção vai no final; não é o primeiro -s, usado para definir o URL da instância Jenkins.

E então, para obter o resultado, você pode usar $?:

echo $?

Se o resultado for 0, foi um sucesso. Se for algo diferente de 0, foi um fracasso.

Referência: Não consigo encontrar uma instância Jenkins público que dá acesso a esta página, mas pode ser encontrada em sua instância local Jenkins: http://<url of Jenkins Instance>/cli/command/build. Também explica a diferença entre -se -f:

-s  : Wait until the completion/abortion of the command. Interrupts are passed
      through to the build.

-f  : Follow the build progress. Like -s only interrupts are not passed
      through to the build.
SuperGT
fonte
2

Você pode usar o descritor simbólico lastBuild:

http://localhost/jenkins/job/<jobName>/lastBuild/api/xml

O resultelemento na resposta contém uma sequência que descreve o resultado da construção.

joniale
fonte
2

Felizmente, existe um jenkins-cli que você pode usar para obter algumas informações do Jenkins. Infelizmente, você não pode recuperar o status de uma construção usando a CLI - o que significa que sua solução de uso da API JSON não está apenas correta - é a única maneira programática de fazer isso.

Além disso, embora pareça get-jobfazer o que você deseja, na verdade não retorna o resultado - apenas retorna a configuração do trabalho.

Andrew M.
fonte
2

Outro script para CMD (Windows):

:loop
ping 127.0.0.1 -n 6  1>nul
curl --silent http://localhost:8080/job/JOB_NAME/lastBuild/api/xml | FINDSTR "SUCCESS FAILURE" >nul & IF ERRORLEVEL 1 (goto :loop)
echo "BUILD FINISH!!"
Roberto Ramos
fonte
Obrigado. Isto provou ser muito útil.
Victor S
0

Você pode tentar com isso,

JOB_URL=http://localhost:8080/view/TestTab/job/JobWait
JOB_STATUS_URL=${JOB_URL}/lastBuild/api/json

GREP_RETURN_CODE=0

# Start the build
curl --user "username:password" $JOB_URL/build?delay=0sec

# Poll every 10 second  until the build is finished
while [ $GREP_RETURN_CODE -eq 0 ]
do
    sleep 10
    # Grep will return 0 while the build is running:
    curl --user "username:password" --silent $JOB_STATUS_URL | grep result\":null > /dev/null || if [ "$?" == "1" ]; then
      exit 0
    fi

    GREP_RETURN_CODE=$?
done
echo Build finished
lakshmikandan
fonte