需求:
我要用python通过api,启动这个job,并且启动这个job需要1个参数
安装依赖:
pipenv install python-jenkins
熟悉API的使用方法:
了解一个API的最好办法,就是先看它的 官方文档,
从中找到自己需要的方法 ,弄明白要给方法传什么参,参数类型,返回值类型
然后再做一个小demo,验证自己的想法,顺便也能熟悉一下这个api
我从官方文档中找到下面这3个方法,正是我需要的:
- build_job用来启动job
- get_build_console_output用来获取job的构建日志
- get_queu_info用来获取 pending状态 的job
build_job
(name, parameters=None, token=None)
Trigger build job.
This method returns a queue item number that you can pass to Jenkins.get_queue_item()
. Note that this queue number is only valid for about five minutes after the job completes, so you should get/poll the queue information as soon as possible to determine the job’s URL.
Parameters: |
|
---|---|
Returns: |
|
get_build_console_output
(name, number)
Get build console text.
Parameters: |
|
---|---|
Returns: |
Build console output, |
get_queue_info
()-
Returns: list of job dictionaries, [dict]
- Example::
-
>>> queue_info = server.get_queue_info() >>> print(queue_info[0]) {u'task': {u'url': u'http://your_url/job/my_job/', u'color': u'aborted_anime', u'name': u'my_job'}, u'stuck': False, u'actions': [{u'causes': [{u'shortDescription': u'Started by timer'}]}], u'buildable': False, u'params': u'', u'buildableStartMilliseconds': 1315087293316, u'why': u'Build #2,532 is already in progress (ETA:10 min)', u'blocked': True}
创建测试工程:
接下来创建1个测试job,验证自己的想法
启动该job,需要传递1个字符型参数,参数名是Para1,默认值是:参数1
在shell中打印Para1的参数值:
代码示例:
import jenkins #定义远程的jenkins master server 的url以及Port jenkins_server_url = 'http://10.2.1.92:8080/jenkins/' #定义用户的userid 和 apitoken(在jenkins中生成) user_id = 'admin' api_token = '11d8c79994b1e6d554c857b1d96fcf4dfe' #测试服务器 #实例化jenkins对象,连接远程的jenkins master server server = jenkins.Jenkins(jenkins_server_url,username=user_id,password=api_token) print(server) name ='pubTest1' parameters={'Para1':'Python启动带参数的job'} #dict类型
#构建job(带参数) server.build_job(name,parameters)
构建结果:
这样就通过 python启动了带参数的job
接下来,通过get_build_console_output方法 打印job的构建日志
#获取job的最后次构建号 lastbuildNumber=server.get_job_info(name)['lastBuild']['number'] #输出构建日志 log=server.get_build_console_output(name,lastbuildNumber)
print(log)
结果如下:
由用户 admin 启动
构建中 在工作空间 /root/.jenkins/workspace/pubTest1 中
[pubTest1] $ /bin/sh -xe /usr/local/tomcat/apache-tomcat-8.5.40/temp/jenkins3208269061259629186.sh
+ echo Python启动带参数的job
Python启动带参数的job
Finished: SUCCESS
最后,通过get_queue_info获取pending状态的job列表
使用场景:
通过 api启动job后,这个job会有一段pending状态,这个时间如果用get_build_info是获取不到正在pending状态job信息的.
所以可以这样判断:
如果job出现在queue_info中,则等待一段时间再获取 get_build_info,直到job不出现在queue_info中,则表明job已经启动成功/失败.
代码示例:
#获取正在排队构建的job队列 即pending状态中的所有job,如果没有 pending状态的job即返回1个空列表
queue_info=server.get_queue_info()
print(queue_info)
返回值:
{ '_class': 'hudson.model.Queue$WaitingItem', 'actions': [ { '_class': 'hudson.model.ParametersAction', 'parameters': [ { '_class': 'net.uaznia.lukanus.hudson.plugins.gitparameter.GitParameterValue', 'name': 'Branch', 'value': 'origin/develop' }, { '_class': 'hudson.model.StringParameterValue', 'name': 'ENV', 'value': 'debugenv' } ] }, { '_class': 'hudson.model.CauseAction', 'causes': [ { '_class': 'hudson.model.Cause$UserIdCause', 'shortDescription': '由用户admin启动', 'userId': 'admin', 'userName': 'admin' } ] } ], 'blocked': False, 'buildable': False, 'id': 3427, 'inQueueSince': 1575772564711, 'params': ' Branch=origin/develop ENV=debugenv', 'stuck': False, 'task': { '_class': 'hudson.model.FreeStyleProject', 'name': 'export_apk', 'url': 'http: //10.2.1.92: 8080/jenkins/job/export_apk/', 'color': 'aborted' }, 'url': 'queue/item/3427/', 'why': '处于静默期。截止4.9秒', 'timestamp': 1575772569711 }
关于如何获取jenkins token和user_id可参考前文:通过jenkins-Python在后台操作Jenkins构建job