Como posso verificar o status de compilação de uma compilação do Jenkins a partir da linha de comando?

33

Como faço para verificar o status de compilação do Jenkins sem alternar para o navegador?

Se necessário, posso criar um script usando a API JSON, mas queria saber se já existe algo como isso embutido.

    
por Catskul 09.09.2011 / 20:58

9 respostas

37

Não consegui encontrar uma ferramenta incorporada, por isso 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)
    
por 10.09.2011 / 00:45
11

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

Eu tentei o script Python na resposta a essa pergunta, mas não consegui fazê-lo funcionar. Eu não conheço o Python e não queria investir tempo na depuração, mas consegui ler o suficiente do script para me inspirar nele.

Tudo que preciso fazer é verificar se uma compilação está em execução ou não. Para fazer isso eu 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\":null retornará 0.
  • Se uma compilação for concluída, um grep para result\":null retornará 1.

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

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

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!

    
por 28.08.2012 / 02:09
6

Um ex-colega meu escreveu o link que tem um monte de recursos de conveniência e material do tipo API em torno do trabalho com uma instância do Jenkins do Python ...

    
por 29.08.2012 / 00:22
3

Acho que achei um jeito mais fácil. Se entendi corretamente, você quer verificar o resultado da compilação - se foi um sucesso ou uma falha, em outras palavras.

O comando "build" do Jenkins CLI altera o código de saída dependendo do resultado da compilação, contanto que você use a opção -s ou -f no 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 , que é usado para definir a URL da instância do Jenkins.

E, 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 pública do Jenkins que dê acesso a esta página, mas ela pode ser encontrada em sua instância local do Jenkins: http://<url of Jenkins Instance>/cli/command/build . Também explica a diferença entre -s e -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.
    
por 21.11.2014 / 12:42
2

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

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

    
por 11.09.2011 / 07:27
2

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()
    
por 17.11.2015 / 16:57
2

Você pode usar um script do Groovy:

  1. Via jenkins-cli

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

    , em que = significa padrão. Você pode 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
    
por 05.10.2016 / 00:20
1

Você pode usar o descritor simbólico lastBuild :

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

O elemento result na resposta contém uma string descrevendo o resultado da compilação.

    
por 28.01.2016 / 10:46
1

Outro script para o 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!!"
    
por 20.09.2017 / 10:43