Java client, built on top of jclouds, for working with Jenkins REST API
jenkins-rest
Java client is built on the top of jclouds for working with Jenkins REST API.
Setup
Client's can be built like so:
JenkinsClient client = JenkinsClient.builder() .endPoint("http://127.0.0.1:8080") // Optional. Defaults to http://127.0.0.1:8080 .credentials("admin:password") // Optional. .build();
SystemInfo systemInfo = client.api().systemApi().systemInfo(); assertTrue(systemInfo.jenkinsVersion().equals("1.642.4"));
Latest release
Can be found in maven like so:
<dependency> <groupId>io.github.cdancy</groupId> <artifactId>jenkins-rest</artifactId> <version>X.Y.Z</version> <classifier>sources|tests|javadoc|all</classifier> (Optional) </dependency>
Documentation
- javadocs can be found via github pages here
- the jenkins-rest wiki
Property based setup
Client instances do NOT need to supply the endPoint or credentials as a part of instantiating the JenkinsClient object. Instead one can supply them through system properties, environment variables, or a combination of the two. System properties will be searched first and if not found, will attempt to query the environment.
Setting the endpoint can be done with any of the following (searched in order):
jenkins.rest.endpointjenkinsRestEndpointJENKINSRESTENDPOINT
http://localhost:8080.
Setting the credentials can be done with any of the following (searched in order):
jenkins.rest.api.tokenjenkinsRestApiTokenJENKINSRESTAPI_TOKENjenkins.rest.credentialsjenkinsRestCredentialsJENKINSRESTCREDENTIALS
Credentials
jenkins-rest credentials can take 1 of 3 forms:
- Colon delimited username and api token: admin:apiToken
JenkinsClient.builder().apiToken("admin:apiToken")
- Colon delimited username and password: admin:password
JenkinsClient.builder().credentials("admin:password")
- Base64 encoded username followed by password YWRtaW46cGFzc3dvcmQ= or api token YWRtaW46YXBpVG9rZW4=
JenkinsClient.builder().credentials("YWRtaW46cGFzc3dvcmQ=")
- use JenkinsClient.builder().apiToken("YWRtaW46YXBpVG9rZW4=")
The Jenkins crumb is automatically requested when POSTing using the anonymous and the username:password authentication methods. It is not requested when you use the apiToken as it is not needed in this case. For more details, see
Examples
The mock and live tests provide many examples that you can use in your own code.
Components
- jclouds \- used as the backend for communicating with Jenkins REST API
- AutoValue \- used to create immutable value types both to and from the jenkins program
Testing
Running mock tests can be done like so:
./gradlew clean build mockTest Running integration tests require an existing jenkins instance which can be obtained with docker:
docker build -t jenkins-rest/jenkins src/main/docker docker run -d --rm -p 8080:8080 --name jenkins-rest jenkins-rest/jenkins ./gradlew clean build integTest
Integration tests settings
If you use the provided docker instance, there is no other preparation necessary. If you wish to run integration tests against your own Jenkins server, the requirements are outlined in the next section.
Jenkins instance requirements
- a running instance accessible on http://127.0.0.1:8080 (can be changed in the gradle.properties file)
- Jenkins security
admin user (credentials used by the tests can be changed in the gradle.properties file) with ADMIN role (required as the tests install plugins)
- CSRF protection enabled. Not mandatory but recommended by the Jenkins documentation. The lib supports Jenkins instances with our without this protection (see #14)
- Plugins
java.lang.NoClassDefFoundError: com/cloudbees/hudson/plugins/folder/properties/FolderCredentialsProvider
- CloudBees Folder plugin installed
- OWASP Markup Formatter configured to use Safe HTML
- Configuration As Code plugin installed
- Pipeline plugin installed
This project provides instructions to setup a pre-configured Docker container
Integration tests configuration
- jenkins url and authentication method used by the tests are defined in the
gradle.propertiesfile - by default, tests use the
credentials(username:password) authentication method but this can be changed to use the API Token. See thegradle.propertiesfile.
Running integration tests from within your IDE
- the
integTestgradle task sets various System Properties - if you don't want to use gradle as tests runner in your IDE, configure the tests with the same kind of System Properties
