pythonjenkins (1) - Linux Manuals
pythonjenkins: Python Jenkins Documentation
NAME
pythonjenkins - Python Jenkins DocumentationPython Jenkins is a python wrapper for the Jenkins REST API which aims to provide a more conventionally pythonic way of controlling a Jenkins server. It provides a higher-level API containing a number of convenience functions.
We like to use python-jenkins to automate our Jenkins servers. Here are some of the things you can use it for:
- •
- Create new jobs
- •
- Copy existing jobs
- •
- Delete jobs
- •
- Update jobs
- •
- Get a job's build information
- •
- Get Jenkins master version information
- •
- Get Jenkins plugin information
- •
- Start a build on a job
- •
- Create nodes
- •
- Enable/Disable nodes
- •
- Get information on nodes
- •
- Create/delete/reconfig views
- •
-
and many more..
To install:
$ sudo python setup.py install
Online documentation:
- •
- http://python-jenkins.readthedocs.org/en/latest/
DEVELOPERS
Bug report:
- •
-
https://bugs.launchpad.net/python-jenkins
Repository:
- •
-
https://git.openstack.org/cgit/stackforge/python-jenkins
Cloning:
- •
-
git clone https://git.openstack.org/stackforge/python-jenkins
Patches are submitted via Gerrit at:
- •
-
https://review.openstack.org/
Please do not submit GitHub pull requests, they will be automatically closed.
More details on how you can contribute is available on our wiki at:
- •
- http://docs.openstack.org/infra/manual/developers.html
WRITING A PATCH
We ask that all code submissions be flake8 clean. The easiest way to do that is to run tox before submitting code for review in Gerrit. It will run flake8 in the same manner as the automated test suite that will run on proposed patchsets.
INSTALLING WITHOUT SETUP.PY
Then install the required python packages using pip:
$ sudo pip install python-jenkins
API REFERENCE
See examples at example
- exception jenkins.JenkinsException
- General exception type for jenkins-API-related failures.
- exception jenkins.NotFoundException
- A special exception to call out the case of receiving a 404.
- exception jenkins.EmptyResponseException
- A special exception to call out the case receiving an empty response.
- exception jenkins.BadHTTPException
- A special exception to call out the case of a broken HTTP response.
- jenkins.auth_headers(username, password)
-
Simple implementation of HTTP Basic Authentication.
Returns the 'Authentication' header value.
- class jenkins.Jenkins(url, username=None, password=None, timeout=<object object at 0x7f5587ade220>)
-
Create handle to Jenkins instance.
All methods will raise JenkinsException on failure.
- Parameters
- •
- username -- Server username, str
- •
- password -- Server password, str
- •
- url -- URL of Jenkins server, str
- •
- timeout -- Server connection timeout in secs (default: not set), int
- Jenkins.maybe_add_crumb(req)
- Jenkins.get_job_info(name, depth=0)
- Get job information dictionary.
- Parameters
- •
- name -- Job name, str
- •
- depth -- JSON depth, int
- Returns
- dictionary of job information
- Jenkins.get_job_info_regex(pattern, depth=0)
- Get a list of jobs information that contain names which match the regex pattern.
- Parameters
- •
- pattern -- regex pattern, str
- •
- depth -- JSON depth, int
- Returns
- List of jobs info, list
- Jenkins.get_job_name(name)
-
Return the name of a job using the API.
That is roughly an identity method which can be used to quickly verify a job exist or is accessible without causing too much stress on the server side.
- Parameters
- name -- Job name, str
- Returns
- Name of job or None
- Jenkins.debug_job_info(job_name)
- Print out job info in more readable format.
- Jenkins.jenkins_open(req, add_crumb=True)
-
Utility routine for opening an HTTP request to a Jenkins server.
This should only be used to extends the Jenkins API.
- Jenkins.get_build_info(name, number, depth=0)
- Get build information dictionary.
- Parameters
- •
- name -- Job name, str
- •
- name -- Build number, int
- •
- depth -- JSON depth, int
- Returns
-
dictionary of build information, dict
Example:
>>> j = Jenkins() >>> next_build_number = j.get_job_info('build_name')['nextBuildNumber'] >>> output = j.build_job('build_name') >>> from time import sleep; sleep(10) >>> build_info = j.get_build_info('build_name', next_build_number) >>> print(build_info) {u'building': False, u'changeSet': {u'items': [{u'date': u'2011-12-19T18:01:52.540557Z', u'msg': u'test', u'revision': 66, u'user': u'unknown', u'paths': [{u'editType': u'edit', u'file': u'/branches/demo/index.html'}]}], u'kind': u'svn', u'revisions': [{u'module': u'http://eaas-svn01.i3.level3.com/eaas', u'revision': 66}]}, u'builtOn': u'', u'description': None, u'artifacts': [{u'relativePath': u'dist/eaas-87-2011-12-19_18-01-57.war', u'displayPath': u'eaas-87-2011-12-19_18-01-57.war', u'fileName': u'eaas-87-2011-12-19_18-01-57.war'}, {u'relativePath': u'dist/eaas-87-2011-12-19_18-01-57.war.zip', u'displayPath': u'eaas-87-2011-12-19_18-01-57.war.zip', u'fileName': u'eaas-87-2011-12-19_18-01-57.war.zip'}], u'timestamp': 1324317717000, u'number': 87, u'actions': [{u'parameters': [{u'name': u'SERVICE_NAME', u'value': u'eaas'}, {u'name': u'PROJECT_NAME', u'value': u'demo'}]}, {u'causes': [{u'userName': u'anonymous', u'shortDescription': u'Started by user anonymous'}]}, {}, {}, {}], u'id': u'2011-12-19_18-01-57', u'keepLog': False, u'url': u'http://eaas-jenkins01.i3.level3.com:9080/job/build_war/87/', u'culprits': [{u'absoluteUrl': u'http://eaas-jenkins01.i3.level3.com:9080/user/unknown', u'fullName': u'unknown'}], u'result': u'SUCCESS', u'duration': 8826, u'fullDisplayName': u'build_war #87'}
- Jenkins.get_queue_info()
- Returns
- list of job dictionaries, [dict]
- Example::
-
>>> j = Jenkins() >>> queue_info = j.get_queue_info() >>> print(queue_info[0]) {u'task': {u'url': u'http://your_url/job/my_job/', u'color': u'aborted_anime', u'name': u'my_job'}, u'stuck': False, u'actions': [{u'causes': [{u'shortDescription': u'Started by timer'}]}], u'buildable': False, u'params': u'', u'buildableStartMilliseconds': 1315087293316, u'why': u'Build #2,532 is already in progress (ETA:10 min)', u'blocked': True}
- Jenkins.cancel_queue(id)
- Cancel a queued build.
- Parameters
- id -- Jenkins job id number for the build, int
- Jenkins.get_info()
-
Get information on this Master.
This information includes job list and view information.
- Returns
-
dictionary of information about Master, dict
Example:
>>> j = Jenkins() >>> info = j.get_info() >>> jobs = info['jobs'] >>> print(jobs[0]) {u'url': u'http://your_url_here/job/my_job/', u'color': u'blue', u'name': u'my_job'}
- Jenkins.get_version()
- Get the version of this Master.
- Returns
-
This master's version number str
Example:
>>> j = Jenkins() >>> info = j.get_version() >>> print info >>> 1.541
- Jenkins.get_plugins_info(depth=2)
-
Get all installed plugins information on this Master.
This method retrieves information about each plugin that is installed on master.
- Parameters
- depth -- JSON depth, int
- Returns
-
info on all plugins [dict]
Example:
>>> j = Jenkins() >>> info = j.get_plugins_info() >>> print(info) [{u'backupVersion': None, u'version': u'0.0.4', u'deleted': False, u'supportsDynamicLoad': u'MAYBE', u'hasUpdate': True, u'enabled': True, u'pinned': False, u'downgradable': False, u'dependencies': [], u'url': u'http://wiki.jenkins-ci.org/display/JENKINS/Gearman+Plugin', u'longName': u'Gearman Plugin', u'active': True, u'shortName': u'gearman-plugin', u'bundled': False}, ..]
- Jenkins.get_plugin_info(name, depth=2)
-
Get an installed plugin information on this Master.
This method retrieves information about a speicifc plugin. The passed in plugin name (short or long) must be an exact match.
- Parameters
- •
- name -- Name (short or long) of plugin, str
- •
- depth -- JSON depth, int
- Returns
-
a specific plugin dict
Example:
>>> j = Jenkins() >>> info = j.get_plugin_info("Gearman Plugin") >>> print(info) {u'backupVersion': None, u'version': u'0.0.4', u'deleted': False, u'supportsDynamicLoad': u'MAYBE', u'hasUpdate': True, u'enabled': True, u'pinned': False, u'downgradable': False, u'dependencies': [], u'url': u'http://wiki.jenkins-ci.org/display/JENKINS/Gearman+Plugin', u'longName': u'Gearman Plugin', u'active': True, u'shortName': u'gearman-plugin', u'bundled': False}
- Jenkins.get_jobs()
-
Get list of jobs running.
Each job is a dictionary with 'name', 'url', and 'color' keys.
- Returns
- list of jobs, [ { str: str} ]
- Jenkins.copy_job(from_name, to_name)
- Copy a Jenkins job
- Parameters
- •
- from_name -- Name of Jenkins job to copy from, str
- •
- to_name -- Name of Jenkins job to copy to, str
- Jenkins.rename_job(from_name, to_name)
- Rename an existing Jenkins job
- Parameters
- •
- from_name -- Name of Jenkins job to rename, str
- •
- to_name -- New Jenkins job name, str
- Jenkins.delete_job(name)
- Delete Jenkins job permanently.
- Parameters
- name -- Name of Jenkins job, str
- Jenkins.enable_job(name)
- Enable Jenkins job.
- Parameters
- name -- Name of Jenkins job, str
- Jenkins.disable_job(name)
-
Disable Jenkins job.
To re-enable, call Jenkins.enable_job().
- Parameters
- name -- Name of Jenkins job, str
- Jenkins.job_exists(name)
- Check whether a job exists
- Parameters
- name -- Name of Jenkins job, str
- Returns
- True if Jenkins job exists
- Jenkins.jobs_count()
- Get the number of jobs on the Jenkins server
- Returns
- Total number of jobs, int
- Jenkins.assert_job_exists(name, exception_message='job[%s] does not exist')
- Raise an exception if a job does not exist
- Parameters
- •
- name -- Name of Jenkins job, str
- •
- exception_message -- Message to use for the exception. Formatted with name
- Throws
- JenkinsException whenever the job does not exist
- Jenkins.create_job(name, config_xml)
- Create a new Jenkins job
- Parameters
- •
- name -- Name of Jenkins job, str
- •
- config_xml -- config file text, str
- Jenkins.get_job_config(name)
- Get configuration of existing Jenkins job.
- Parameters
- name -- Name of Jenkins job, str
- Returns
- job configuration (XML format)
- Jenkins.reconfig_job(name, config_xml)
-
Change configuration of existing Jenkins job.
To create a new job, see Jenkins.create_job().
- Parameters
- •
- name -- Name of Jenkins job, str
- •
- config_xml -- New XML configuration, str
- Jenkins.build_job_url(name, parameters=None, token=None)
-
Get URL to trigger build job.
Authenticated setups may require configuring a token on the server side.
- Parameters
- •
- parameters -- parameters for job, or None., dict
- •
- token -- (optional) token for building job, str
- Returns
- URL for building job
- Jenkins.build_job(name, parameters=None, token=None)
- Trigger build job.
- Parameters
- •
- name -- name of job
- •
- parameters -- parameters for job, or None, dict
- •
- token -- Jenkins API token
- Jenkins.run_script(script)
- Execute a groovy script on the jenkins master.
- Parameters
- script -- The groovy script, string
- Returns
- The result of the script run.
- Example::
-
>>> j = Jenkins() >>> info = j.run_script("println(Jenkins.instance.pluginManager.plugins)") >>> print(info) u'[Plugin:windows-slaves, Plugin:ssh-slaves, Plugin:translation, Plugin:cvs, Plugin:nodelabelparameter, Plugin:external-monitor-job, Plugin:mailer, Plugin:jquery, Plugin:antisamy-markup-formatter, Plugin:maven-plugin, Plugin:pam-auth]'
- Jenkins.stop_build(name, number)
- Stop a running Jenkins build.
- Parameters
- •
- name -- Name of Jenkins job, str
- •
- number -- Jenkins build number for the job, int
- Jenkins.get_nodes()
-
Get a list of nodes connected to the Master
Each node is a dict with keys 'name' and 'offline'
- Returns
- List of nodes, [ { str: str, str: bool} ]
- Jenkins.get_node_info(name, depth=0)
- Get node information dictionary
- Parameters
- •
- name -- Node name, str
- •
- depth -- JSON depth, int
- Returns
- Dictionary of node info, dict
- Jenkins.node_exists(name)
- Check whether a node exists
- Parameters
- name -- Name of Jenkins node, str
- Returns
- True if Jenkins node exists
- Jenkins.assert_node_exists(name, exception_message='node[%s] does not exist')
- Raise an exception if a node does not exist
- Parameters
- •
- name -- Name of Jenkins node, str
- •
- exception_message -- Message to use for the exception. Formatted with name
- Throws
- JenkinsException whenever the node does not exist
- Jenkins.delete_node(name)
- Delete Jenkins node permanently.
- Parameters
- name -- Name of Jenkins node, str
- Jenkins.disable_node(name, msg='')
- Disable a node
- Parameters
- •
- name -- Jenkins node name, str
- •
- msg -- Offline message, str
- Jenkins.enable_node(name)
- Enable a node
- Parameters
- name -- Jenkins node name, str
- Jenkins.create_node(name, numExecutors=2, nodeDescription=None, remoteFS='/var/lib/jenkins', labels=None, exclusive=False, launcher='hudson.slaves.CommandLauncher', launcher_params={})
- Create a node
- Parameters
- •
- name -- name of node to create, str
- •
- numExecutors -- number of executors for node, int
- •
- nodeDescription -- Description of node, str
- •
- remoteFS -- Remote filesystem location to use, str
- •
- labels -- Labels to associate with node, str
- •
- exclusive -- Use this node for tied jobs only, bool
- •
- launcher -- The launch method for the slave, jenkins.LAUNCHER_COMMAND, jenkins.LAUNCHER_SSH, jenkins.LAUNCHER_JNLP, jenkins.LAUNCHER_WINDOWS_SERVICE
- •
- launcher_params -- Additional parameters for the launcher, dict
- Jenkins.get_node_config(name)
- Get the configuration for a node.
- Parameters
- name -- Jenkins node name, str
- Jenkins.reconfig_node(name, config_xml)
- Change the configuration for an existing node.
- Parameters
- •
- name -- Jenkins node name, str
- •
- config_xml -- New XML configuration, str
- Jenkins.get_build_console_output(name, number)
- Get build console text.
- Parameters
- •
- name -- Job name, str
- •
- name -- Build number, int
- Returns
- Build console output, str
- Jenkins.get_view_name(name)
-
Return the name of a view using the API.
That is roughly an identity method which can be used to quickly verify a view exists or is accessible without causing too much stress on the server side.
- Parameters
- name -- View name, str
- Returns
- Name of view or None
- Jenkins.assert_view_exists(name, exception_message='view[%s] does not exist')
- Raise an exception if a view does not exist
- Parameters
- •
- name -- Name of Jenkins view, str
- •
- exception_message -- Message to use for the exception. Formatted with name
- Throws
- JenkinsException whenever the view does not exist
- Jenkins.view_exists(name)
- Check whether a view exists
- Parameters
- name -- Name of Jenkins view, str
- Returns
- True if Jenkins view exists
- Jenkins.get_views()
-
Get list of views running.
Each view is a dictionary with 'name' and 'url' keys.
- Returns
- list of views, [ { str: str} ]
- Jenkins.delete_view(name)
- Delete Jenkins view permanently.
- Parameters
- name -- Name of Jenkins view, str
- Jenkins.create_view(name, config_xml)
- Create a new Jenkins view
- Parameters
- •
- name -- Name of Jenkins view, str
- •
- config_xml -- config file text, str
- Jenkins.reconfig_view(name, config_xml)
-
Change configuration of existing Jenkins view.
To create a new view, see Jenkins.create_view().
- Parameters
- •
- name -- Name of Jenkins view, str
- •
- config_xml -- New XML configuration, str
- Jenkins.get_view_config(name)
- Get configuration of existing Jenkins view.
- Parameters
- name -- Name of Jenkins view, str
- Returns
- view configuration (XML format)
EXAMPLE USAGE
Example usage:
import jenkins j = jenkins.Jenkins('http://your_url_here', 'username', 'password') j.get_jobs() j.create_job('empty', jenkins.EMPTY_CONFIG_XML) j.disable_job('empty') j.copy_job('empty', 'empty_copy') j.enable_job('empty_copy') j.reconfig_job('empty_copy', jenkins.RECONFIG_XML) j.delete_job('empty') j.delete_job('empty_copy') j.get_views() j.create_view('EMPTY', jenkins.EMPTY_VIEW_CONFIG_XML) j.view_exists('EMPTY') j.delete_view('EMPTY') # build a parameterized job # requires setting up api-test job to accept 'param1' & 'param2' j.build_job('api-test', {'param1': 'test value 1', 'param2': 'test value 2'}) last_build_number = j.get_job_info('api-test')['lastCompletedBuild']['number'] build_info = j.get_job_info('api-test', last_build_number) print(build_info)
Look at the api for more details.
INSTALLING
The module is known to pip and Debian-based distributions as python-jenkins.
pip:
pip install python-jenkins
easy_install:
easy_install python-jenkins
The module has been packaged since Ubuntu Oneiric (11.10):
apt-get install python-jenkins
And on Fedora 19 and later:
yum install python-jenkins
For development:
python setup.py develop
Documentation
Documentation is included in the doc folder. To generate docs locally execute the command:
tox -e docs
The generated documentation is then available under doc/build/html/index.html.
Unit Tests
Unit tests have been included and are in the tests folder. We recently started including unit tests as examples in our documentation so to keep the examples up to date it is very important that we include unit tests for every module. To run the unit tests, execute the command:
tox -e py27
- •
- Note: View tox.ini to run tests on other versions of Python.
Test Coverage
To measure test coverage, execute the command:
tox -e cover
- •
- genindex
- •
- modindex
- •
- search
AUTHOR
Ken Conley, James Page, Tully Foote, Matthew GertnerCOPYRIGHT
2010, Willow Garage