利用 Java 操作 Jenkins API 实现对 Jenkins 的控制详解

利用 Java 操作 Jenkins API 实现对 Jenkins 的控制详解

文章目录

  !版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。


由于最近工作需要利用 Jenkins 远程 API 操作 Jenkins 来完成一些列操作,就抽空研究了下如何利用 JAVA 操作 Jenkins API,实现对 Jenkins Job、View等等的增、删、改、查操作。

系统环境:

  • Java 版本:1.8
  • Jenkins 版本:2.172

参靠及项目地址:

  • 本示例项目 Github 地址:https://github.com/my-dlq/blog-example/tree/master/jenkins/jenkins-api-demo
  • Jenkins API wiki 地址:https://wiki.jenkins.io/display/JENKINS/Remote+access+API
  • Jenkins-Java-Client Github 地址:https://github.com/jenkinsci/java-client-api

如果示例对你就帮助就 github 帮忙点个星哈~

一、 Jenkins API

1、Jenkins API 简介

Jenkins 远程 API 能够通过 Http 协议远程调用相关命令操作 Jenkins 进行 Jenkins 视图、任务、插件、构建信息、任务日志信息、统计信息等,非常容易与其配合更好的完成 CI/CD 工作。

2、Jenkins API 格式

Jenkins API 总共有三种格式,分别为:

  • JSON API
  • XML API
  • Python API

3、Jenkins 查看 API 信息

可以用浏览器打开你的 Jenkins UI 界面,然后 URL 地址栏后面追加 “/api/json” 或者 “/api/xml” ,效果如下:

  • “JenkinsURL/api/json” 显示:
 1<hudson _class='hudson.model.Hudson'>
 2    <assignedLabel>
 3        <name>master</name>
 4    </assignedLabel>
 5    <mode>NORMAL</mode>
 6    <nodeDescription>Jenkins的master节点</nodeDescription>
 7    <nodeName></nodeName>
 8    <numExecutors>1</numExecutors>
 9    <job _class='org.jenkinsci.plugins.workflow.job.WorkflowJob'>
10        <name>deploy-test2</name>
11        <url>http://127.0.0.1:8080/jenkins/job/deploy-test2/</url>
12        <color>red</color>
13    </job>
14    <job _class='org.jenkinsci.plugins.workflow.job.WorkflowJob'>
15        <name>test-job</name>
16        <url>http://127.0.0.1:8080/jenkins/job/test-job/</url>
17        <color>blue</color>
18    </job>
19    <quietingDown>false</quietingDown>
20    <slaveAgentPort>50000</slaveAgentPort>
21    <unlabeledLoad _class='jenkins.model.UnlabeledLoadStatistics'></unlabeledLoad>
22    <useCrumbs>false</useCrumbs>
23    <useSecurity>true</useSecurity>
24    <view _class='hudson.model.AllView'>
25        <name>all</name>
26        <url>http://127.0.0.1:8080/jenkins/</url>
27    </view>
28</hudson>
  • “JenkinsURL/api/xml” 显示:
 1{
 2    "_class": "hudson.model.Hudson",
 3    "assignedLabels": [
 4        {
 5            "name": "master"
 6        }
 7    ],
 8    "mode": "NORMAL",
 9    "nodeDescription": "Jenkins的master节点",
10    "nodeName": "",
11    "numExecutors": 1,
12    "description": null,
13    "jobs": [
14        {
15            "_class": "org.jenkinsci.plugins.workflow.job.WorkflowJob",
16            "name": "deploy-test2",
17            "url": "http://127.0.0.1:8080/jenkins/job/deploy-test2/",
18            "color": "red"
19        },
20        {
21            "_class": "org.jenkinsci.plugins.workflow.job.WorkflowJob",
22            "name": "test-job",
23            "url": "http://127.0.0.1:8080/jenkins/job/test-job/",
24            "color": "blue"
25        }
26    ],
27    "overallLoad": {},
28    "primaryView": {
29        "_class": "hudson.model.AllView",
30        "name": "all",
31        "url": "http://127.0.0.1:8080/jenkins/"
32    },
33    "quietingDown": false,
34    "slaveAgentPort": 50000,
35    "unlabeledLoad": {
36        "_class": "jenkins.model.UnlabeledLoadStatistics"
37    },
38    "useCrumbs": false,
39    "useSecurity": true,
40    "views": [
41        {
42            "_class": "hudson.model.AllView",
43            "name": "all",
44            "url": "http://192.168.2.11:8080/jenkins/"
45        }
46    ]
47}

还可以访问 View、Job等 API 信息,例如:

  • View API: /view/<view-name>/api/json
  • Job API: /job/<job-name>/api/xml
  • build API: /job/<job-name>/<build-number>/

二、调用接口前对 Jenkins 参数调整

1、关闭 CSRF

由于在调用 Jenkins 中,操作执行 Job 一些命令时会用到 Post 方式命令,所以需要关闭 Jenkins 的 CSRF 选项。

关闭 系统管理->全局安全配置->跨站请求伪造保护 选项

2、系统设置中和 jenkins 地址一致

设置 系统管理->系统设置->Jenkins Location 的 URL 和 Jenkins 访问地址保持一致

三、使用 Java 调用 Jenkins API 示例

下面将演示如何通过 Java 调用 Jenkins API 来对 Jenkins 进行操作,在注释中有详细描述,就不在外面一步步说明了。

本示例项目 Github 地址:https://github.com/my-dlq/blog-example/tree/master/jenkins-api-demo

1、Maven 引入工具

在 Jenkins Github 中查找到已经有人做了封装调用 Jenkins API 的工具 Jar,这里只需要我们 Maven 中引入这个工具 java-client-api,就可以方便的调用 Jenkins API 了。

 1<?xml version="1.0" encoding="UTF-8"?>
 2<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 4    <modelVersion>4.0.0</modelVersion>
 5
 6    <groupId>club.mydlq</groupId>
 7    <artifactId>jenkins-api-demo</artifactId>
 8    <version>0.0.1</version>
 9    <name>jenkins-api-demo</name>
10    <description>jenkins api demo</description>
11
12    <properties>
13        <java.version>1.8</java.version>
14    </properties>
15
16    <dependencies>
17        <!--jenkins-java-client-->
18        <dependency>
19            <groupId>com.offbytwo.jenkins</groupId>
20            <artifactId>jenkins-client</artifactId>
21            <version>0.3.8</version>
22        </dependency>
23    </dependencies>
24
25</project>

2、连接 Jenkins 工具类

此类主要用于连接 Jenkins

JenkinsConnect.java

 1import com.offbytwo.jenkins.JenkinsServer;
 2import com.offbytwo.jenkins.client.JenkinsHttpClient;
 3import java.net.URI;
 4import java.net.URISyntaxException;
 5
 6/**
 7 * 连接 Jenkins
 8 */
 9public class JenkinsConnect {
10
11    private JenkinsConnect(){}
12
13    // 连接 Jenkins 需要设置的信息
14    static final String JENKINS_URL = "http://192.168.2.11:8080/jenkins/";
15    static final String JENKINS_USERNAME = "admin";
16    static final String JENKINS_PASSWORD = "123456";
17
18    /**
19     * Http 客户端工具
20     *
21     * 如果有些 API 该Jar工具包未提供,可以用此Http客户端操作远程接口,执行命令
22     * @return
23     */
24    public static JenkinsHttpClient getClient(){
25        JenkinsHttpClient jenkinsHttpClient = null;
26        try {
27            jenkinsHttpClient = new JenkinsHttpClient(new URI(JENKINS_URL), JENKINS_USERNAME, JENKINS_PASSWORD);
28        } catch (URISyntaxException e) {
29            e.printStackTrace();
30        }
31        return jenkinsHttpClient;
32    }
33
34    /**
35     * 连接 Jenkins
36     */
37    public static JenkinsServer connection() {
38        JenkinsServer jenkinsServer = null;
39        try {
40            jenkinsServer = new JenkinsServer(new URI(JENKINS_URL), JENKINS_USERNAME, JENKINS_PASSWORD);
41        } catch (URISyntaxException e) {
42            e.printStackTrace();
43        }
44        return jenkinsServer;
45    }
46}

3、操作视图

此类主要用于操作 Jenkins 中的 View

ViewApi.java

  1import com.offbytwo.jenkins.JenkinsServer;
  2import com.offbytwo.jenkins.client.JenkinsHttpClient;
  3import com.offbytwo.jenkins.model.View;
  4import java.io.IOException;
  5
  6/**
  7 * View(视图) 相关操作
  8 *
  9 * 例如对视图的增、删、改、查等操作
 10 */
 11public class ViewApi {
 12
 13    // Jenkins 对象
 14    private JenkinsServer jenkinsServer;
 15    // http 客户端对象
 16    private JenkinsHttpClient jenkinsHttpClient;
 17
 18    /**
 19     * 构造方法中调用连接 Jenkins 方法
 20     */
 21    ViewApi() {
 22        JenkinsApi jenkinsApi = new JenkinsApi();
 23        // 连接 Jenkins
 24        jenkinsServer = JenkinsConnect.connection();
 25        // 设置客户端连接 Jenkins
 26        jenkinsHttpClient = JenkinsConnect.getClient();
 27    }
 28
 29    /**
 30     * 创建视图
 31     */
 32    public void createView() {
 33        try {
 34            // 创建一个 xml 字符串,里面设置一个 view 描述信息
 35            String xml = "<listView _class=\"hudson.model.ListView\">\n" +
 36                    "<description>用于测试的视图</description>\n" +
 37                    "</listView>";
 38            // 创建 view
 39            jenkinsServer.createView("test-view", xml);
 40        } catch (IOException e) {
 41            e.printStackTrace();
 42        }
 43    }
 44
 45    /**
 46     * 获取视图基本信息
 47     */
 48    public void getView() {
 49        try {
 50            // 视图名
 51            String viewName = "test-view";
 52            // 获取视图基本信息
 53            View view = jenkinsServer.getView(viewName);
 54            System.out.println(view.getName());
 55            System.out.println(view.getUrl());
 56            System.out.println(view.getDescription());
 57            // 获取视图xml信息
 58            String viewXml = jenkinsHttpClient.get("/view/" + viewName + "/api/xml");
 59            System.out.println(viewXml);
 60        } catch (IOException e) {
 61            e.printStackTrace();
 62        }
 63    }
 64
 65    /**
 66     * 获取视图配置 XML 信息
 67     */
 68    public void getViewConfig() {
 69        try {
 70            // 视图名
 71            String viewName = "test-view";
 72            // 获取视图配置xml信息
 73            String viewConfigXml = jenkinsHttpClient.get("/view/" + viewName + "/config.xml");
 74            System.out.println(viewConfigXml);
 75        } catch (IOException e) {
 76            e.printStackTrace();
 77        }
 78    }
 79
 80    /**
 81     * 更新视图信息
 82     */
 83    public void updateView() {
 84        try {
 85            // 创建一个 xml 字符串,里面设置一个要修改的某些字段,具体xml可以到jenkins查看
 86            // 例如,下面xml文件是从地址:https://Jenkins-IP/jenkins/view/test-view/config.xml 获取的
 87            String xml = "<hudson.model.ListView>\n" +
 88                    "<name>test-view</name>\n" +
 89                    "<description>用于测试的视图1111</description>\n" +
 90                    "<filterExecutors>false</filterExecutors>\n" +
 91                    "<filterQueue>false</filterQueue>\n" +
 92                    "<properties class=\"hudson.model.View$PropertyList\"/>\n" +
 93                    "<jobNames>\n" +
 94                    "<comparator class=\"hudson.util.CaseInsensitiveComparator\"/>\n" +
 95                    "</jobNames>\n" +
 96                    "<jobFilters/>\n" +
 97                    "<columns>\n" +
 98                    "<hudson.views.StatusColumn/>\n" +
 99                    "<hudson.views.WeatherColumn/>\n" +
100                    "<hudson.views.JobColumn/>\n" +
101                    "<hudson.views.LastSuccessColumn/>\n" +
102                    "<hudson.views.LastFailureColumn/>\n" +
103                    "<hudson.views.LastDurationColumn/>\n" +
104                    "<hudson.views.BuildButtonColumn/>\n" +
105                    "<hudson.plugins.favorite.column.FavoriteColumn plugin=\"favorite@2.3.2\"/>\n" +
106                    "</columns>\n" +
107                    "<recurse>false</recurse>\n" +
108                    "</hudson.model.ListView>";
109            jenkinsServer.updateView("test-view", xml);
110        } catch (IOException e) {
111            e.printStackTrace();
112        }
113    }
114
115    /**
116     * 删除视图
117     */
118    public void deleteView() {
119        try {
120            String viewName = "test-view";
121            jenkinsHttpClient.post("/view/" + viewName + "/doDelete");
122        } catch (IOException e) {
123            e.printStackTrace();
124        }
125    }
126
127
128    public static void main(String[] args) {
129        ViewApi viewApi = new ViewApi();
130        // 创建视图
131        //viewApi.createView();
132        // 获取视图信息
133        //viewApi.getView();
134        // 获取视图配置xml信息
135        //viewApi.getViewConfig();
136        // 更新视图信息
137        //viewApi.updateView();
138        // 删除视图
139        //viewApi.deleteView();
140    }
141}

4、操作任务

此类主要用于操作 Jenkins 中的 Job

JobApi.java

  1import com.offbytwo.jenkins.JenkinsServer;
  2import com.offbytwo.jenkins.client.JenkinsHttpClient;
  3import com.offbytwo.jenkins.model.Build;
  4import com.offbytwo.jenkins.model.Job;
  5import com.offbytwo.jenkins.model.JobWithDetails;
  6import com.offbytwo.jenkins.model.MavenJobWithDetails;
  7import java.io.IOException;
  8import java.util.HashMap;
  9import java.util.Map;
 10
 11/**
 12 * Job(任务) 相关操作
 13 *
 14 * 例如对任务的增、删、改、查等操作
 15 */
 16public class JobApi {
 17
 18    // Jenkins 对象
 19    private JenkinsServer jenkinsServer;
 20    // http 客户端对象
 21    private JenkinsHttpClient jenkinsHttpClient;
 22
 23    /**
 24     * 构造方法中调用连接 Jenkins 方法
 25     */
 26    JobApi() {
 27        JenkinsApi jenkinsApi = new JenkinsApi();
 28        // 连接 Jenkins
 29        jenkinsServer = JenkinsConnect.connection();
 30        // 设置客户端连接 Jenkins
 31        jenkinsHttpClient = JenkinsConnect.getClient();
 32    }
 33
 34    /**
 35     * 创建 Job
 36     */
 37    public void ceateJob(){
 38        try {
 39            /**创建一个流水线任务,且设置一个简单的脚本**/
 40            // 创建 Pipeline 脚本
 41            String script = "node(){ \n" +
 42                                "echo 'hello world!' \n" +
 43                            "}";
 44            // xml配置文件,且将脚本加入到配置中
 45            String xml = "<flow-definition plugin=\"workflow-job@2.32\">\n" +
 46                             "<description>测试项目</description>\n" +
 47                             "<definition class=\"org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition\" plugin=\"workflow-cps@2.66\">\n" +
 48                                 "<script>" + script + "</script>\n" +
 49                                 "<sandbox>true</sandbox>\n" +
 50                             "</definition>\n" +
 51                          "</flow-definition>";
 52            // 创建 Job
 53            jenkinsServer.createJob("test-job",xml);
 54        } catch (IOException e) {
 55            e.printStackTrace();
 56        }
 57    }
 58
 59    /**
 60     * 更新 Job
 61     *
 62     * 更改之前创建的无参数Job,更改其为参数Job
 63     */
 64    public void updateJob(){
 65        try {
 66            /**
 67             * 更改一个流水线任务,让一个无参数的任务变成带参数任务
 68             */
 69            // 创建 Pipeline 脚本,用一个key变量
 70            String script = "node(){ \n" +
 71                    "echo \"${key}\" \n" +
 72                    "}";
 73            // xml配置文件,且将脚本加入到配置中
 74            String xml = "<flow-definition plugin=\"workflow-job@2.32\">\n" +
 75                    "<actions/>\n" +
 76                    "<description>测试项目</description>\n" +
 77                    "<keepDependencies>false</keepDependencies>\n" +
 78                    "<properties>\n" +
 79                    "<hudson.model.ParametersDefinitionProperty>\n" +
 80                    "<parameterDefinitions>\n" +
 81                    "<hudson.model.StringParameterDefinition>\n" +
 82                    "<name>key</name>\n" +
 83                    "<description>用于测试的字符变量</description>\n" +
 84                    "<defaultValue>hello</defaultValue>\n" +
 85                    "<trim>false</trim>\n" +
 86                    "</hudson.model.StringParameterDefinition>\n" +
 87                    "</parameterDefinitions>\n" +
 88                    "</hudson.model.ParametersDefinitionProperty>\n" +
 89                    "</properties>\n" +
 90                    "<definition class=\"org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition\" plugin=\"workflow-cps@2.66\">\n" +
 91                    "<script>" + script + "</script>\n" +
 92                    "<sandbox>true</sandbox>\n" +
 93                    "</definition>\n" +
 94                    "<disabled>false</disabled>\n" +
 95                    "</flow-definition>";
 96            // 创建 Job
 97            jenkinsServer.updateJob("test-job",xml);
 98        } catch (IOException e) {
 99            e.printStackTrace();
100        }
101    }
102
103    /**
104     * 获取 Job 基本信息
105     */
106    public void getJob(){
107        try {
108            // 获取 Job 信息
109            JobWithDetails job = jenkinsServer.getJob("test-job");
110            // 获取 Job 名称
111            System.out.println(job.getName());
112            // 获取 Job URL
113            System.out.println(job.getUrl());
114            // 获取 Job 下一个 build 编号
115            System.out.println(job.getNextBuildNumber());
116            // 获取 Job 显示的名称
117            System.out.println(job.getDisplayName());
118            // 输出 Job 描述信息
119            System.out.println(job.getDescription());
120            // 获取 Job 下游任务列表
121            System.out.println(job.getDownstreamProjects());
122            // 获取 Job 上游任务列表
123            System.out.println(job.getUpstreamProjects());
124        } catch (IOException e) {
125            e.printStackTrace();
126        }
127    }
128
129    /**
130     * 获取 Maven Job 信息
131     */
132    public void getMavenJob(){
133        try {
134            // 获取 Job 信息
135            MavenJobWithDetails job = jenkinsServer.getMavenJob("test-job");
136        } catch (IOException e) {
137            e.printStackTrace();
138        }
139    }
140
141    /**
142     * 获取 Job 列表
143     */
144    public void getJobList(){
145        try {
146            // 获取 Job 列表
147            Map<String,Job> jobs = jenkinsServer.getJobs();
148            for (Job job:jobs.values()){
149                System.out.println(job.getName());
150            }
151        } catch (IOException e) {
152            e.printStackTrace();
153        }
154    }
155
156    /**
157     * 获取 View 名称获取 Job 列表
158     */
159    public void getJobListByView(){
160        try {
161            // 获取 Job 列表
162            Map<String,Job> jobs = jenkinsServer.getJobs("all");
163            for (Job job:jobs.values()){
164                System.out.println(job.getName());
165            }
166        } catch (IOException e) {
167            e.printStackTrace();
168        }
169    }
170
171    /**
172     * 查看 Job XML 信息
173     */
174    public void getJobConfig(){
175        try {
176            String xml = jenkinsServer.getJobXml("test-job");
177            System.out.println(xml);
178        } catch (IOException e) {
179            e.printStackTrace();
180        }
181    }
182
183    /**
184     * 执行无参数 Job build
185     */
186    public void buildJob(){
187        try {
188            jenkinsServer.getJob("test-job").build();
189        } catch (IOException e) {
190            e.printStackTrace();
191        }
192    }
193
194    /**
195     * 执行带参数 Job build
196     */
197    public void buildParamJob(){
198        try {
199            /**
200             * 例如,现有一个job,拥有一个字符参数"key"
201             * 现在对这个值进行设置,然后执行一个输出这个值的脚本
202             */
203            // 设置参数值
204            Map<String,String> param = new HashMap<>();
205            param.put("key","hello world!");
206            // 执行 build 任务
207            jenkinsServer.getJob("test-job").build(param);
208        } catch (IOException e) {
209            e.printStackTrace();
210        }
211    }
212
213    /**
214     * 停止最后构建的 Job Build
215     */
216    public void stopLastJobBuild(){
217        try {
218            // 获取最后的 build 信息
219            Build build = jenkinsServer.getJob("test-job").getLastBuild();
220            // 停止最后的 build
221            build.Stop();
222        } catch (IOException e) {
223            e.printStackTrace();
224        }
225    }
226
227    /**
228     * 删除 Job
229     */
230    public void deleteJob(){
231        try {
232            jenkinsServer.deleteJob("test-job");
233        } catch (IOException e) {
234            e.printStackTrace();
235        }
236    }
237
238    /**
239     * 禁用 Job
240     */
241    public void disableJob(){
242        try {
243            jenkinsServer.disableJob("test-job");
244        } catch (IOException e) {
245            e.printStackTrace();
246        }
247    }
248
249    /**
250     * 启用 Job
251     */
252    public void enableJob(){
253        try {
254            jenkinsServer.enableJob("test-job");
255        } catch (IOException e) {
256            e.printStackTrace();
257        }
258    }
259
260    public static void main(String[] args) {
261        JobApi jobApi = new JobApi();
262        // 创建 Job
263        jobApi.ceateJob();
264        // 构建无参数的 Job
265        jobApi.buildJob();
266        // 构建带参数的 Job
267        jobApi.buildParamJob();
268        // 停止最后构建的 Job Build
269        jobApi.stopLastJobBuild();
270        // 更新 Job
271        jobApi.updateJob();
272        // 获取 Job 信息
273        jobApi.getJob();
274        // 获取 Maven 项目 Job
275        jobApi.getMavenJob();
276        // 获取 Job 配置xml
277        jobApi.getJobConfig();
278        // 获取全部 Job 列表
279        jobApi.getJobList();
280        // 根据 view 名称获取 Job 列表
281        jobApi.getJobListByView();
282        // 禁用 Job
283        jobApi.disableJob();
284        // 启用 Job
285        jobApi.enableJob();
286        // 删除 Job
287        jobApi.deleteJob();
288    }
289
290}

5、操作编译

此类主要用于操作 Jenkins 中的 Build

JobBuildApi.java

  1import com.offbytwo.jenkins.JenkinsServer;
  2import com.offbytwo.jenkins.client.JenkinsHttpClient;
  3import com.offbytwo.jenkins.helper.Range;
  4import com.offbytwo.jenkins.model.*;
  5import java.io.IOException;
  6import java.util.List;
  7
  8/**
  9 * Job Build(任务构建) 相关操作
 10 *
 11 * 例如对任务 Build 相关的信息进行获取操作、例如获取构建日志
 12 */
 13public class JobBuildApi {
 14
 15    // Jenkins 对象
 16    private JenkinsServer jenkinsServer;
 17    // http 客户端对象
 18    private JenkinsHttpClient jenkinsHttpClient;
 19
 20    /**
 21     * 构造方法中调用连接 Jenkins 方法
 22     */
 23    JobBuildApi() {
 24        JenkinsApi jenkinsApi = new JenkinsApi();
 25        // 连接 Jenkins
 26        jenkinsServer = JenkinsConnect.connection();
 27        // 设置客户端连接 Jenkins
 28        jenkinsHttpClient = JenkinsConnect.getClient();
 29    }
 30
 31    /**
 32     * 获取 Job 最后的 Build
 33     */
 34    public void getJobLastBuild(){
 35        try {
 36            // 获取 Job 信息
 37            JobWithDetails job = jenkinsServer.getJob("test-job");
 38            // 获得最后编译信息
 39            Build lastBuild = job.getLastBuild();
 40            // 获取最后成功的编译信息
 41            Build lastSuccessfulBuild = job.getLastSuccessfulBuild();
 42            // 获取最后事变的编译信息
 43            Build lastFailedBuild = job.getLastFailedBuild();
 44            // 获取最后完成的编译信息
 45            Build lastCompletedBuild = job.getLastCompletedBuild();
 46            // 获取最后稳定的编译信息
 47            Build lastStableBuild = job.getLastStableBuild();
 48            // 获取最后不稳定的编译信息
 49            Build lastUnstableBuild = job.getLastUnstableBuild();
 50            // 获取最后未成功的编译信息
 51            Build lastUnsuccessfulBuild = job.getLastUnsuccessfulBuild();
 52        } catch (IOException e) {
 53            e.printStackTrace();
 54        }
 55    }
 56
 57    /**
 58     * 获取 Job 首次 Build
 59     */
 60    public void getJobFirstBuild(){
 61        try {
 62            // 获取 Job 信息
 63            JobWithDetails job = jenkinsServer.getJob("test-job");
 64            // 获得首次编译信息
 65            Build firstBuild = job.getFirstBuild();
 66        } catch (IOException e) {
 67            e.printStackTrace();
 68        }
 69    }
 70
 71    /**
 72     * 根据 Job Build 编号获取编译信息
 73     */
 74    public void getJobByNumber(){
 75        try {
 76            // 获取 Job 信息
 77            JobWithDetails job = jenkinsServer.getJob("test-job");
 78            // 根据
 79            Build numberBuild = job.getBuildByNumber(1);
 80        } catch (IOException e) {
 81            e.printStackTrace();
 82        }
 83    }
 84
 85    /**
 86     * 获取全部 Job Build列表
 87     */
 88    public void getJobBuildListAll(){
 89        try {
 90            // 获取 Job 信息
 91            JobWithDetails job = jenkinsServer.getJob("test-job");
 92            // 获取全部 Build 信息
 93            List<Build> builds = job.getAllBuilds();
 94            for (Build build:builds){
 95                System.out.println(build.getNumber());
 96            }
 97        } catch (IOException e) {
 98            e.printStackTrace();
 99        }
100    }
101
102    /**
103     * 获取 Job 一定范围的 Build 列表
104     */
105    public void getJobBuildListRange(){
106        try {
107            // 获取 Job 信息
108            JobWithDetails job = jenkinsServer.getJob("test-job");
109            // 设定范围
110            Range range = Range.build().from(1).to(2);
111            System.err.println(range.getRangeString());
112            // 获取一定范围的 Build 信息
113            List<Build> builds = job.getAllBuilds(range);
114            for (Build build:builds){
115                System.out.println(build.getNumber());
116            }
117        } catch (IOException e) {
118            e.printStackTrace();
119        }
120    }
121
122    /**
123     * 获取 Build 基本信息
124     */
125    public void getJobBuildInfo(){
126        try {
127            // 获取 Job 信息
128            JobWithDetails job = jenkinsServer.getJob("test-job");
129            // 这里用最后一次编译来示例
130            Build build = job.getLastBuild();
131            // 获取构建的 URL 地址
132            System.out.println(build.getUrl());
133            // 获取构建编号
134            System.out.println(build.getNumber());
135            // 获取测试报告
136            //build.getTestReport();
137            // 获取测试结果
138            //build.getTestResult();
139        } catch (IOException e) {
140            e.printStackTrace();
141        }
142    }
143
144    /**
145     * 获取 Build 详细信息
146     */
147    public void getJobBuildDetailInfo(){
148        try {
149            // 获取 Job 信息
150            JobWithDetails job = jenkinsServer.getJob("test-job");
151            // 这里用最后一次编译来示例
152            BuildWithDetails build = job.getLastBuild().details();
153            // 获取构建的显示名称
154            System.out.println(build.getDisplayName());
155            // 获取构建的参数信息
156            System.out.println(build.getParameters());
157            // 获取构建编号
158            System.out.println(build.getNumber());
159            // 获取构建结果,如果构建未完成则会显示为null
160            System.out.println(build.getResult());
161            // 获取执行构建的活动信息
162            System.out.println(build.getActions());
163            // 获取构建持续多少时间(ms)
164            System.out.println(build.getDuration());
165            // 获取构建开始时间戳
166            System.out.println(build.getTimestamp());
167            // 获取构建头信息,里面包含构建的用户,上游信息,时间戳等
168            List<BuildCause> buildCauses = build.getCauses();
169            for (BuildCause bc:buildCauses){
170                System.out.println(bc.getUserId());
171                System.out.println(bc.getShortDescription());
172                System.out.println(bc.getUpstreamBuild());
173                System.out.println(bc.getUpstreamProject());
174                System.out.println(bc.getUpstreamUrl());
175                System.out.println(bc.getUserName());
176            }
177        } catch (IOException e) {
178            e.printStackTrace();
179        }
180    }
181
182    /**
183     * 获取 Build Log 日志信息
184     */
185    public void getJobBuildLog(){
186        try {
187            // 获取 Job 信息
188            JobWithDetails job = jenkinsServer.getJob("test-job");
189            // 这里用最后一次编译来示例
190            BuildWithDetails build = job.getLastBuild().details();
191            // 获取构建的日志,如果正在执行构建,则会只获取已经执行的过程日志
192
193            // Text格式日志
194            System.out.println(build.getConsoleOutputText());
195            // Html格式日志
196            System.out.println(build.getConsoleOutputHtml());
197
198            // 获取部分日志,一般用于正在执行构建的任务
199            ConsoleLog consoleLog = build.getConsoleOutputText(0);
200            // 获取当前日志大小
201            System.out.println(consoleLog.getCurrentBufferSize());
202            // 是否已经构建完成,还有更多日志信息
203            System.out.println(consoleLog.getHasMoreData());
204            // 获取当前截取的日志信息
205            System.out.println(consoleLog.getConsoleLog());
206        }catch (IOException e) {
207            e.printStackTrace();
208        }
209    }
210
211    /**
212     * 获取正在执行构建任务的日志信息
213     */
214    public void getBuildActiveLog(){
215        try {
216            // 这里用最后一次编译来示例
217            BuildWithDetails build = jenkinsServer.getJob("test-job").getLastBuild().details();
218            // 当前日志
219            ConsoleLog currentLog = build.getConsoleOutputText(0);
220            // 输出当前获取日志信息
221            System.out.println(currentLog.getConsoleLog());
222            // 检测是否还有更多日志,如果是则继续循环获取
223            while (currentLog.getHasMoreData()){
224                // 获取最新日志信息
225                ConsoleLog newLog = build.getConsoleOutputText(currentLog.getCurrentBufferSize());
226                // 输出最新日志
227                System.out.println(newLog.getConsoleLog());
228                currentLog = newLog;
229                // 睡眠1s
230                Thread.sleep(1000);
231            }
232        }catch (IOException | InterruptedException e) {
233            e.printStackTrace();
234        }
235    }
236
237    public static void main(String[] args) {
238        JobBuildApi jobBuildApi = new JobBuildApi();
239        // 获取 Job 最后的 Build
240        jobBuildApi.getJobLastBuild();
241        // 获取 Job 首次 Build
242        jobBuildApi.getJobFirstBuild();
243        // 根据 Job Build 编号获取编译信息
244        jobBuildApi.getJobByNumber();
245        // 获取 Build 全部列表
246        jobBuildApi.getJobBuildListAll();
247        // 获取一定范围的 Build 列表
248        jobBuildApi.getJobBuildListRange();
249        // 获取 Build 基本信息
250        jobBuildApi.getJobBuildInfo();
251        // 获取 Build 详细信息
252        jobBuildApi.getJobBuildDetailInfo();
253        // 获取 Build Log 日志信息
254        jobBuildApi.getJobBuildLog();
255        // 获得正在执行的编译 Log 日志信息
256        jobBuildApi.getBuildActiveLog();
257    }
258}

6、其它 Jenkins 相关操作

此类主要用于操作 Jenkins 中的基本信息,例如关闭 Jenkins、获取 Jenkins 插件信息等。

JenkinsApi.java

  1import java.io.IOException;
  2import com.offbytwo.jenkins.JenkinsServer;
  3import com.offbytwo.jenkins.model.*;
  4import java.util.List;
  5import java.util.Map;
  6
  7/**
  8 * 获取 Jenkins 相关信息
  9 *
 10 * 例如获取插件信息、获取Label信息、关闭Jenkins等
 11 */
 12public class JenkinsApi {
 13
 14    // Jenkins 对象
 15    private JenkinsServer jenkinsServer;
 16
 17    /**
 18     * 构造方法中调用连接 Jenkins 方法
 19     */
 20    JenkinsApi(){
 21        jenkinsServer = JenkinsConnect.connection();
 22    }
 23
 24    /**
 25     * 获取主机信息
 26     */
 27    public void getComputerInfo() {
 28        try {
 29            Map<String, Computer> map = jenkinsServer.getComputers();
 30            for (Computer computer : map.values()) {
 31                // 获取当前节点-节点名称
 32                System.out.println(computer.details().getDisplayName());
 33                // 获取当前节点-执行者数量
 34                System.out.println(computer.details().getNumExecutors());
 35                // 获取当前节点-执行者详细信息
 36                List<Executor> executorList = computer.details().getExecutors();
 37                // 查看当前节点-是否脱机
 38                System.out.println(computer.details().getOffline());
 39                // 获得节点的全部统计信息
 40                LoadStatistics loadStatistics = computer.details().getLoadStatistics();
 41                // 获取节点的-监控数据
 42                Map<String, Map> monitorData = computer.details().getMonitorData();
 43                //......
 44            }
 45        } catch (IOException e) {
 46            e.printStackTrace();
 47        }
 48    }
 49
 50    /**
 51     * 重启 Jenkins
 52     */
 53    public void restart() {
 54        try {
 55            jenkinsServer.restart(true);
 56        } catch (IOException e) {
 57            e.printStackTrace();
 58        }
 59    }
 60
 61    /**
 62     * 安全重启 Jenkins
 63     */
 64    public void safeRestart() {
 65        try {
 66            jenkinsServer.safeRestart(true);
 67        } catch (IOException e) {
 68            e.printStackTrace();
 69        }
 70    }
 71
 72    /**
 73     * 安全结束 Jenkins
 74     */
 75    public void safeExit() {
 76        try {
 77            jenkinsServer.safeExit(true);
 78        } catch (IOException e) {
 79            e.printStackTrace();
 80        }
 81    }
 82
 83    /**
 84     * 关闭 Jenkins 连接
 85     */
 86    public void close() {
 87        jenkinsServer.close();
 88    }
 89
 90    /**
 91     * 根据 Label 查找代理节点信息
 92     */
 93    public void getLabelNodeInfo() {
 94        try {
 95            LabelWithDetails labelWithDetails = jenkinsServer.getLabel("jnlp-agent");
 96            // 获取标签名称
 97            System.out.println(labelWithDetails.getName());
 98            // 获取 Cloud 信息
 99            System.out.println(labelWithDetails.getClouds());
100            // 获取节点信息
101            System.out.println(labelWithDetails.getNodeName());
102            // 获取关联的 Job
103            System.out.println(labelWithDetails.getTiedJobs());
104            // 获取参数列表
105            System.out.println(labelWithDetails.getPropertiesList());
106            // 是否脱机
107            System.out.println(labelWithDetails.getOffline());
108            // 获取描述信息
109            System.out.println(labelWithDetails.getDescription());
110        } catch (IOException e) {
111            e.printStackTrace();
112        }
113    }
114
115    /**
116     * 判断 Jenkins 是否运行
117     */
118    public void isRunning() {
119        boolean isRunning = jenkinsServer.isRunning();
120        System.out.println(isRunning);
121    }
122
123    /**
124     * 获取 Jenkins 插件信息
125     */
126    public void getPluginInfo(){
127        try {
128            PluginManager pluginManager =jenkinsServer.getPluginManager();
129            // 获取插件列表
130            List<Plugin> plugins = pluginManager.getPlugins();
131            for (Plugin plugin:plugins){
132                // 插件 wiki URL 地址
133                System.out.println(plugin.getUrl());
134                // 版本号
135                System.out.println(plugin.getVersion());
136                // 简称
137                System.out.println(plugin.getShortName());
138                // 完整名称
139                System.out.println(plugin.getLongName());
140                // 是否支持动态加载
141                System.out.println(plugin.getSupportsDynamicLoad());
142                // 插件依赖的组件
143                System.out.println(plugin.getDependencies());
144            }
145        } catch (IOException e) {
146            e.printStackTrace();
147        }
148    }
149
150    public static void main(String[] args) {
151        // 创建 JenkinsApi 对象,并在构造方法中连接 Jenkins
152        JenkinsApi jenkinsApi = new JenkinsApi();
153        // 重启 Jenkins
154        //jenkinsApi.restart();
155        // 安全重启 Jenkins
156        //jenkinsApi.safeRestart();
157        // 获取节点信息
158        //jenkinsApi.getComputerInfo();
159        // 安全结束 Jenkins
160        //jenkinsApi.safeExit();
161        // 关闭 Jenkins 连接
162        //jenkinsApi.close();
163        // 获取 Label 节点信息
164        //jenkinsApi.getLabelNodeInfo();
165        // 查看 Jenkins 是否允许
166        //jenkinsApi.isRunning();
167        // 获取 Jenkins 插件信息
168        //jenkinsApi.getPluginInfo();
169    }
170
171}

四、对 Java Client 组件的补充

关于该 Jenkins Java Client 部分功能封装并不完整,这里有部分网友咨询相关问题,补充一下:

 1import com.offbytwo.jenkins.JenkinsServer;
 2import com.offbytwo.jenkins.client.JenkinsHttpClient;
 3import com.offbytwo.jenkins.client.util.EncodingUtils;
 4import java.io.IOException;
 5
 6public class CustomService {
 7
 8    // Jenkins 对象
 9    private JenkinsServer jenkinsServer;
10    // http 客户端对象
11    private JenkinsHttpClient jenkinsHttpClient;
12
13    /**
14     * 构造方法中调用连接 Jenkins 方法
15     */
16    CustomService() {
17        // 连接 Jenkins
18        jenkinsServer = JenkinsConnect.connection();
19        // 设置客户端连接 Jenkins
20        jenkinsHttpClient = JenkinsConnect.getClient();
21    }
22
23    /**
24     * 创建 Jenkins Job 并指定 Job 类型
25     * 关于 Jenkins Job 部分类型,如下:
26     *   - 自由风格项目:hudson.model.FreeStyleProject
27     *   - Maven 项目:hudson.maven.MavenModuleSet
28     *   - 流水线项目:org.jenkinsci.plugins.workflow.job.WorkflowJob
29     *   - 多配置项目:hudson.matrix.MatrixProject
30     */
31    public void createJob() {
32        try {
33            // job 名称
34            String jobName = "test-project";
35            // 创建 Job 的 xml,可以在 jenkins 中查看,例如 http://jenkins.mydlq.club/job/{job名称}/config.xml 来查看该 job 的 xml 配置
36            String jobXml = "<project>\n" +
37                    "<keepDependencies>false</keepDependencies>\n" +
38                    "<properties/>\n" +
39                    "<scm class=\"hudson.scm.NullSCM\"/>\n" +
40                    "<canRoam>false</canRoam>\n" +
41                    "<disabled>false</disabled>\n" +
42                    "<blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>\n" +
43                    "<blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>\n" +
44                    "<triggers/>\n" +
45                    "<concurrentBuild>false</concurrentBuild>\n" +
46                    "<builders/>\n" +
47                    "<publishers/>\n" +
48                    "<buildWrappers/>\n" +
49                    "<link type=\"text/css\" id=\"dark-mode\" rel=\"stylesheet\" href=\"\"/>\n" +
50                    "</project>";
51            // 创建 Jenkins Job 并指定 Job 类型
52            jenkinsHttpClient.post_xml("createItem?name=" + EncodingUtils.encodeParam(jobName) +
53                    "&mode=hudson.model.FreeStyleProject", jobXml, true);
54        } catch (IOException e) {
55            e.printStackTrace();
56        }
57    }
58
59    public static void main(String[] args) {
60        // 自定义服务
61        CustomService customService = new CustomService();
62        // 创建指定类型的 Job
63        customService.createJob();
64    }
65
66}

---END---


  !版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。