3
votes

I'm unable to extract the jenkins console output of a given job using python-jenkins. I must to extract the full console output of a given build #.

Here is how my jenkins url looks like:
http://jenkins.abc.xyz.io:8080/job/myapp-build/46/consoleFull and It has valid output.

As per https://python-jenkins.readthedocs.io/en/latest/api.html#jenkins.Jenkins.get_build_console_output

get_build_console_output(name, number)
Get build console text.

Parameters: 
name – Job name, str
number – Build number, int
Returns:    
Build console output, str

I tried

import jenkins
server = jenkins.Jenkins('http://jenkins.abc.xyz.io:8080', username='foo', password='foo!')

jenkins_url = "http://jenkins.abc.xyz.io:8080"
user = server.get_whoami()
version = server.get_version()
print('Hello %s from Jenkins %s' % (user['fullName'], version))
#
name='/myapp-build'
number=46

print server.get_build_console_output(name, number)

But it aborts saying

Traceback (most recent call last):
  File "test_jenkins.py", line 20, in <module>
    print server.get_build_console_output(name, number)
  File "/home/myapp/jenkins_py/env/jenkins/local/lib/python2.7/site-packages/jenkins/__init__.py", line 1630, in get_build_console_output
    % (name, number))
jenkins.JenkinsException: job[/myapp-build] number[46] does not exist

Expected result would be the console output.

What am I missing?

Please help me extract the console output from jenkins using python. are there any alternate ways or libraries to accomplish it?

2

2 Answers

1
votes

Ok. I feel really stupid at 2:18am. The script works.

Just needed to remove the preceding '/' in front of the job name.

Now I'm able to retrieve the full output.

server = jenkins.Jenkins('http://jenkins.abc.xyz.io:8080', username='foo', password='foo!')

jenkins_url = "http://jenkins.abc.xyz.io:8080"
user = server.get_whoami()
version = server.get_version()
print('Hello %s from Jenkins %s' % (user['fullName'], version))
#
name='myapp-build' #without the /
number=46

print server.get_build_console_output(name, number)
0
votes

This code will continuously compare old job == current job number. Once the current job will finish. The whole output will be in console_output.

      def jenkins_wait():
            global BuildID, BuildStatus
            server = jenkins.Jenkins(Jenkins_url, username=jenkins_user, password=jenkins_pwd)
            time.sleep(5)
            while True:
                temptime = datetime.now()
                Job_time = temptime.strftime("%H:%M:%S")
                print('Jenkins build ID :',(server.get_job_info(jOBnAmE)['lastBuild']['number'])," Time:", Job_time)
                time.sleep(5)
                processLoading() #Display processing bar.
                if server.get_job_info(jOBnAmE)['lastCompletedBuild']['number'] == server.get_job_info(jOBnAmE)['lastBuild']['number']:
                    print("Last ID %s, Current ID %s"  % (server.get_job_info(jOBnAmE)['lastCompletedBuild']['number'], server.get_job_info(jOBnAmE)['lastBuild']['number']))
                    BuildID = server.get_job_info(jOBnAmE)['lastBuild']['number']
                    print (BuildID)
                    break
            time.sleep(25)
            print('Job execution has been completed.')
            console_output = server.get_build_console_output(jOBnAmE, server.get_job_info(jOBnAmE)['lastBuild']['number'])
            console_output = re.split('\r\n',console_output)