一、Jenkins Rest API简单介绍
在githup上,jenkins-rest项目地址:链接地址,接口定义和接口测试代码都可以详细看到。 但在使用过程中遇到了问题让我纠结了很久。 看下使用REST API前置条件:
需要运行着的jenkins环境
需要一个管理员权限的账号
CSRF功能需要关闭掉,不然会影响POST接口的请求(我在这个上面纠结了很久,我使用的版本是Jenkins2.263.4,高于2.0版本的jenkins页面上已经不提供直接关闭CSRF的勾选按钮功能,网上搜索到的很多都是通过勾选按钮关闭CSRF功能,而新版本的JENKINS已经不支持这种方式—起初,我是不想关闭CSRF,但是解决不了API POST请求接口返回403forbiden问题,然后网上看到了一种,将获取到的crumb设置到header中,通过通过httpclient方式URL请求Jenkins API,这种方式我没能成功,最终放弃了,代码编写起来也很麻烦,跟API调用方法传入参数的方式比较起来的话) 4、插件的要求我感觉我没用到。
二、使用步骤
1.关闭CSRF保护
编辑jenkins配置文件
vim /etc/sysconfig/jenkins
AI写代码
java
运行
1
在默认配置文件JENKINS_JAVA_OPTIONS里面加入取消相关保护的参数配置,即可关闭CSRF,配置内容如下:
-Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true
AI写代码
java
运行
1
修改后如下:
重启jenkins即可生效
systemctl restart jenkins.service
AI写代码
java
运行
1
登录jenkins,Dashboard->Configure Global Security,跨站请求伪造保护会有提示,即可只修改已经生效了
2.引入jenkins-rest.jar包
我新建了个maven项目用来测试API,pom.xml引入了jenkins-rest包,由githup可知,最新的版本0.0.28,使用20-28版本会出现一个问题,启动api测试代码会报一个类方法未定义的错误,这个是因为com.google.guava包在jenkins-rest包里默认的版本不对,或者使用低版本的jenkins-rest包,但我对比了下看低版本提供的API方法还是少好几个的
log4j:WARN No such property [datePattern] in org.apache.log4j.RollingFileAppender.
Exception in thread “main” java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V
AI写代码
java
运行
1
2
pom.xml配置如下:
com.cdancy
jenkins-rest
0.0.28
com.google.guava
guava
28.1-jre
AI写代码
xml
1
2
3
4
5
6
7
8
9
10
11
3.创建客户端
githup上有示例代码,按照自己jenkins访问地址和账户密码修改下即可。
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”));
AI写代码
java
运行
1
2
3
4
5
6
7
由代码可以看出一共提供了6个API类,分别是
API类 说明
pluginManagerApi 插件API:提供插件操作接口,一共就俩方法,查看和安装插件
crumbIssuerApi 系统哈希值信息(用于防御CSRF攻击)
jobsAPi 任务(项目管理),提供任务的创建、修改、查询、删除等操作,主要使用接口
queueApi 任务队列相关
statisticsApi jenkins统计相关
systemApi jenkins系统信息,如版本
4.jobsApi-任务API
JobsApi jobApi=client.api().jobsApi();
AI写代码
java
运行
1
4.1 jobList-任务一览
/**
* 任务一览
* param 文件夹路径“”,取的是最外层的任务,若要查看任务文件夹中的任务,入参则为文件名名称
/
JobList jobList=jobApi.jobList(“”);
for(int i=0;i<jobList.jobs().size();i++){
log.info(jobList.jobs().get(i));
}
AI写代码
java
运行
1
2
3
4
5
6
7
8
4.2 jobInfo-具体任务详细信息
/*
* 根据任务名称获取任务信息
* param 文件夹路径null,最外层任务 任务名称“test”
/
JobInfo jobInfo=jobApi.jobInfo(null,”test”);
log.info(“test任务详细信息”+jobInfo);
AI写代码
java
运行
1
2
3
4
5
6
4.3 buildInfo-任务构建的详细信息
/*
* 根据任务名称和任务构建id,获取构建信息
* param 文件夹路径null 任务名称“test” 构建ID 3
/
jobApi.buildInfo(null,”test”,3);
log.info(“test任务第三次构建详细信息:”+jobApi);
AI写代码
java
运行
1
2
3
4
5
6
4.4 create-新建任务
File file=new File(“C:\Users\dwzq\Desktop\config.xml”);
StringBuilder xmlStr=new StringBuilder();
BufferedReader read=null;
read=new BufferedReader(new FileReader(file));
String tempStr;
while((tempStr=read.readLine())!=null){
xmlStr.append(tempStr);
}
read.close();
/*
* 创建job任务
* param 文件夹路径null 新建任务名称“test2” 任务详细配置文件内容:xmlStr
*/
RequestStatus status=jobApi.create(null,”test2”,xmlStr.toString());
log.info(status);
AI写代码
java
运行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
4.5 config-查看任务配置文件内容(两个入参)
/**
* 获取任务配置文件内容
* param 文件夹路径null 任务名称“test2”
/
String testConfig=jobApi.config(null,”test2”);
log.info(“testConfig:”+testConfig);
AI写代码
java
运行
1
2
3
4
5
6
4.6 config-更新任务配置文件内容(三个入参)
/*
* 更新任务的配置文件
* param 文件夹路径null 任务名称“test2” 新的任务配置文件内容xmlStr.toString
/
boolean updateConfig=jobApi.config(null,”test2”,xmlStr.toString());
log.info(“updateConfig result:”+updateConfig);
AI写代码
java
运行
1
2
3
4
5
6
4.7 description-获取任务描述内容(两个入参)
/*
获取任务描述
* param 文件夹路径null 任务名称“test2”
/
String description= jobApi.description(null,”test2”);
log.info(“description:”+description);
AI写代码
java
运行
1
2
3
4
5
6
4.8 description-获取任务描述内容(三个入参)
/
* 更新任务的描述
* param 文件夹路径null 任务名称“tes2” 新的任务描述
/
Boolean updateDescription=jobApi.description(null,”test2”,”this is update test job description”);
log.info(“updateDescription result:”+updateConfig);
AI写代码
java
运行
1
2
3
4
5
6
4.9 delete-删除任务
/*
* 删除任务
* param 文件夹路径null 任务名称
/
RequestStatus deleteResult=jobApi.delete(null,”test2”);
log.info(“deleteResult:”+deleteResult);
AI写代码
java
运行
1
2
3
4
5
6
4.10 enable-启用任务
/*
* 启用任务
* param 文件夹路径null 任务名称“tes2”
/
boolean enableResult=jobApi.enable(null,”test2”);
log.info(“enableResult:”+enableResult);
AI写代码
java
运行
1
2
3
4
5
6
4.11 disable-禁用任务
/*
* 禁用任务
* param 文件夹路径null 任务名称“tes2”
*/
boolean disableResult=jobApi.disable(null,”test2”);
log.info(“disableResult:”+disableResult);
AI写代码
java
运行
4.12 build-构建任务
/**
* 任务构建
* param 文件夹路径null , 任务名“test”
/
IntegerResponse buildJob=jobApi.build(null,”test”);
log.info(“buildJob”+buildJob);
AI写代码
java
运行
1
2
3
4
5
6
4.13 buildWithParameters-带参数构建任务
/*
* 带参数构建任务
* param 文件夹路径null , 任务名“test” 参数
*/
Map<String, List> param=new HashMap();
List list=new ArrayList();
list.add(“staging”);
param.put(“DEPLOY_ENV”,list);
param.put(“myparam”,list);
IntegerResponse buldParam=jobApi.buildWithParameters(null,”test”,param);
log.info(“buildParam:”+buldParam);
AI写代码
java
运行
1
2
3
4
5
6
7
8
9
10
11
4.14 lastBuildNumber-上次任务的构建序号
/**
上次构建的序号
* param 文件夹路径null , 任务名“pipeline-hello-word” 参数
/
Integer lastBuildNumber=jobApi.lastBuildNumber(null,”pipeline-hello-word”);
log.info(“lastBuildNumber:”+lastBuildNumber);
AI写代码
java
运行
1
2
3
4
5
6
4.15 lastBuildTimestamp-上次任务的构建时间戳
/
* 上次任务构建时间
* param 文件夹路径null , 任务名“test”
/
String lastBuildTimetamp=jobApi.lastBuildTimestamp(null,”test”);
log.info(“lastBuildTimestamp:”+lastBuildTimetamp);
AI写代码
java
运行
1
2
3
4
5
6
4.16 progressiveText-任务构建对应的控制台输出内容(3个入参)
/*
* 获取任务构建对应的控制台输出
* param 文件夹路径null 任务名称“test” 0:控制台输出文本开始的位置
/
ProgressiveText progressiveText=jobApi.progressiveText(null,”test”,0);
log.info(“progressText:”+progressiveText);
AI写代码
java
运行
1
2
3
4
5
6
4.17 progressiveText-任务构建对应的控制台输出内容(3个入参)
/*
* 获取任务某个构建次数控制台对应的输出
* param 文件夹路径null 任务名称“test” 构建index:16 0:控制台输出文本开始的位置
/
ProgressiveText progressiveText1=jobApi.progressiveText(null,”test”,16,0);
log.info(“progressText num=16:”+progressiveText1);
AI写代码
java
运行
1
2
3
4
5
6
4.18 rename-任务重命名
/*
* 任务名称重命名
* param 文件夹路径null 任务名称“test” 任务新名词“test2New”
/
boolean renameResult=jobApi.rename(null,”test2”,”test2New”);
log.info(“renameResult:”+renameResult);
AI写代码
java
运行
1
2
3
4
5
6
4.19 workflow-任务某次构建的步骤信息
/*
* 获取任务构建index对应的构建步骤内容
* param 文件夹路径null 任务名称”pipeline-hello-word” 构建index:17
*/
Workflow workFlow=jobApi.workflow(null,”pipeline-hello-word”,17);
log.info(“workFlow:”+workFlow);
AI写代码
java
运行
1
2
3
4
5
6
4.20 pipelineNode-获取pipelineNode信息
这个没和页面具体功能联系起来,不知道具体获取的什么信息
/**
* 获取pipelineNode信息
* param 文件夹路径null 任务名称"pipeline-hello-word" 构建index:17 nodeId:1
*/
PipelineNode pipelineNode=jobApi.pipelineNode(null,"pipeline-hello-word",17,1);
log.info("pipeLineNodeInfo:"+pipelineNode);
AI写代码
java
运行
1
2
3
4
5
6
任务涉及到的接口是这20个,接口涉及到的数据结构的定义可以在githup domain查看
5.systemApi-系统环境API
SystemApi systemApi=client.api().systemApi();
AI写代码
java
运行
1
5.1 systemInfo-查看jenkins系统环境信息
/**
* 查看jenkins系统环境信息
/
SystemInfo systemInfo=systemApi.systemInfo();
log.info(“systemInfo:”+systemInfo);
AI写代码
java
运行
1
2
3
4
5
5.2 quietDown-准备关闭jenkins,对应Prepare for Shutdown功能
/*
* 准备关闭jenkins,对应Prepare for Shutdown功能
/
RequestStatus quietDown=systemApi.quietDown();
log.info(“quietDown:”+quietDown);
AI写代码
java
运行
1
2
3
4
5
5.3 cancelQuietDown-取消准备关闭jenkins
/*
* 取消准备关闭jenkins
/
RequestStatus cancleQuietDown= systemApi.cancelQuietDown();
log.info(“cancelQuietDown:”+cancleQuietDown);
AI写代码
java
运行
1
2
3
4
5
6.pluginManagerApi-插件API
PluginManagerApi pluginManagerApi=client.api().pluginManagerApi();
AI写代码
java
运行
1
6.1 plugins-查看所有插件信息
/*
查看插件所有信息
param 不是很理解这两个参数的具体含义,第一个参数调整返回的插件信息不一样
/
Plugins plugins=pluginManagerApi.plugins(3,null);
for(int i=0;i<plugins.plugins().size();i++) {
log.info(plugins.plugins().get(i).longName()+”:” + plugins.plugins().get(i));
}
AI写代码
java
运行
1
2
3
4
5
6
7
8
6.2 installNecessaryPlugins-插件安装
/
* 安装插件
* param 插件ID@版本号
/
RequestStatus requestStatus=pluginManagerApi.installNecessaryPlugins(“artifactory@3.10.6“);
log.info(“artifactory:”+requestStatus);
AI写代码
java
运行
1
2
3
4
5
6
7.statisticsApi-统计信息API
/
* 我的系统返回值为空,所以不清楚具体统计的什么
/
StatisticsApi statisticsApi= client.api().statisticsApi();
OverallLoad overallLoad=statisticsApi.overallLoad();
log.info(“overallLoad:”+overallLoad);
AI写代码
java
运行
1
2
3
4
5
6
8.queueApi-任务队列API
/*
* 三个接口,因为没数据,所以对应页面功能不是很理解
*/
QueueApi queueApi=client.api().queueApi();
List queueList=queueApi.queue();
RequestStatus cancelStatus=queueApi.cancel(1);
QueueItem queueItem=queueApi.queueItem(1);
AI写代码
java

