3. API格式

Jenkins API支持以下3种格式:

  • XML
  • JSON并支持JSONP跨域访问
  • Python

4. API文档

Jenkins API 没有统一的入口,而是采用 “…/api/” 的 REST API 样式,其中 “…” 表示Jenkins资源的URL。

常见的Jenkins资源包括:站点(实例)、Job和Build。

上面的思维导图中只是列出了不同级别API的常用API,具体用法请参考Jenkins API在线文档:

4.1 API示例

4.1.1 站点API文档 (例子)

### JENKINS_URL/api/
http://192.168.1.100:8080/api/

4.1.2 View API文档 (例子)

# JENKINS_URL/view/<view-name>/api/json
http://192.168.1.100:8080/view/test/api/json

4.1.3 Job API文档 (例子)

下面的命令可以查看当前job的api:

# JENKINS_URL/job/<job-name>/api/ OR JENKINS_URL/job/<job-name>/api/xml
http://192.168.1.100:8080/job/email-test/api/
创建项目(Job)

在创建项目之前首先需要创建一个模板配置文件 config.xmlconfig.xml配置文件就是pipeline项目配置文件,配置文件可通过如下方式获取:

  1. 手动在jenkins创建一个pipeline项目,例如我创建并配置了一个名为pipeline_demo的job。
  2. 访问192.168.30.8:8080/job/pipeline_demo/config.xml,这个就是pipeline_demo的配置文件,保存到本地,然后修改对应内容即可。

配置文件内容如下:

<?xml version='1.1' encoding='UTF-8'?>
<flow-definition plugin="workflow-job@1232.v5a_4c994312f1">
  <actions>
    <org.jenkinsci.plugins.pipeline.modeldefinition.actions.DeclarativeJobAction plugin="pipeline-model-definition@2.2114.v2654ca_721309"/>
    <org.jenkinsci.plugins.pipeline.modeldefinition.actions.DeclarativeJobPropertyTrackerAction plugin="pipeline-model-definition@2.2114.v2654ca_721309">
      <jobProperties/>
      <triggers/>
      <parameters/>
      <options/>
    </org.jenkinsci.plugins.pipeline.modeldefinition.actions.DeclarativeJobPropertyTrackerAction>
  </actions>
  <description>a pipeline demo</description>
  <keepDependencies>false</keepDependencies>
  <properties>
    <hudson.plugins.jira.JiraProjectProperty plugin="jira@3.8"/>
    <org.jenkinsci.plugins.workflow.job.properties.PipelineTriggersJobProperty>
      <triggers>
        <hudson.triggers.TimerTrigger>
          <spec>30 22 * * *</spec>
        </hudson.triggers.TimerTrigger>
      </triggers>
    </org.jenkinsci.plugins.workflow.job.properties.PipelineTriggersJobProperty>
  </properties>
  <definition class="org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition" plugin="workflow-cps@2759.v87459c4eea_ca_">
    <script>pipeline {
    agent any
    stages {
        stage(&apos;begin&apos;) {
            steps {
                echo &apos;Hello pipeline&apos;
                }
        }
    }
    post {
        always {
            echo &apos;say goodbay&apos;
            }
    }
}</script>
    <sandbox>true</sandbox>
  </definition>
  <triggers/>
  <disabled>false</disabled>
</flow-definition>

创建项目的命令格式如下:

curl -X POST --USER {username}:{api token} {jenkins URL}/createItem?name={jobName} --header "Content-Type:text/xml" --data-binary @config.xml
  • username:用户名
  • api token:用户API TOKEN
  • jenkins URL:jenkins地址
  • jobName为项目名

使用 curl 方式执行:

$ curl -X POST --USER admin:11108c1d093a24fcebe11e945de3bcece4 http://192.168.30.8:8080/createItem?name=pipeline_demo2 --header "Content-Type:text/xml" --data-binary @pipeline_demo_config.xml
# 或者
$ curl -X POST http://admin:11108c1d093a24fcebe11e945de3bcece4@192.168.30.8:8080/createItem?name=pipeline_demo2 --header "Content-Type:text/xml" --data-binary @pipeline_demo_config.xml

提示💡

这里的 @pipeline_demo_config.xml 是需要再body中写入的配置文件,类型为 Content-Type:text/xml

更新项目(job)
$ curl -X POST --USER admin:11108c1d093a24fcebe11e945de3bcece4  http://192.168.30.8:8080/job/pipeline_demo2/config.xml --header "Content-Type:text/xml" --data-binary @pipeline_demo_config_new.xml

pipeline_demo_config_new.xml为更新之后的配置文件。

4.1.4 Build API文档 (例子)

# JENKINS_URL/job/<job-name>/<build-number>/api/
http://192.168.1.100:8080/job/email-test/lastSuccessfulBuild/api/

4.2 API返回值

Jenkins API将Jenkins资源模型抽象为树形结构,可以通过tree来指定返回Jenkins资源的层次。

  • 返回值:XML示例
<hudson _class='hudson.model.Hudson'>
  <assignedLabel>
	  <name>master</name>
  </assignedLabel>
  <mode>NORMAL</mode>
  <nodeDescription>Jenkins的master节点</nodeDescription>
  <nodeName></nodeName>
  <numExecutors>1</numExecutors>
  <job _class='org.jenkinsci.plugins.workflow.job.WorkflowJob'>
	  <name>deploy-test2</name>
	  <url>http://127.0.0.1:8080/jenkins/job/deploy-test2/</url>
	  <color>red</color>
  </job>
  <job _class='org.jenkinsci.plugins.workflow.job.WorkflowJob'>
	  <name>test-job</name>
	  <url>http://127.0.0.1:8080/jenkins/job/test-job/</url>
	  <color>blue</color>
  </job>
  <quietingDown>false</quietingDown>
  <slaveAgentPort>50000</slaveAgentPort>
  <unlabeledLoad _class='jenkins.model.UnlabeledLoadStatistics'></unlabeledLoad>
  <useCrumbs>false</useCrumbs>
  <useSecurity>true</useSecurity>
  <view _class='hudson.model.AllView'>
	  <name>all</name>
	  <url>http://127.0.0.1:8080/jenkins/</url>
  </view>
</hudson>
  • 返回值:JSON示例
{
  "_class": "hudson.model.Hudson",
  "assignedLabels": [
	  {
		  "name": "master"
	  }
  ],
  "mode": "NORMAL",
  "nodeDescription": "Jenkins的master节点",
  "nodeName": "",
  "numExecutors": 1,
  "description": null,
  "jobs": [
	  {
		  "_class": "org.jenkinsci.plugins.workflow.job.WorkflowJob",
		  "name": "deploy-test2",
		  "url": "http://127.0.0.1:8080/jenkins/job/deploy-test2/",
		  "color": "red"
	  },
	  {
		  "_class": "org.jenkinsci.plugins.workflow.job.WorkflowJob",
		  "name": "test-job",
		  "url": "http://127.0.0.1:8080/jenkins/job/test-job/",
		  "color": "blue"
	  }
  ],
  "overallLoad": {},
  "primaryView": {
	  "_class": "hudson.model.AllView",
	  "name": "all",
	  "url": "http://127.0.0.1:8080/jenkins/"
  },
  "quietingDown": false,
  "slaveAgentPort": 50000,
  "unlabeledLoad": {
	  "_class": "jenkins.model.UnlabeledLoadStatistics"
  },
  "useCrumbs": false,
  "useSecurity": true,
  "views": [
	  {
		  "_class": "hudson.model.AllView",
		  "name": "all",
		  "url": "http://192.168.2.11:8080/jenkins/"
	  }
  ]
}

具体用法请参考Jenkins API 在线文档。

4.3 API安全

在调用Jenkins API 时需要以HTTP Basic Auth验证方式提供用户名和密码。

另外,在Jenkins 2之后默认开启CSRF protection (跨域访问伪造保护),对有些Jenkins API的调用还需要提供Jenkins-Crumb(有时效的token);否则会出现“403 No valid crumb was included in the request” 的错误。

获取Jenkins生成的crumb值:

<defaultCrumbIssuer _class="hudson.security.csrf.DefaultCrumbIssuer">
<crumb>068ab0b4e0622b374d8822b22cee8b18</crumb>
<crumbRequestField>Jenkins-Crumb</crumbRequestField>
</defaultCrumbIssuer>

以通过Postman”执行一次新的build“为例:

  • 选择HTTP POST方法
  • 输入URL: http://192.168.1.100:8080/job/email-test/build
  • 选择Authorization Type为Basic Auth,并输入Username和Password (Jenkins用户名和密码)
  • 在Headers中填入一个新的header:
    • Key为Jenkins-Crumb
    • Value为上面一步获取到的Jenkins生成的crumb值: 068ab0b4e0622b374d8822b22cee8b18

Tips: 测试过Jenkins API官方文档中的wget方法获取到的Jenkins的crumb值,和浏览器直接访问获取到的值不同,并且用wget方法获取到的crumb值在Postman测试失败。

扩展阅读