老版本直接用户名和密码即可,新版要求是用户名和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“为例:
-
选择HTTP POST方法
-
选择Authorization Type为Basic Auth,并输入Username和Password|token (Jenkins用户名和密码|token)
-
在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能做什么?
-
从Jenkins获取信息
-
触发新的构建任务
-
对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节点
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接入指南
文档
有两个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())"'