我正在使用JenkinsAPI
来触发参数化的作业。我知道Jenkins使用的REST API,但是我们的设置不允许直接使用它。因此,对我来说,触发工作的主要手段就是通过该库。
到目前为止,我在服务器上查找作业或触发作业都没有问题,但是我遇到了2个问题
1)当我触发工作时,我不知道其结果。我假定在运行build_job
函数时将返回作业的输出,但事实并非如此。我需要知道该作业是否通过或失败,而且我找不到获取此信息的方法,因为触发该作业时我什至无法检索到该作业号。
2)尽管作业确实顺利通过,但作业运行时出现错误:
raise ValueError("Not a Queue URL: %s" % redirect_url)
我确实读了一点,似乎詹金斯正在http和https url之间切换,这使该库感到困惑。如果我理解正确,那么就可以认为它是詹金斯问题,因此在JenkinsAPI
方面还没有解决。
到目前为止,这是代码,它确实连接到我的jenkins服务器,确实检索了作业列表,确实触发了作业,但不允许我知道作业是否通过或失败,并且我得到了提到的错误较早。
有什么方法可以使它正常工作,以便我能获得所触发工作的通过/失败结果?
jenkins_url = 'http://myjenkins_host:8080'
# Create server
server = Jenkins(jenkins_url, username='user', password='123456789abcdef')
# Check job and print description
for job_name, job_instance in server.get_jobs():
if job_name == "testjob":
print('Job Name:%s' % job_instance.name)
print('Job Description:%s' % (job_instance.get_description()))
# Trigger job
params = {'a':1, 'b':2, 'c': True}
server.build_job("testjob", params)
# HOW do I get the result of this job???
答案 0 :(得分:1)
我不是Jenkins Python API的忠实拥护者,老实说,我什至没有使用过它。我个人更喜欢将原始JSON API与Python一起使用,这更适合我(这就是为什么我的示例将改为使用JSON API,但最终,目标仍通过python脚本实现)。
现在回答您的问题,您可以不时通过API查询作业状态和结果。但首先要注意。
1。先决条件
已安装Python 2.7或3.x和python requests库:
pip install requests
对于python 3.x
pip3 install requests
2.Python脚本来触发和跟踪结果
import requests
import time
jenkins_url = "http://localhost:8080"
auth = ("USERNAME", "PASSWORD")
job_name = "Dummy"
request_url = "{0:s}/job/{1:s}/buildWithParameters".format(
jenkins_url,
job_name,
)
print("Determining next build number")
job = requests.get(
"{0:s}/job/{1:s}/api/json".format(
jenkins_url,
job_name,
),
auth=auth,
).json()
next_build_number = job['nextBuildNumber']
next_build_url = "{0:s}/job/{1:s}/{2:d}/api/json".format(
jenkins_url,
job_name,
next_build_number,
)
params = {"Foo": "String param 1", "Bar": "String param 2"}
print("Triggering build: {0:s} #{1:d}".format(job_name, next_build_number))
response = requests.post(request_url, data=params, auth=auth)
response.raise_for_status()
print("Job triggered successfully")
while True:
print("Querying Job current status...")
try:
build_data = requests.get(next_build_url, auth=auth).json()
except ValueError:
print("No data, build still in queue")
print("Sleep for 20 sec")
time.sleep(20)
continue
print("Building: {0}".format(build_data['building']))
building = build_data['building']
if building is False:
break
else:
print("Sleep for 60 sec")
time.sleep(60)
print("Job finished with status: {0:s}".format(build_data['result']))
以上脚本适用于python 2.7和3.x。现在进行一些解释:
一开始,我们想解决将来构建的版本号,以便以后查询。在触发该构建之后,将检查响应是否有错误。 4XX客户端错误或5XX服务器错误响应将引发异常:requests.exceptions.HTTPError
。最后一步是,只要尚未完成,就查询触发的构建的状态。但是请注意,触发的构建可能会在队列中停留一段时间,因此try: except:
会阻塞代码。当然,您可以根据自己的需要调整time.sleep()
。
示例输出:
$ python dummy.py
Determining next build number
Triggering build: Dummy #55
Job triggered successfully
Querying Job current status...
No data, build still in queue
Sleep for 20 sec
Querying Job current status...
Building: True
Sleep for 60 sec
Querying Job current status...
Building: True
Sleep for 60 sec
Querying Job current status...
Building: False
Job finished with status: SUCCESS
!请注意!
根据您的Jenkins版本和安全设置,您可能会遇到以下错误:
requests.exceptions.HTTPError: 403 Client Error: No valid crumb was included in the request for url: ...
默认情况下,詹金斯启用了CSRF Protection,可防止one-click attacks。
要解决此问题,您可以:
/crumbIssuer/api/xml
获取面包屑,并将其包含在您的请求标头中。以上脚本仅需进行少量修改即可使用詹金斯面包屑:
crumb_data = requests.get(
"{0:s}/crumbIssuer/api/json".format(jenkins_url),
auth=auth,
).json()
headers = {'Jenkins-Crumb': crumb_data['crumb']}
然后将这些标头传递给请求,以触发新的构建,如下所示:
print("Triggering build: {0:s} #{1:d}".format(job_name, next_build_number))
response = requests.post(
request_url,
data=params,
auth=auth,
headers=headers,
)