一步步玩转测试平台开发(六):如何通过Python获取Jenkins Job信息

现在一般玩持续集成大部分都离不开Jenkins或者Gitlab CI(目前正学习摸索中)这两个核心工具,如果在整个过程中要引入测试平台做为测试过程的载体,那么就肯定离不开测试平台与这两个工具的交互操作。本文主要讲述如何利用python通过Jenkins API读取Jenkins的构建Job信息

百度了一下目前python版本的API主要有两个第三方包:

1、JenkinsApi

2、Python-Jenkins

通过实际使用体验,无论从功能还是易用性上,我最后选择了Pyhon-Jenkins。下面是我在使用中经常会碰到的几个场景:

首先安装Pyhon-Jenkins包:

pip install python-jenkins 或者 pip3 install python-jenkins

引入Pyhon-Jenkins包:

from jenkins import Jenkins

通过实例化一个jenkins对象来实现连接Jenkins服务器:

url='http://xxxxx.xxxxx.com/' #jenkins服务器链接
username='xxxxxxxxx' #登录jenkins服务器用户名
password='xxxxxxxxx' #登录jenkins服务器密码

server= Jenkins(url,username,password) #实例化jenkins对象

获取Jenkins服务器上所有Job个数:

server.jobs_count()

返回所有的job,列表格式,(下面两个方法作用一样,返回的结果也是一样的):

server.get_jobs()
server.get_all_jobs()

返回的结果(假如当前服务器上只有两个job为例):

[{'_class': 'hudson.maven.MavenModuleSet', 'name': 'job-name-1', 'url': 'http://xxxxx.xxxxx.com/job/job-name-1/', 'color': 'blue', 'fullname': 'job-name-1'}, {'_class': 'hudson.maven.MavenModuleSet', 'name': 'job-name-2', 'url': 'http://xxxxx.xxxxx.com/job/job-name-2/', 'color': 'blue', 'fullname': 'job-name-2'}]

获取某一个Job的信息

job_name = "job-name-1"   # Job名称
server.get_job_info(job_name)    # 返回一个很长的json数据串
server.debug_job_info(job_name)   # 易读模式,只展示key value

获取job的环境变量:

Jenkins的job每一次构建,都会生成该次构建的环境变量表。这个变量包含了默认的一些环境变量,同时也包含了你在该Job设置的一些参数,如带参数构建时的参数变量,一些布尔值之类的设置。

根据持续集成的方案,很多情况都是这个构建有可能会触发另一个job的构建执行,也有可能触发一个外接系统的接口服务传递一些参数和数据。这种情况,你有可能就会涉及到传递构建参数变量。那么如何获取这些环境变量呢? jenkins-job环境变量.jpg

通过如下方法就能获取到这个环境变量的表:

job_name = "job-name-1" # Job名称
lastbuildNumber=server.get_job_info(job_name)['lastBuild']['number'] # 获取该job的最后一次构建序号
env_map=server.get_build_env_vars(job_name,lastbuildNumber)['envMap'] # 获取该job最后一次构建的环境变量表
job_base_name = env_map['JOB_BASE_NAME'] # 获取JOB_BASE_NAME变量值
build_id = env_map['BUILD_ID'] # 获取BUILD_ID变量值

获取该次构建的控制台输出结果:

有些情况你无法从环境变量中获取到的信息,只能在该次构建的控制台输出结果中寻找可能。

比如:想获取该次构建的gitlab分支信息和注释信息,由于我们是手动触发构建,并没有采用gitlab webhook的方式自动构建jenkins任务,这个时候环境变量表是不会存在任何该次构建的分支信息和分支注释信息。(这里的潜台词,如果是采用gitlab webhook自动触发构建的话,在环境变量中你就能看到分支相关的信息,然后采用上述的方式获取你想要的数据)

可如果我获取不到分支相关的信息,我就无法知道该次构建到底针对是哪个版本,也就更别想后面的报告数据分析了。于是我就在jenkins上各种找,最后的最后我欣喜的发现,可以从每次构建的控制输出中找到分支相关的信息。如下图: jenkins-job控制台输出.jpg

呵呵,知道了从哪去找了,也知道信息所在的位置了,剩下的那就好办了,于是方法如下:

job_name = "job-name-1" # Job名称
lastbuildNumber=server.get_job_info(job_name)['lastBuild']['number'] # 获取该job的最后一次构建序号
job_console_output=server.get_build_console_output(job_name,lastbuildNumber) # 获取该job的最后一次构建的控制台输出结果(文本格式)

for line in job_console_output.splitlines():
      if line.startswith("CheckingoutRevision"): #获取该次构建的版本分支信息
           branch_info=line.split("(")[1].split("/")[-1][:-1]
           print("迭代分支:*/%s" % branch_info)
           continue

      if line.startswith("Commitmessage"): #获取该次构建的版本分支注释
           branch_comments=line.split('"')[1].strip()
           print("分支注释:%s"%branch_comments)
           break

以上就是我在实际工作中测试平台获取jenkin job构建信息的高频率场景下的方法,希望本文能给你带来帮助。