jenkins curl token api,通过API 执行 grovvy 脚本

老版本直接用户名和密码即可,新版要求是用户名和token方式,我的jenknis版本是Jenkins 2.303.1

Build Authorization Token Root | Jenkins plugin

Jenkins API 中文文档_nklinsirui的博客-CSDN博客_jenkinsapi文档

学习路线图

整理了Jenkins API 学习路线图如下:

Jenkins API没有统一的入口,一般为".../api/"样式,...为需要使用API的资源。比如我们的jenkins地址为http://10.10.0.1/,那么我们访问http://10.10.0.1/api/将显示可用于Jenkins站点的API。常见的Jenkins资源包括:站点(实例)、Job和Build。

站点API文档 (例子)

# JENKINS_URL/api/
http://192.168.37.100:8080/api/

Job API文档 (例子)

# JENKINS_URL/job/JOB_NAME/api/
http://192.168.37.100:8080/job/email-test/api/

Build API文档 (例子)

# JENKINS_URL/job/JOB_NAME/lastSucessfulBuild/api/
http://192.168.37.100:8080/job/email-test/lastSuccessfulBuild/api/

过滤返回数据

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

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

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

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

获取Jenkins生成的crumb值:

通过浏览器直接打开:http://ip/crumbIssuer/api/xml

返回结果类似:

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

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

  1. 选择HTTP POST方法

  2. 输入URL: http://ip/job/email-test/build

  3. 选择Authorization Type为Basic Auth,并输入Username和Password|token (Jenkins用户名和密码|token)

  4. 在Headers中填入一个新的header:  Key为Jenkins-Crumb;Value为上面一步获取到的Jenkins生成的crumb值

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

Jenkins CSRF protection参考文档:

https://issues.jenkins-ci.org/browse/JENKINS-42200
https://support.cloudbees.com/hc/en-us/articles/219257077-CSRF-Protection-Explained

API调试工具

推荐使用 Postman 来调试Jenkins API, 当然你可以使用命令行工具wget或curl

API封装

Jenkins API 官网上推荐了几个对Jenkins API封装的框架:

Python API 封装​​​​​​

Ruby API 封装:

Java API 封装:

参考文档

一般支持以下三种方式访问Jenkins API的方式:

  • XML

  • 返回内容为XML格式

  • JSON或JSONP

  • 返回内容为Json或者Jsonp

  • Python

  • 通过ast.literal_eval(urllib.urlopen("...").read())将输出解析成一个Python对象

Jenkins API能做什么?

  1. 从Jenkins获取信息

  2. 触发新的构建任务

  3. 对jobs进行管理,创建/复制/删除等

在新版本的Jenkins中,安全加强,使用curl操作时,需要先获取crumb和crumbRequestField,若不获取,则出现下面的错误;在旧版Jenkins中,若请求出现错误,可通过打开系统管理---全局安全配置(Configure Global Security),取消防止跨站点请求伪造(Prevent Cross Site Request Forgery exploits)的勾选。

测试:如下报错

[root@localhost workspace]# curl -u root:123456aA -X POST http://172.16.10.1:18084/reload
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title>Error 403 No valid crumb was included in the request</title>
</head>
<body><h2>HTTP ERROR 403 No valid crumb was included in the request</h2>
<table>
<tr><th>URI:</th><td>/reload</td></tr>
<tr><th>STATUS:</th><td>403</td></tr>
<tr><th>MESSAGE:</th><td>No valid crumb was included in the request</td></tr>
<tr><th>SERVLET:</th><td>Stapler</td></tr>
</table>
<hr><a href="https://eclipse.org/jetty">Powered by Jetty:// 9.4.42.v20210604</a><hr/>

</body>
</html>

不关闭 crumb

获取crumb:

1. 在jenkins 

     Configure Global Security勾选CSRF Protection

2. 在浏览器输入如下网址获取

http://172.16.10.1:18084/crumbIssuer/api/json

wget -q --auth-no-challenge --user USERNAME --password PASSWORD --output-document - \
'JENKINS_URL/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)'

还好我略懂英文。文章已经很清楚地指出可以通过GET JENKINS_URL/crumbIssuer/api/xml的方式拿到一个crumbRequestField和crumb,然后在下一次请求带上就可以了。

上面的代码转换成常规http请求就是:

get: http://USERNAME:PASSWORD@JENKINS_URL/crumbIssuer/api/xml

我查了一下文档,发现其实也可以用json

get: http://USERNAME:PASSWORD@JENKINS_URL/crumbIssuer/api/json
[root@localhost workspace]# curl -X GET http://172.16.10.1:18084/crumbIssuer/api/json --user root:123456aA
{"_class":"hudson.security.csrf.DefaultCrumbIssuer","crumb":"4924687025d1a60ed1a44ea6e84e7ddcc2b336a16c28253009778d03a6cd3870","crumbRequestField":"Jenkins-Crumb"}[root@localhost workspace]#

上面生成的整理一下就是 crumb 组成是crumbRequestField:crumb

crumb:"Jenkins-Crumb:4924687025d1a60ed1a44ea6e84e7ddcc2b336a16c28253009778d03a6cd3870"

拿到crumb之后放到请求头就可以了,例如我用curl可以这样写:

curl -X POST JENKINS_URL/job/JOB_NAME/build \
  --user USER:PASSWORD \ #old version
  #--user USER:TOKEN \  #new version
  --header "Jenkins-Crumb:***"

站点管理

重启站点

[root@localhost workspace]# curl -f -X POST -u root:11780bcf657a40f50f168e06542ed6f173  -H "Jenkins-Crumb:fc9a1caa05ee7fcc4010d06db4fd0212cb59b35b05d8a17318daa3cea362dcac" "http://172.16.10.1:18084/restart"

关闭站点

[root@localhost workspace]# curl -f -X POST -u root:11780bcf657a40f50f168e06542ed6f173  -H "Jenkins-Crumb:fc9a1caa05ee7fcc4010d06db4fd0212cb59b35b05d8a17318daa3cea362dcac" "http://172.16.10.1:18084/exit"

执行一下,发现jenkins可以自动构建了,打完收工。

有安全洁癖的同学看到USERNAME:PASSWORD就很不爽,其实可以用token代替password, 即USERNAME:TOKEN
在用户设置中可以看到自己的Token

在 全局安全配置中打开下面选项 

关闭 crumb 

如果有 

“No valid crumb was included in the request” 错误就是需要加入crumb的。

出现这个错误是因为你的jenkins中 Configure Global Security下面配置了防止跨站点访问时候需要加上crumb的。
CSRF Protection 下面有个 ‘防止跨站点请求伪造’。

当然你也可以把这个勾选去掉,就不用加crumb了。
 

关闭jenkins的 CSRF
在执行的时候发现 报错了,

下面我来解决这个问题,在jenkins2上,这个没有 取消的 按钮了。在网上搜了一堆都是 旧版本jenkins的解决办法。根据官网描述,Jenkins版本自2.204.6以来的重大变更有:删除禁用 CSRF 保护的功能。 从较旧版本的 Jenkins 升级的实例将启用 CSRF 保护和设置默认的发行者,如果之前被禁用。

虽然删除了禁用csrf保护功能,增加了安全性,但是在一些结合Gitlab、Spinnaker等等工具进行持续集成过程中就增加了一些认证环节,若没有进行相关配置,得到的一定是403的报错。因为集成服务都是在内网操作,为删繁就简,笔者便考虑关闭 CSRF 保护功能,于是乎,对此展开了摸索
 

 下面是新版本jenkins上的解决办法,临时解决的。因为取消这个,估计会导致安全风险。在master节点执行groovy脚本,如下。

hudson.security.csrf.GlobalCrumIssuerConfiguration.DISABLE_CSRF_PROTECTION=true
println hudson.security.csrf.GlobalCrumIssuerConfiguration.DISABLE_CSRF_PROTECTION

关闭之后就是下面这样了。 

首先在用户下面创建自己的API Token并保存,配置路径:系统管理->安全里面的管理用户

测试的job

1.执行curl 调用api 来build,带参数的触发job

curl -n -X POST $SERVER'/job/job_name/buildWithParameters?token=allen&BUILD_TYPE=参数值'
  • 需要是post请求,使用-X post来表示。
  • 账号密码 写到家目录下面的.netrc 文件里面,使用curl的参数-n。
  • 注意多个参数使用&来分割的,注意在bash中执行要带上单引号,不然 & 会被bash解析了,bash中这个是表示让命令后台执行。特别注意。

# cat ~/.netrc -n                                                                                                                           [root@ ip]#~ 
     1	login allen
————————————————
[root@localhost workspace]# curl -s -u root:11780bcf657a40f50f168e06542ed6f173 -X POST  "http://172.16.10.1:18084/job/jettoloader-eureka/buildWithParameters?token=allen" -d 'ENV=poc&BRANCH=develop'

参数说明:-u 用户名和token

                   参数里面的token是job级别的

获取构建够的结果

json方式:

[root@localhost workspace]# curl -s -u root:11780bcf657a40f50f168e06542ed6f173 -X POST  "http://172.16.10.1:18084/job/jettoloader-eureka/lastBuild/api/json?token=allen"
{"_class":"hudson.maven.MavenModuleSetBuild","actions":[{"_class":"hudson.model.ParametersAction","parameters":[{"_class":"hudson.model.StringParameterValue","name":"ENV","value":"poc"},{"_class":"hudson.model.StringParameterValue","name":"BRANCH","value":"develop"},{"_class":"hudson.model.StringParameterValue","name":"MPORT","value":"80:8600"}]},{"_class":"hudson.model.CauseAction","causes":[{"_class":"hudson.model.Cause$RemoteCause","shortDescription":"Started by remote host 172.16.10.4","addr":"172.16.10.4","note":null}]},{},{"_class":"hudson.plugins.git.util.BuildData","buildsByBranchName":{"origin/develop":{"_class":"hudson.plugins.git.util.Build","buildNumber":163,"buildResult":null,"marked":{"SHA1":"01a7cad80b934aabb836f2ccfdf2a9345073f13c","branch":[{"SHA1":"01a7cad80b934aabb836f2ccfdf2a9345073f13c","name":"origin/develop"}]},"revision":{"SHA1":"01a7cad80b934aabb836f2ccfdf2a9345073f13c","branch":[{"SHA1":"01a7cad80b934aabb836f2ccfdf2a9345073f13c","name":"origin/develop"}]}}},"lastBuiltRevision":{"SHA1":"01a7cad80b934aabb836f2ccfdf2a9345073f13c","branch":[{"SHA1":"01a7cad80b934aabb836f2ccfdf2a9345073f13c","name":"origin/develop"}]},"remoteUrls":["http://172.16.10.38/jettoloader/jettoloader-eureka.git"],"scmName":""},{},{},{"_class":"hudson.maven.reporters.MavenAggregatedArtifactRecord"},{"_class":"hudson.plugins.sonar.action.SonarAnalysisAction","ceTaskId":"AYH6gmXstTX-wyrCCWQP","credentialsId":"jenkins-sorna","installationName":"sonar7.8","installationUrl":"http://172.16.10.1:9000","new":true,"serverUrl":"http://172.16.10.1:9000","skipped":false,"sonarqubeDashboardUrl":"http://172.16.10.1:9000/dashboard?id=jettoloader-eureka"},{"_class":"hudson.plugins.sonar.action.SonarAnalysisAction","ceTaskId":"AYH6gmXstTX-wyrCCWQP","credentialsId":"jenkins-sorna","installationName":"sonar7.8","installationUrl":"http://172.16.10.1:9000","new":true,"serverUrl":"http://172.16.10.1:9000","skipped":false,"sonarqubeDashboardUrl":"http://172.16.10.1:9000/dashboard?id=jettoloader-eureka"},{"_class":"hudson.plugins.jacoco.JacocoBuildAction"},{},{},{"_class":"hudson.plugins.sonar.action.SonarBuildBadgeAction","url":"http://172.16.10.1:9000/dashboard?id=jettoloader-eureka"},{},{"_class":"org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction"}],"artifacts":[],"building":false,"description":null,"displayName":"#163","duration":31385,"estimatedDuration":31385,"executor":null,"fullDisplayName":"jettoloader-eureka #163","id":"163","keepLog":false,"number":163,"queueId":44,"result":"SUCCESS","timestamp":1657765227933,"url":"http://172.16.10.1:18084/job/jettoloader-eureka/163/","builtOn":"builder01","changeSet":{"_class":"hudson.plugins.git.GitChangeSetList","items":[],"kind":"git"},"culprits":[],"mavenArtifacts":{},"mavenVersionUsed":"3.3.9"}[root@localhost workspace]# 

xml方式:

[root@localhost workspace]# curl -s -u root:11780bcf657a40f50f168e06542ed6f173 -X POST  "http://172.16.10.1:18084/job/jettoloader-eureka/lastBuild/api/xml?token=allen"
<mavenModuleSetBuild _class='hudson.maven.MavenModuleSetBuild'><action _class='hudson.model.ParametersAction'><parameter _class='hudson.model.StringParameterValue'><name>ENV</name><value>poc</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>BRANCH</name><value>develop</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>MPORT</name><value>80:8600</value></parameter></action><action _class='hudson.model.CauseAction'><cause _class='hudson.model.Cause$RemoteCause'><shortDescription>Started by remote host 172.16.10.4</shortDescription><addr>172.16.10.4</addr></cause></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><origindevelop _class='hudson.plugins.git.util.Build'><buildNumber>163</buildNumber><marked><SHA1>01a7cad80b934aabb836f2ccfdf2a9345073f13c</SHA1><branch><SHA1>01a7cad80b934aabb836f2ccfdf2a9345073f13c</SHA1><name>origin/develop</name></branch></marked><revision><SHA1>01a7cad80b934aabb836f2ccfdf2a9345073f13c</SHA1><branch><SHA1>01a7cad80b934aabb836f2ccfdf2a9345073f13c</SHA1><name>origin/develop</name></branch></revision></origindevelop></buildsByBranchName><lastBuiltRevision><SHA1>01a7cad80b934aabb836f2ccfdf2a9345073f13c</SHA1><branch><SHA1>01a7cad80b934aabb836f2ccfdf2a9345073f13c</SHA1><name>origin/develop</name></branch></lastBuiltRevision><remoteUrl>http://172.16.10.38/jettoloader/jettoloader-eureka.git</remoteUrl><scmName></scmName></action><action></action><action></action><action _class='hudson.maven.reporters.MavenAggregatedArtifactRecord'></action><action _class='hudson.plugins.sonar.action.SonarAnalysisAction'><ceTaskId>AYH6gmXstTX-wyrCCWQP</ceTaskId><credentialsId>jenkins-sorna</credentialsId><installationName>sonar7.8</installationName><installationUrl>http://172.16.10.1:9000</installationUrl><new>true</new><serverUrl>http://172.16.10.1:9000</serverUrl><skipped>false</skipped><sonarqubeDashboardUrl>http://172.16.10.1:9000/dashboard?id=jettoloader-eureka</sonarqubeDashboardUrl></action><action _class='hudson.plugins.sonar.action.SonarAnalysisAction'><ceTaskId>AYH6gmXstTX-wyrCCWQP</ceTaskId><credentialsId>jenkins-sorna</credentialsId><installationName>sonar7.8</installationName><installationUrl>http://172.16.10.1:9000</installationUrl><new>true</new><serverUrl>http://172.16.10.1:9000</serverUrl><skipped>false</skipped><sonarqubeDashboardUrl>http://172.16.10.1:9000/dashboard?id=jettoloader-eureka</sonarqubeDashboardUrl></action><action _class='hudson.plugins.jacoco.JacocoBuildAction'></action><action></action><action></action><action _class='hudson.plugins.sonar.action.SonarBuildBadgeAction'><url>http://172.16.10.1:9000/dashboard?id=jettoloader-eureka</url></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'></action><building>false</building><displayName>#163</displayName><duration>31385</duration><estimatedDuration>31385</estimatedDuration><fullDisplayName>jettoloader-eureka #163</fullDisplayName><id>163</id><keepLog>false</keepLog><number>163</number><queueId>44</queueId><result>SUCCESS</result><timestamp>1657765227933</timestamp><url>http://172.16.10.1:18084/job/jettoloader-eureka/163/</url><builtOn>builder01</builtOn><changeSet _class='hudson.plugins.git.GitChangeSetList'><kind>git</kind></changeSet><mavenArtifacts></mavenArtifacts><mavenVersionUsed>3.3.9</mavenVersionUsed></mavenModuleSetBuild>[root@localhost workspace]# 

2. job的enable和disable 开启和关闭

[root@localhost workspace]# curl -s -u root:11780bcf657a40f50f168e06542ed6f173 -X POST  "http://172.16.10.1:18084/job/jettoloader-eureka/enable"


[root@localhost workspace]# curl -s -u root:11780bcf657a40f50f168e06542ed6f173 -X POST  "http://172.16.10.1:18084/job/jettoloader-eureka/disable"

3.获取所有的Jobs

# 以json方式显示,pretty=true以友好可读方式显示结果

[root@localhost workspace]# curl -f -X POST -u root:11780bcf657a40f50f168e06542ed6f173  "http://172.16.10.1:18084/api/json?pretty=true"
{
  "_class" : "hudson.model.Hudson",
  "assignedLabels" : [
    {
      "name" : "master"
    }
  ],
  "mode" : "EXCLUSIVE",
  "nodeDescription" : "the master Jenkins node",
  "nodeName" : "",
  "numExecutors" : 1,
  "description" : null,
  "jobs" : [
    {
      "_class" : "hudson.maven.MavenModuleSet",
      "name" : "jettoloader-attach",
      "url" : "http://172.16.10.1:18084/job/jettoloader-attach/",
      "color" : "blue"
    },
    {
      "_class" : "hudson.maven.MavenModuleSet",
      "name" : "jettoloader-authentication",
      "url" : "http://172.16.10.1:18084/job/jettoloader-authentication/",
      "color" : "blue"
    },
    {
      "_class" : "hudson.maven.MavenModuleSet",
      "name" : "jettoloader-basic",
      "url" : "http://172.16.10.1:18084/job/jettoloader-basic/",
      "color" : "blue"
    },
    {
      "_class" : "hudson.maven.MavenModuleSet",
      "name" : "jettoloader-common",
      "url" : "http://172.16.10.1:18084/job/jettoloader-common/",
      "color" : "blue"
    },
    {
      "_class" : "hudson.maven.MavenModuleSet",
      "name" : "jettoloader-dto",
      "url" : "http://172.16.10.1:18084/job/jettoloader-dto/",
      "color" : "blue"
    },
    {
      "_class" : "hudson.maven.MavenModuleSet",
      "name" : "jettoloader-eureka",
      "url" : "http://172.16.10.1:18084/job/jettoloader-eureka/",
      "color" : "blue"
    },
    {
      "_class" : "hudson.model.FreeStyleProject",
      "name" : "jettoloader-frontend",
      "url" : "http://172.16.10.1:18084/job/jettoloader-frontend/",
      "color" : "blue"
    },
    {
      "_class" : "hudson.maven.MavenModuleSet",
      "name" : "jettoloader-frontserver",
      "url" : "http://172.16.10.1:18084/job/jettoloader-frontserver/",
      "color" : "blue"
    },
    {
      "_class" : "hudson.maven.MavenModuleSet",
      "name" : "jettoloader-pressurecommon",
      "url" : "http://172.16.10.1:18084/job/jettoloader-pressurecommon/",
      "color" : "blue"
    },
    {
      "_class" : "hudson.maven.MavenModuleSet",
      "name" : "jettoloader-quartz",
      "url" : "http://172.16.10.1:18084/job/jettoloader-quartz/",
      "color" : "blue"
    },
    {
      "_class" : "hudson.maven.MavenModuleSet",
      "name" : "jettoloader-test",
      "url" : "http://172.16.10.1:18084/job/jettoloader-test/",
      "color" : "blue"
    },
    {
      "_class" : "hudson.maven.MavenModuleSet",
      "name" : "jettoloader-zuul",
      "url" : "http://172.16.10.1:18084/job/jettoloader-zuul/",
      "color" : "blue"
    }
  ],
  "overallLoad" : {
    
  },
  "primaryView" : {
    "_class" : "hudson.model.AllView",
    "name" : "all",
    "url" : "http://172.16.10.1:18084/"
  },
  "quietDownReason" : null,
  "quietingDown" : false,
  "slaveAgentPort" : 50000,
  "unlabeledLoad" : {
    "_class" : "jenkins.model.UnlabeledLoadStatistics"
  },
  "url" : "http://172.16.10.1:18084/",
  "useCrumbs" : true,
  "useSecurity" : true,
  "views" : [
    {
      "_class" : "hudson.model.AllView",
      "name" : "all",
      "url" : "http://172.16.10.1:18084/"
    },
    {
      "_class" : "hudson.model.ListView",
      "name" : "jettoloader_sonar",
      "url" : "http://172.16.10.1:18084/view/jettoloader_sonar/"
    }
  ]
}

我们可以通过tree=XPath对输出结果进行过滤,*表示不过滤

4.节点管理

[root@localhost workspace]# curl -f -X POST -u root:11780bcf657a40f50f168e06542ed6f173  "http://172.16.10.1:18084/computer/api/json?pretty=true"

{
  "_class" : "hudson.model.ComputerSet",
  "busyExecutors" : 0,
  "computer" : [
    {
      "_class" : "hudson.model.Hudson$MasterComputer",
      "actions" : [
        
      ],
      "assignedLabels" : [
        {
          "name" : "master"
        }
      ],
      "description" : "the master Jenkins node",
      "displayName" : "master",
      "executors" : [
        {
          
        }
      ],
      "icon" : "computer.png",
      "iconClassName" : "icon-computer",
      "idle" : true,
      "jnlpAgent" : false,
      "launchSupported" : true,
      "loadStatistics" : {
        "_class" : "hudson.model.Label$1"
      },
      "manualLaunchAllowed" : true,
      "monitorData" : {
        "hudson.node_monitors.SwapSpaceMonitor" : {
          "_class" : "hudson.node_monitors.SwapSpaceMonitor$MemoryUsage2",
          "availablePhysicalMemory" : 1524740096,
          "availableSwapSpace" : 4132171776,
          "totalPhysicalMemory" : 16657788928,
          "totalSwapSpace" : 4160745472
        },
        "hudson.node_monitors.TemporarySpaceMonitor" : {
          "_class" : "hudson.node_monitors.DiskSpaceMonitorDescriptor$DiskSpace",
          "timestamp" : 1657769625712,
          "path" : "/tmp",
          "size" : 100676894720
        },
        "hudson.node_monitors.DiskSpaceMonitor" : {
          "_class" : "hudson.node_monitors.DiskSpaceMonitorDescriptor$DiskSpace",
          "timestamp" : 1657769625711,
          "path" : "/var/jenkins_home",
          "size" : 263465537536
        },
        "hudson.node_monitors.ArchitectureMonitor" : "Linux (amd64)",
        "hudson.node_monitors.ResponseTimeMonitor" : {
          "_class" : "hudson.node_monitors.ResponseTimeMonitor$Data",
          "timestamp" : 1657769625711,
          "average" : 0
        },
        "hudson.node_monitors.ClockMonitor" : {
          "_class" : "hudson.util.ClockDifference",
          "diff" : 0
        }
      },
      "numExecutors" : 1,
      "offline" : false,
      "offlineCause" : null,
      "offlineCauseReason" : "",
      "oneOffExecutors" : [
        
      ],
      "temporarilyOffline" : false
    },
    {
      "_class" : "hudson.slaves.SlaveComputer",
      "actions" : [
        
      ],
      "assignedLabels" : [
        {
          "name" : "builder01"
        }
      ],
      "description" : "172.16.10.4",
      "displayName" : "builder01",
      "executors" : [
        {
          
        },
        {
          
        },
        {
          
        },
        {
          
        }
      ],
      "icon" : "computer.png",
      "iconClassName" : "icon-computer",
      "idle" : true,
      "jnlpAgent" : false,
      "launchSupported" : true,
      "loadStatistics" : {
        "_class" : "hudson.model.Label$1"
      },
      "manualLaunchAllowed" : true,
      "monitorData" : {
        "hudson.node_monitors.SwapSpaceMonitor" : {
          "_class" : "hudson.node_monitors.SwapSpaceMonitor$MemoryUsage2",
          "availablePhysicalMemory" : 6062419968,
          "availableSwapSpace" : 0,
          "totalPhysicalMemory" : 16656363520,
          "totalSwapSpace" : 0
        },
        "hudson.node_monitors.TemporarySpaceMonitor" : {
          "_class" : "hudson.node_monitors.DiskSpaceMonitorDescriptor$DiskSpace",
          "timestamp" : 1657769625823,
          "path" : "/tmp",
          "size" : 33427267584
        },
        "hudson.node_monitors.DiskSpaceMonitor" : {
          "_class" : "hudson.node_monitors.DiskSpaceMonitorDescriptor$DiskSpace",
          "timestamp" : 1657769625824,
          "path" : "/opt/work/jenkins/data",
          "size" : 33427267584
        },
        "hudson.node_monitors.ArchitectureMonitor" : "Linux (amd64)",
        "hudson.node_monitors.ResponseTimeMonitor" : {
          "_class" : "hudson.node_monitors.ResponseTimeMonitor$Data",
          "timestamp" : 1657769625808,
          "average" : 95
        },
        "hudson.node_monitors.ClockMonitor" : {
          "_class" : "hudson.util.ClockDifference",
          "diff" : -51
        }
      },
      "numExecutors" : 4,
      "offline" : false,
      "offlineCause" : null,
      "offlineCauseReason" : "",
      "oneOffExecutors" : [
        
      ],
      "temporarilyOffline" : false,
      "absoluteRemotePath" : "/opt/work/jenkins/data"
    }
  ],
  "displayName" : "Nodes",
  "totalExecutors" : 5

查看某个节点信息

curl -u admin:admin <Jenkins地址>/computer/<节点名称>/api/json?pretty=true

注意:主节点master需要在节点名称master上加上括号,使用curl -u admin:admin <Jenkins地址>/computer/(master)/api/json?pretty=true查看

[root@localhost workspace]# curl -f -X POST -u root:11780bcf657a40f50f168e06542ed6f173  "http://172.16.10.1:18084/computer/builder01/api/json?pretty=true"

获取节点配置

curl -sO -u admin:admin "http://192.168.31.91:8080/computer/NODE-TEST/config.xml"

注意:不能用于master节点

jenkins - api详解

5.获取Jobs信息

[root@localhost workspace]# curl -f -X POST -u root:11780bcf657a40f50f168e06542ed6f173  -H "Jenkins-Crumb:fc9a1caa05ee7fcc4010d06db4fd0212cb59b35b05d8a17318daa3cea362dcac" "http://172.16.10.1:18084/job/jettoloader-eureka/api/json?pretty=true"

获取最后一次构建信息

curl -u admin:admin http://ip/job/测试任务-1/lastBuild/api/json?pretty=true

获取最后稳定构建信息

curl -u admin:admin http://ip/job/测试任务-1/lastStableBuild/

 获取最后成功的构建

curl -u admin:admin http://ip/job/测试任务-1/lastSuccessfulBuild/

获取最后完成的构建

curl -u admin:admin http://ip/job/测试任务-1/lastCompletedBuild/

最近失败的构建

curl -u admin:admin http://ip/job/测试任务-1/lastFailedBuild/

6.Job操作API

查看任务描述

我的版本不支持或是api发生变化

curl -u admin:admin http://ip/job/测试任务/description

[root@localhost workspace]# curl -f -X POST -u root:11780bcf657a40f50f168e06542ed6f173  -H "Jenkins-Crumb:fc9a1caa05ee7fcc4010d06db4fd0212cb59b35b05d8a17318daa3cea362dcac" "http://172.16.10.1:18084/job/jettoloader-eureka/api/description"
curl: (22) The requested URL returned error: 404 Not Found

7. 获取node的ip,如果是docekr方式的jenkins 只能获取docker容器里面的ip而不是容器所在机器的ip

[root@localhost workspace]# curl -f -X POST -u root:11780bcf657a40f50f168e06542ed6f173  -H "Jenkins-Crumb:fc9a1caa05ee7fcc4010d06db4fd0212cb59b35b05d8a17318daa3cea362dcac" -d "script=println InetAddress.localHost.hostAddress"  "http://172.16.10.1:18084/computer/(master)/scriptText"
10.0.27.6

其他节点要获取特定从站的IP地址,您必须知道节点的名称。节点名称查询很容易jenkins_url/computer/api/json

[root@localhost workspace]# curl -f -X POST -u root:11780bcf657a40f50f168e06542ed6f173  -H "Jenkins-Crumb:fc9a1caa05ee7fcc4010d06db4fd0212cb59b35b05d8a17318daa3cea362dcac"  "http://172.16.10.1:18084/computer/api/json?pretty=true" | grep name
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  4361  100  4361    0     0   761k      0 --:--:-- --:--:-- --:--:--  851k
          "name" : "master"
          "name" : "builder01"

关于认证机制:Jenkins API接入指南

文档

Script Console

有两个API,分别是 /script/ 和 /scriptText/,使用POST请求和Form表单传参,key为script。两者的区别就是 /script/ 接口返回的是HTML,而/scriptText/接口返回的是Text。
示例:

curl -d "script=<your_script_here>" https://jenkins/script
# or to get output as a plain text result (no HTML)
curl -d "script=<your_script_here>" https://jenkins/scriptText

Jenkins 通过API获取从节点的secret

注意:调用API一般都需要认证信息,根据认证方式不同可能需要cookie、token、csrf-token等等,详见:Jenkins API接入指南

下文使用 $NODE_NAME 代替具体节点名

方法1:获取节点的jnlp文件,解析得到secret

调用接口 http://ip:port/computer/$NODE_NAME/slave-agent.jnlp,获取jnlp文件内容,解析xml文本,获取节点的secret值。

方法2:访问节点详情地址,使用正则匹配,获取节点的secret

节点详情的地址是 http://ip:port/computer/$NODE_NAME/,当我们通过浏览器访问时页面上会显示节点的secret值。同样的,我们可以通过HttpClient调用该地址,可想而知,响应体是个html文本,我们可以通过secret前后的固定字符串进行正则匹配,获取secret值。

 

(推荐)方法3:远程执行grovvy 脚本获取节点secret

远程执行脚本的接口为 http://ip:port/scriptText,示例如下:(注意,示例中没有携带认证token)

curl -L -X POST 'http://ip:port/scriptText' \
--data-urlencode 'script="println(jenkins.model.Jenkins.getInstance().getComputer(\"$NODE_NAME\")?.getJnlpMac())"'

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值