Jenkins Rest API整理


前言

在DevOps中,jenkins总是作为其中的一环集成到里面,它提供了几种语言的API,可以很方便的进行调用集成。现在我们将要上线DevOps系统,面对未来可能需要对系统的二次开发和处于对系统的深入理解,我需要对Jenkins API有个比较熟悉的了解。
我觉着需要有一个前提条件,需要对页面访问下的jenkins要有个大致了解,需要知道通过页面大致如何去使用jenkins来完成自动化步骤,了解它个各个业务功能模块,尤其是项目那块,这样在使用jenkins api,才能知道调用的各个api分别对应页面上的哪个操作功能以及接口需要的参数的含义。

一、Jenkins Rest API简单介绍

在githup上,jenkins-rest项目地址:[链接地址](https://codechina.csdn.net/mirrors/cdancy/jenkins-rest?utm_source=csdn_github_accelerator),接口定义和接口测试代码都可以详细看到。 但在使用过程中遇到了问题让我纠结了很久。 看下使用REST API前置条件:
  1. 需要运行着的jenkins环境
  2. 需要一个管理员权限的账号
  3. 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

在默认配置文件JENKINS_JAVA_OPTIONS里面加入取消相关保护的参数配置,即可关闭CSRF,配置内容如下:

-Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true

修改后如下:
在这里插入图片描述
重启jenkins即可生效

systemctl  restart jenkins.service

登录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

pom.xml配置如下:

 <dependency>
            <groupId>com.cdancy</groupId>
            <artifactId>jenkins-rest</artifactId>
            <version>0.0.28</version>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>28.1-jre</version>
  </dependency>

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"));

由代码可以看出一共提供了6个API类,分别是

API类说明
pluginManagerApi插件API:提供插件操作接口,一共就俩方法,查看和安装插件
crumbIssuerApi系统哈希值信息(用于防御CSRF攻击)
jobsAPi任务(项目管理),提供任务的创建、修改、查询、删除等操作,主要使用接口
queueApi任务队列相关
statisticsApijenkins统计相关
systemApijenkins系统信息,如版本

在这里插入图片描述

4.jobsApi-任务API

 JobsApi  jobApi=client.api().jobsApi();

4.1 jobList-任务一览

		 /**
         * 任务一览
         * param  文件夹路径“”,取的是最外层的任务,若要查看任务文件夹中的任务,入参则为文件名名称
         */
        JobList jobList=jobApi.jobList("");
        for(int i=0;i<jobList.jobs().size();i++){
            log.info(jobList.jobs().get(i));
        }

4.2 jobInfo-具体任务详细信息

		/**
         * 根据任务名称获取任务信息
         * param  文件夹路径null,最外层任务   任务名称“test”
         */
		JobInfo jobInfo=jobApi.jobInfo(null,"test");
        log.info("test任务详细信息"+jobInfo);

4.3 buildInfo-任务构建的详细信息

		/**
         * 根据任务名称和任务构建id,获取构建信息
         * param  文件夹路径null   任务名称“test”  构建ID 3
         */
        jobApi.buildInfo(null,"test",3);
        log.info("test任务第三次构建详细信息:"+jobApi);

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);

4.5 config-查看任务配置文件内容(两个入参)

	/**
     * 获取任务配置文件内容
     * param  文件夹路径null   任务名称“test2”
     */
    String testConfig=jobApi.config(null,"test2");
    log.info("testConfig:"+testConfig);

4.6 config-更新任务配置文件内容(三个入参)

	  /**
       * 更新任务的配置文件
       * param  文件夹路径null  任务名称“test2”   新的任务配置文件内容xmlStr.toString
       */
      boolean updateConfig=jobApi.config(null,"test2",xmlStr.toString());
      log.info("updateConfig result:"+updateConfig);

4.7 description-获取任务描述内容(两个入参)

      /**
      *获取任务描述
      * param 文件夹路径null  任务名称“test2”
      */
     String description= jobApi.description(null,"test2");
     log.info("description:"+description);

4.8 description-获取任务描述内容(三个入参)

		/**
         * 更新任务的描述
         * param  文件夹路径null   任务名称“tes2”  新的任务描述
         */
        Boolean updateDescription=jobApi.description(null,"test2","this is update test job description");
        log.info("updateDescription result:"+updateConfig);

4.9 delete-删除任务

     /**
      * 删除任务
      * param  文件夹路径null  任务名称
      */
     RequestStatus deleteResult=jobApi.delete(null,"test2");
     log.info("deleteResult:"+deleteResult);

4.10 enable-启用任务

     /**
     * 启用任务
     * param  文件夹路径null  任务名称“tes2” 
     */
    boolean enableResult=jobApi.enable(null,"test2");
    log.info("enableResult:"+enableResult);

4.11 disable-禁用任务

     /**
     * 禁用任务
     * param  文件夹路径null  任务名称“tes2”
     */
    boolean disableResult=jobApi.disable(null,"test2");
    log.info("disableResult:"+disableResult);

4.12 build-构建任务

	  /**
      * 任务构建
      * param 文件夹路径null , 任务名“test”
      */
    IntegerResponse buildJob=jobApi.build(null,"test");
    log.info("buildJob"+buildJob);

4.13 buildWithParameters-带参数构建任务

    /**
     * 带参数构建任务
     * param 文件夹路径null , 任务名“test”  参数
     */
    Map<String, List<String>> param=new HashMap<>();
    List<String> 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);

4.14 lastBuildNumber-上次任务的构建序号

     /**
      *上次构建的序号
      * param 文件夹路径null , 任务名“pipeline-hello-word”  参数
      */
     Integer  lastBuildNumber=jobApi.lastBuildNumber(null,"pipeline-hello-word");
     log.info("lastBuildNumber:"+lastBuildNumber);

4.15 lastBuildTimestamp-上次任务的构建时间戳

      /**
      * 上次任务构建时间
      * param 文件夹路径null , 任务名“test” 
      */
     String lastBuildTimetamp=jobApi.lastBuildTimestamp(null,"test");
     log.info("lastBuildTimestamp:"+lastBuildTimetamp);

4.16 progressiveText-任务构建对应的控制台输出内容(3个入参)

     /**
     * 获取任务构建对应的控制台输出
      * param 文件夹路径null  任务名称“test"   0:控制台输出文本开始的位置
      */
     ProgressiveText progressiveText=jobApi.progressiveText(null,"test",0);
     log.info("progressText:"+progressiveText);

4.17 progressiveText-任务构建对应的控制台输出内容(3个入参)

     /**
      * 获取任务某个构建次数控制台对应的输出
      * param 文件夹路径null  任务名称“test"   构建index:16   0:控制台输出文本开始的位置
      */
     ProgressiveText progressiveText1=jobApi.progressiveText(null,"test",16,0);
     log.info("progressText num=16:"+progressiveText1);

4.18 rename-任务重命名

      /**
       * 任务名称重命名
       * param 文件夹路径null   任务名称“test"  任务新名词“test2New”
       */
      boolean renameResult=jobApi.rename(null,"test2","test2New");
      log.info("renameResult:"+renameResult);

4.19 workflow-任务某次构建的步骤信息

    /**
     * 获取任务构建index对应的构建步骤内容
     * param 文件夹路径null  任务名称"pipeline-hello-word"    构建index:17
     */
    Workflow workFlow=jobApi.workflow(null,"pipeline-hello-word",17);
    log.info("workFlow:"+workFlow);

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);

任务涉及到的接口是这20个,接口涉及到的数据结构的定义可以在githup domain查看

5.systemApi-系统环境API

SystemApi systemApi=client.api().systemApi();

5.1 systemInfo-查看jenkins系统环境信息

    /**
     * 查看jenkins系统环境信息
     */
    SystemInfo systemInfo=systemApi.systemInfo();
    log.info("systemInfo:"+systemInfo);

5.2 quietDown-准备关闭jenkins,对应Prepare for Shutdown功能

	  /**
      * 准备关闭jenkins,对应Prepare for Shutdown功能
      */
     RequestStatus quietDown=systemApi.quietDown();
     log.info("quietDown:"+quietDown);

5.3 cancelQuietDown-取消准备关闭jenkins

    /**
    * 取消准备关闭jenkins
     */
    RequestStatus cancleQuietDown= systemApi.cancelQuietDown();
    log.info("cancelQuietDown:"+cancleQuietDown);

6.pluginManagerApi-插件API

    PluginManagerApi pluginManagerApi=client.api().pluginManagerApi();

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));
   }

6.2 installNecessaryPlugins-插件安装

     /**
     * 安装插件
     * param 插件ID@版本号
     */
    RequestStatus requestStatus=pluginManagerApi.installNecessaryPlugins("artifactory@3.10.6");
    log.info("artifactory:"+requestStatus);

7.statisticsApi-统计信息API

        /**
         * 我的系统返回值为空,所以不清楚具体统计的什么
         */
       StatisticsApi statisticsApi= client.api().statisticsApi();
       OverallLoad overallLoad=statisticsApi.overallLoad();
       log.info("overallLoad:"+overallLoad);

8.queueApi-任务队列API

		 /**
         * 三个接口,因为没数据,所以对应页面功能不是很理解
         */
         QueueApi queueApi=client.api().queueApi();
         List<QueueItem> queueList=queueApi.queue();
         RequestStatus cancelStatus=queueApi.cancel(1);
         QueueItem queueItem=queueApi.queueItem(1);

9.crumbIssuerApi-用于CSRF

        CrumbIssuerApi crumbIssuerApi= client.api().crumbIssuerApi();
        Crumb crum=crumbIssuerApi.crumb();

总结

涉及到的restAPI接口整理了一遍,便于理解和记录,部分接口还未跟页面功能对应上,对jenkins功能理解还不全面,后续有了更深认识再补充。

<think>好的,用户现在想查找与Jenkins插件相关的资料或解决方案,特别是使用指南和常见问题解决。我需要结合之前的引用内容和用户历史提问来给出合适的回答。 首先,回顾用户提供的引用内容:引用1是关于Jenkins REST API客户端的,引用2是GitHub插件的指南,引用3是Cucumber Reports插件的使用和问题解决。用户之前的问题涉及AUTOSAR组件环形依赖的解决方案,但现在转向了Jenkins插件,所以需要切换上下文。 用户明确提到需要“Jenkins插件使用指南或常见问题解决”,因此我应该围绕这三个引用中的插件展开。每个引用都包含具体插件的使用方法和问题解决步骤,可以分别整理成结构化的内容。 接下来,我需要检查之前的回答是否有遗漏的方面。用户可能希望得到不同插件的指南和常见问题,所以分插件来组织信息比较合理。例如,每个插件单独作为一个部分,包含简介、使用步骤和常见问题解决。 另外,用户引用的内容中提到了项目地址,可能需要包含这些链接,方便用户访问。同时,注意使用中文回答,保持结构清晰,步骤详细。 还需要考虑用户可能的深层需求,比如如何安装插件、配置步骤、解决典型错误等。例如在Cucumber插件中提到的JSON报告生成问题,GitHub插件的集成问题,REST API客户端的调用方法等。 此外,用户历史提问中的解决方案通常分层次,因此可以延续类似的格式,比如分点列出每个插件的关键信息,确保回答易于阅读。 最后,生成相关问题,帮助用户进一步探索。例如,插件的性能优化、其他推荐插件、调试技巧等。 总结,回答需要涵盖三个插件的使用指南和问题解决,结构清晰,步骤明确,包含项目地址,并附上相关问题。</think>根据提供的参考资料和Jenkins生态系统的通用实践,以下是针对插件使用和问题解决的分类指南: --- ### 一、核心插件使用指南 #### 1. **Cucumber Reports插件** ```mermaid graph TD A[编写Cucumber测试] --> B[生成JSON报告] B --> C[Jenkins构建任务] C --> D{报告配置正确?} D -->|是| E[展示可视化HTML报告] D -->|否| F[检查JUnit配置] ``` **关键配置步骤**: 1. 在`pom.xml`中添加报告生成配置: ```xml <plugins> <plugin> <groupId>io.cucumber</groupId> <artifactId>cucumber-junit</artifactId> <configuration> <plugins> <plugin> <name>json</name> <outputFile>target/cucumber.json</outputFile> </plugin> </plugins> </configuration> </plugin> </plugins> ``` 2. Jenkins构建后操作选择`Publish Cucumber Report`,指定路径:`target/cucumber.json`[^3] --- #### 2. **GitHub插件** **典型问题解决方案**: ```bash # 问题:GitHub webhook触发失败 # 排查步骤: 1. 检查Jenkins系统设置中的GitHub Server配置 2. 验证Webhook URL是否包含正确token 3. 在GitHub仓库执行测试推送: curl -X POST -H "Content-Type: application/json" \ -d '{"ref":"refs/heads/main"}' \ http://jenkins-url/github-webhook/ ``` **最佳实践**: - 启用`GitHub Branch Source`特性实现自动分支发现 - 使用`org.jenkinsci.plugins.github_branch_source.GitHubSCMSource`类管理仓库连接[^2] --- #### 3. **REST API客户端** **Java调用示例**: ```java JenkinsClient client = JenkinsClient.builder() .endpoint("http://jenkins:8080") .credentials("admin:apiToken") .build(); // 创建新任务 Job job = Job.builder() .name("new-job") .xml(configXML) .build(); client.jobs().create(job); // 触发构建 QueueReference queueRef = client.jobs() .build("job-name"); ``` 支持的操作类型:`CRUMB`验证、流水线触发、节点管理等[^1] --- ### 二、通用问题解决框架 #### 1. 插件安装异常处理流程 ```mermaid graph LR A[安装失败] --> B{错误类型?} B -->|依赖缺失| C[查看控制台日志] B -->|版本冲突| D[使用Jenkins-war版本矩阵] C --> E[手动下载依赖jar] D --> F[使用插件兼容性工具] ``` #### 2. 配置文件修复技巧 ```groovy // 示例:重置错误配置(Jenfile) node { try { properties([parameters([string(name: 'ENV', defaultValue: 'dev')])]) } catch (e) { currentBuild.result = 'ABORTED' error "配置错误: ${e.getMessage()}" } } ``` --- ### 三、进阶调试方法 #### 1. 日志分析策略 | 日志级别 | 启用命令 | 关键信息定位 | |---------------|-----------------------------|------------------------| | FINE (基础调试) | `java -Djava.util.logging.Level=FINE -jar jenkins.war` | 插件加载顺序 | | FINEST (详细跟踪) | 在`$JENKINS_HOME/logs`目录追加配置 | API调用参数校验 | #### 2. 内存分析工具 ```bash # 生成堆转储文件 jmap -dump:format=b,file=heapdump.hprof <jenkins_pid> # 使用Eclipse MAT分析: mat/ParseHeapDump.sh heapdump.hprof ``` 常见内存问题模式:`PluginClassLoader`未释放、`XStream`序列化泄露 --- ### 四、安全配置建议 #### 1. 权限矩阵配置 ```json { "全局安全设置": { "授权策略": "Role-Based Strategy", "插件权限": { "GitHub插件": ["Job/Configure", "Job/Build"], "Credentials插件": ["Credentials/View"] } } } ``` #### 2. 凭证管理实践 ```bash # 使用Jenkins CLI加密凭证 java -jar jenkins-cli.jar -s http://localhost:8080/ \ create-credentials-by-xml system::system::jenkins _ < credential.xml ``` 凭证存储推荐方案:`HashiCorp Vault`集成插件 --- ### 五、性能优化方案 #### 1. 插件加载加速 ```properties # 在Jenkins启动参数添加: -Dhudson.model.LoadStatistics.clock=2000 -Djenkins.model.Jenkins.parallelLoad=true ``` #### 2. 资源监控配置 ```bash # 使用Prometheus插件暴露指标 curl http://jenkins:8080/prometheus/ # 关键指标示例: jenkins_plugins_installed{version="2.346.3"} 156 jenkins_queue_length 12 ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值