|
Jenkins provides machine-consumable remote access API to its functionalities. Currently it comes in three flavors:
Remote access API is offered in a REST-like style. That is, there is no single entry point for all features, and instead they are available under the ".../api/" URL where "..." portion is the data that it acts on. For example, if your Jenkins installation sits at http://ci.jruby.org/, visiting http://ci.jruby.org/api/ will show just the top-level API features available – primarily a listing of the configured jobs for this Jenkins instance. The work on this front is ongoing, so if you find missing features, please file an issue. What can you do with it?Remote API can be used to do things like these:
Submitting jobsJobs without parameters You merely need to perform an HTTP POST on JENKINS_URL/job/JOBNAME/build?token=TOKEN where TOKEN is set up in the job configuration. Jobs with parameters Also see Parameterized Build. Simple example - sending "String Parameters": curl -X POST JENKINS_URL/job/JOB_NAME/build \
--data token=TOKEN \
--data-urlencode json='{"parameter": [{"name":"id", "value":"123"}, {"name":"verbosity", "value":"high"}]}'
Another example - sending a "File Parameter": curl -X POST JENKINS_URL/job/JOB_NAME/build \
--user USER:PASSWORD \
--form file0=@PATH_TO_FILE \
--form json='{"parameter": [{"name":"FILE_LOCATION_AS_SET_IN_JENKINS", "file":"file0"}]}'
Remote API and securityWhen your Jenkins is secured, you can use HTTP BASIC authentication to authenticate remote API requests. See Authenticating scripted clients for more details. CSRF ProtectionIf your Jenkins uses the "Prevent Cross Site Request Forgery exploits" security option (which it should), when you make a POST request, you have to send a CSRF protection token as an HTTP request header. wget -q --output-document - \ 'JENKINS_URL/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)' This will print something like ".crumb:1234abcd", which you should add to the subsequent request. Sample codeA simple client is available to demonstrate how you can invoke the XML from Java (Java source) XPath selectionThe XML API supports a selection by XPath by using the query parameter 'xpath'. This is convenient for extracting information in environments where XML manipulation is tedious (such as shell script.) See issue #626 for an example of how to use this. XPath exclusionSimilar to the 'xpath' query parameter above, you can use (possibly multiple) 'exclude' query patterns to exclude nodes from the resulting XML. All the nodes that match the specified XPath will be removed from the XML. Depth controlSometimes the remote API doesn't give you enough information in one call. For example, if you'd like to find out all the last successful build of a given view, you'd realize that the invocation to the remote API of the view won't give you this, and you'd have to recursively call the remote API of each project to find this out. The depth control, introduced in 1.167, solves this problem. To understand this feature, it's good to start with how the remote API works. The data model that Jenkins maintains internally can be thought of as a big tree structure, and when you make a remote API call, you are getting a small subtree of it. The subtree is rooted at the object for which you made a remote API call, and the sub-tree is cut beyond certain depth to avoid returning too much data. You can adjust this cut-off behavior by specifying the depth query parameter. When you specify a positive depth value, the subtree cut-off happens that much later. So the net result is, if you specify a bigger depth value, you'll see that the remote API will now return more data. Because of the algorithm, this works in such a way that the data returned by a bigger depth value includes all the data returned by smaller See .../api/ on your Jenkins server for more up-to-date details. Python API wrappersJenkinsAPI and Python-Jenkins are object-oriented python wrappers for the Python 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. Services offered currently include:
Ruby API wrappersJenkins API Client is an object oriented ruby wrapper project that consumes Jenkins's JSON API and aims at providing access to all remote API Jenkins provides. It is available as a Rubygem and can be useful to interact with the Job, Node, View, BuildQueue, and System related functionalities. Services currently offered include:
This project is in rapid development and new features are getting added every day. Watch the progress here. Detecting Jenkins versionTo check the version of Jenkins, load the top page (or, as of 1.483, any .../api/* page too) and check for the X-Jenkins response header. This contains the version number of Jenkins, like "1.404" This is also a good way to check if an URL is a Jenkins URL. Discovering Jenkins on the networkJenkins instances listen on UDP port 33848. Whenever a UDP packet is received, it will respond with a short XML fragment that shows the connection information. This XML has the following format: <hudson> <version>1.380</version> <!-- version of Jenkins --> <url>http://somewhere/jenkins/</url> <!-- HTTP URL. Not available if not configured --> <slave-port>12345</slave-port> <!-- if TCP slave listener port is configured, its number --> </hudson> By using this, a client can use a UDP broadcast to try to discover nearby Jenkins instances. This is primarily useful for Swarm Plugin. |
Remote access API
Skip to end of metadata
Go to start of metadata
Comments (23)
Oct 27, 2009
Alejandro Pérez García says:
Spanish tutorial about how to launch a build from a Subversion's hook, using the...Spanish tutorial about how to launch a build from a Subversion's hook, using the remote API
http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=hudsonSubversionPush
Apr 11, 2010
Gabor Engler says:
On the Parameterized Build page (http://wiki.jenkins-ci.org/display/HUDSON/Param...On the Parameterized Build page (http://wiki.jenkins-ci.org/display/HUDSON/Parameterized+Build) you can find other useful information about remote API feature:
e.g.: Remote build with multiple parameters: http://server/job/myjob/buildWithParameters?PARAM1=Value1&PARAM2=Value2
Oct 27, 2010
holger horn says:
I tried to trigger remotly by URL a job with multiple parameters like this : ht...I tried to trigger remotly by URL a job with multiple parameters like this :
http://server/job/myjob/buildWithParameters?PARAM1=Value1&PARAM2=Value2
exactly this is not working, what am I doing wrong?
is someone there who has tried it with success?
I tried also to send same request with JSON, like described above. no success too... I used this URL:
Unable to render embedded object: File (parameter.BMP) not found.
can someone help me? what am I doing wrong?
Apr 30, 2010
Joel Beaudoin says:
Is there any way to use this API to tell Hudson to "keep this build forever" for...Is there any way to use this API to tell Hudson to "keep this build forever" for a particular build. I am working on some automation for publishing a particular build to an FTP site and this is one of the steps I would like performed. So far, I haven't been able to figure out a programmatic way to mark a given build as "keep" in Hudson. Ideas?
Jul 14, 2010
Joel Beaudoin says:
After looking into this a bit closer, I figured out how to do this. A simple wge...After looking into this a bit closer, I figured out how to do this. A simple wget/curl of something like:
http://company.com/hudson/view/ViewNameHere/job/JobNameHere/nn/toggleLogKeep
or outside of a view like
http://company.com/hudson/job/JobNameHere/nn/toggleLogKeep
Replacing ViewNameHere and JobNameHere as appropriate and specifying the build number in place of 'nn'. Obvious after viewing the HTML, but it would be cool to have a page documenting this type of thing. Just an idea ... I sure don't have the time to do it 8-(
Jul 22, 2010
Joel Beaudoin says:
Here is a simple python example to do this toggling. Most of the logic is to dea...Here is a simple python example to do this toggling. Most of the logic is to deal with the 403 that Hudson returns to request authorization:
Jun 24, 2011
Jim Divine says:
Here's an easier way to do the forced basic authentication. import urllib2 imp...Here's an easier way to do the forced basic authentication.
Then use this urlopen function instead of urllib2.urlopen.
Mar 03, 2012
Joel Beaudoin says:
Much simpler and solves a problem that I'm having with the method I was using pr...Much simpler and solves a problem that I'm having with the method I was using previously. Thanks for sharing!
Jun 21, 2011
Danny Staple says:
My version of that is: wget --no-proxy ${BUILD_URL}/toggleLogKeep --quiet --sp...My version of that is:
wget --no-proxy ${BUILD_URL}/toggleLogKeep --quiet --spider --http-user="<username>" --auth-no-challenge --http-password="<password>"The --quiet means that it doesn't show progress etc, --spider means you don't get some HTML downloaded. The auth is as above.
The --no-proxy is needed to prevent proxies trying to cache this and causing weird behaviour. If you are the wrong side of the proxy from the jenkins/hudson box you'll need to leave that in of course.
Jul 20, 2010
William Luo says:
python sample code of hudson remote api #!/usr/bin/env python # this script ...python sample code of hudson remote api
Jan 04, 2011
Christopher Marsh-Bourdon says:
Is there any way to access the configuration of the Jobs, I tried the following,...Is there any way to access the configuration of the Jobs, I tried the following, but with no success:
http://company.com/hudson/job/JOBNAME/configure/api/xml
This just yielded a 404, so either this functionality doesn't exist, or I have erred on the URL.
Jan 04, 2011
Joel Beaudoin says:
You can access a job's configuration via: http://company.com/hudson/job/JOBNAME...You can access a job's configuration via:
http://company.com/hudson/job/JOBNAME/config.xml
You can find out this and other cool things via:
http://company.com/hudson/job/JOBNAME/api/
Hope this helps,
Joel
Jan 04, 2011
Christopher Marsh-Bourdon says:
A big thanks Joel; that was exactly what I was after.A big thanks Joel; that was exactly what I was after.
Feb 19, 2011
Victor Rodrigues says:
Could I get a JSON containing the jobs that are currently being executed? I wis...Could I get a JSON containing the jobs that are currently being executed?
I wish I could get build history through JSON api also. Is there any uri I'm missing?
Thanks!
Victor
Mar 11, 2011
Gstad Winkldorff says:
"Could I get a JSON containing the jobs that are currently being executed?" I s..."Could I get a JSON containing the jobs that are currently being executed?"
I second that request.
Best regards.
Gstad
May 27, 2011
Scal Pa says:
Could someone show a working code sample on how to trigger a paramtrized job usi...Could someone show a working code sample on how to trigger a paramtrized job using JQuery?
I use no authentication of any kind at Jenkins level and there is no "Build Trigger" option enabled for the job. Here is the piece of code I try but I arways get back a status code of [0] with a failure:
Can someone please confirm this is the correct way or point out errors/mistakes I'm doing with this remote api call?
Thanks!
Mar 14, 2012
Harish Kayarohanam says:
Is there a way to add jenkins plugin using Remote access API ?Is there a way to add jenkins plugin using Remote access API ?
Sep 20, 2012
Jesse Glick says:
See /pluginManager/api/ for information on this.See /pluginManager/api/ for information on this.
Sep 24, 2012
Roger Myung says:
I'm able to successfully post a build using the instructions here. However, my s...I'm able to successfully post a build using the instructions here. However, my script has difficulty telling whether it succeeded.
I get a HTTP/1.1 302 Found back.
Is there a way to get confirmation from Jenkins that the build was added to the queue? Even better, can I get the build number, and/or get notification when the build finishes?
Oct 19, 2012
Sanjoy Ghosh says:
I am running Hudson job remotely through separate application using remote acces...I am running Hudson job remotely through separate application using remote access api. But how shall I get the build status of my request build as soon as the build is finished.
Oct 25, 2012
Matt Don says:
Has anyone been able to get authentication working with an API token using groov...Has anyone been able to get authentication working with an API token using groovy HTTPBuilder? I know the example on this site shows groovy with HTTPclient, but I'm just wondering if its possible with HTTPBuilder. I can do basic pre-emptive authentication with username password, but I can't get it to work with the API token.
Nov 08, 2013
Nane Nare Hambardzumyan says:
is it possible ignore certificate during connection? i get _ssl.c:504: error...is it possible ignore certificate during connection? i get _ssl.c:504: error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert internal error during connection
Apr 17
Mahendra Singh says:
How can I update my Jenkins config using api: Using Jenkins ver 1.5961 ...How can I update my Jenkins config using api:
Using Jenkins ver 1.5961
I am trying the below option:
curl -v -X POST --data-binary @myconfig.xml -u "userid:apiToken" http://localhost:8080/job/job_name/config.xml
Getting Exception:
Please check <a href="https://issues.jenkins-ci.org/">our bug tracker</a> to see if a similar problem has already been reported.
If it is already reported, please vote and put a comment on it to let us gauge the impact of the problem.
If you think this is a new issue, please file a new issue.
When you file an issue, make sure to add the entire stack trace, along with the version of Jenkins and relevant plugins.
<a href="http://jenkins-ci.org/content/mailing-lists">The users list</a> might be also useful in understanding what has happened.</p><h2>Stack trace</h2><pre style="margin:2em; clear:both">java.io.IOException: Failed to persist config.xml
at hudson.model.AbstractItem.updateByXml(AbstractItem.java:648)
at hudson.model.AbstractItem.doConfigDotXml(AbstractItem.java:614)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.kohsuke.stapler.Function$InstanceFunction.invoke(Function.java:298)
at org.kohsuke.stapler.Function.bindAndInvoke(Function.java:161)
at org.kohsuke.stapler.Function.bindAndInvokeAndServeResponse(Function.java:96)
at org.kohsuke.stapler.MetaClass$1.doDispatch(MetaClass.java:121)
at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:53)
at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:746)
at org.kohsuke.stapler.Stapler.invoke(Stapler.java:876)
at org.kohsuke.stapler.MetaClass$6.doDispatch(MetaClass.java:249)
at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:53)
at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:746)
at org.kohsuke.stapler.Stapler.invoke(Stapler.java:876)
at org.kohsuke.stapler.MetaClass$6.doDispatch(MetaClass.java:249)
at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:53)
at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:746)
at org.kohsuke.stapler.Stapler.invoke(Stapler.java:876)
at org.kohsuke.stapler.Stapler.invoke(Stapler.java:649)
at org.kohsuke.stapler.Stapler.service(Stapler.java:238)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:96)
at hudson.plugins.scm_sync_configuration.extensions.ScmSyncConfigurationFilter$1.call(ScmSyncConfigurationFilter.java:36)
at hudson.plugins.scm_sync_configuration.ScmSyncConfigurationDataProvider.provideRequestDuring(ScmSyncConfigurationDataProvider.java:103)
at hudson.plugins.scm_sync_configuration.extensions.ScmSyncConfigurationFilter.doFilter(ScmSyncConfigurationFilter.java:32)
at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:99)
at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:206)
at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:179)
at net.bull.javamelody.PluginMonitoringFilter.doFilter(PluginMonitoringFilter.java:86)
at org.jvnet.hudson.plugins.monitoring.HudsonMonitoringFilter.doFilter(HudsonMonitoringFilter.java:84)
at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:99)
at hudson.plugins.audit_trail.AuditTrailFilter.doFilter(AuditTrailFilter.java:66)
at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:99)
at hudson.util.PluginServletFilter.doFilter(PluginServletFilter.java:88)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at hudson.security.csrf.CrumbFilter.doFilter(CrumbFilter.java:48)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:84)
at hudson.security.UnwrapSecurityExceptionFilter.doFilter(UnwrapSecurityExceptionFilter.java:51)
at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
at jenkins.security.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:117)
at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
at org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125)
at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
at org.acegisecurity.ui.rememberme.RememberMeProcessingFilter.doFilter(RememberMeProcessingFilter.java:142)
at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:271)
at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
at jenkins.security.BasicHeaderProcessor.success(BasicHeaderProcessor.java:140)
at jenkins.security.BasicHeaderProcessor.doFilter(BasicHeaderProcessor.java:82)
at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:249)
at hudson.security.HttpSessionContextIntegrationFilter2.doFilter(HttpSessionContextIntegrationFilter2.java:67)
at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
at hudson.security.ChainedServletFilter.doFilter(ChainedServletFilter.java:76)
at hudson.security.HudsonFilter.doFilter(HudsonFilter.java:164)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.kohsuke.stapler.compression.CompressionFilter.doFilter(CompressionFilter.java:49)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at hudson.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:81)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.kohsuke.stapler.DiagnosticThreadNameFilter.doFilter(DiagnosticThreadNameFilter.java:30)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:558)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.ClassNotFoundException: org.apache.xerces.parsers.SAXParser
at org.xml.sax.helpers.XMLReaderFactory.loadClass(XMLReaderFactory.java:189)
at org.xml.sax.helpers.XMLReaderFactory.createXMLReader(XMLReaderFactory.java:150)
at jenkins.util.xml.XMLUtils.safeTransform(XMLUtils.java:48)
at hudson.model.AbstractItem.updateByXml(AbstractItem.java:643)
... 84 more
Caused by: java.lang.ClassNotFoundException: org.apache.xerces.parsers.SAXParser
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1516)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1361)
at org.xml.sax.helpers.NewInstance.newInstance(NewInstance.java:49)
at org.xml.sax.helpers.XMLReaderFactory.loadClass(XMLReaderFactory.java:187)
... 87 more
Add Comment