【问题标题】:How to get a list of Jenkins builds that ran at a particular time?如何获取在特定时间运行的 Jenkins 构建列表?
【发布时间】:2018-11-12 04:06:02
【问题描述】:

我现在的 Jenkins 有很多工作。不同的文件夹,每个文件夹都有多个作业。我最近看到一个 Jenkins slave(它是自动缩放的)在特定时间向另一台服务器发送了太多请求。但是,如果不手动检查它们,我无法找到在那个特定时间运行哪些构建。有没有办法使用 API/Groovy 脚本获取这些信息?

【问题讨论】:

  • 在我的回答中,您会找到一个简单的 python 脚本,它通过 Jenkins API 获取此信息。让我知道这是否适合您。

标签: jenkins jobs jenkins-slave jenkins-api


【解决方案1】:

我写了一个非常小的 bash 脚本在 jenkins 服务器上运行来解析日志文件。

仅查看作业开始时间是不够的。一项工作可能在您的时间窗口之前开始,甚至在您的时间窗口之后结束;它仍然会在您的时间窗口内运行。

#!/bin/bash
start=$1
end=$2

for build_xml in jobs/*/branches/*/builds/*/build.xml
do
        startTime=$(sed -n -e "s/.*<startTime>\(.*\)<\/startTime>.*/\1/p" $build_xml)
        modificationTime=$(date '+%s' -r $build_xml)
        if [[ $modificationTime > $start ]] && [[ $startTime < $end ]]
        then
                echo "START $(date -d @${startTime::-3})   END $(date -d @$modificationTime)   : $build_xml"
        fi
done

用法:

./getBuildsRunningBetween.sh 1565535639 1565582439

会给:

START Sun Aug 11 20:29:00 CEST 2019   END Sun Aug 11 20:30:20 CEST 2019   : jobs/job-name/branches/branch-name/builds/277/build.xml

【讨论】:

  • 如果作业/管道没有“分支”,从 for 循环中删除 branches/* 效果很好。
【解决方案2】:

使用下面的 Jenkins API,可以根据称为动画的颜色分类找到正在运行的作业。

"Jenkins 主机 url"/api/xml?tree=jobs[name,url,color]&xpath=/hudson/job[ends-with(color/text(),%22_anime%22)]&wrapper=jobs

蓝色的是正在运行的

蓝色动漫

【讨论】:

  • 我不想要当前正在运行的构建,而是从过去的一天构建。例如,如果我想查看昨天下午 1 点到 2 点(高负载时间)之间运行了哪些作业。我可以使用 API 来执行此操作吗?
【解决方案3】:

这可以通过简单的 python 脚本和 Jenkins JSON REST API 轻松实现。

1.先决条件

已安装 Python 2.7 或 3.x 和 python requests 库:

pip install requests

对于 python 3.x

pip3 install requests

还有:How to install pip

2.Python 脚本获取日期之间的构建

import requests
from datetime import datetime


jenkins_url = "JENKINS_HOST"
username = "USERNAME"
password = "PASSWORD"
job_name = "JOB_NAME"
stop_date = datetime.strptime('23.11.2018 0:30:00', "%d.%m.%Y %H:%M:%S")        
start_date = datetime.strptime('10.11.2018 18:46:04', "%d.%m.%Y %H:%M:%S") 
request_url = "{0:s}/job/{1:s}/api/json{2:s}".format(
    jenkins_url,
    job_name,
    "?tree=builds[fullDisplayName,id,number,timestamp,url]"
)

response = requests.get(request_url, auth=(username, password)).json()
builds = []

for build in response['builds']:
    build_date = datetime.utcfromtimestamp(build['timestamp']/1000)
    if build_date >= start_date and build_date <= stop_date:
        builds.append(build)
        print("Job name: {0:s}".format(build["fullDisplayName"]))
        print("Build number: {0:d}".format(build["number"]))
        print("Build url: {0:s}".format(build["url"]))
        print("Build timestamp: {0:d}".format(build["timestamp"]))
        print("Build date: {}\n".format(build_date))

以上脚本适用于 python 2.7 和 3.x。现在稍微解释一下:

首先使用 JSON API 下载所有构建数据并将响应加载为 JSON。然后对于每个构建将其时间戳转换为日期时间并与开始和停止日期进行比较。请注意,将时间戳除以 1000 以获得秒而不是毫秒很重要(否则从时间戳转换日期会引发 ValueError)。

示例输出:

$ python test.py 
Job name: Dummy #21
Build number: 21
Build url: http://localhost:8080/job/Dummy/21/
Build timestamp: 1541875585881
Build date: 2018-11-10 18:46:25

Job name: Dummy #20
Build number: 20
Build url: http://localhost:8080/job/Dummy/20/
Build timestamp: 1541875564250
Build date: 2018-11-10 18:46:04

另一方面,如果您想以不同的格式提供开始和结束日期,请记住您需要在strptime() 函数中调整格式参数。 Python datetime directives.

几个例子:

datetime.strptime("23.11.2018", "%d.%m.%Y")
datetime.strptime("2018.11.23", "%Y.%m.%d")
datetime.strptime("Jun 1 2005  1:33PM", "%b %d %Y %I:%M%p")

3.Python 脚本获取确切日期的构建

如果您有兴趣按确切日期查找构建,只需替换此行:

if build_date >= start_date and build_date <= stop_date:

用这个:

if build_date == date:

date 是特定的构建日期。

请注意!如果您想按确切日期查找构建,您需要提供正确格式的date。在这种情况下,它是"%d.%m.%Y %H:%M:%S"。示例:

datetime.strptime('10.11.2018 18:46:04', "%d.%m.%Y %H:%M:%S")

否则,即使对于 python 的某个点(分钟、小时、日期等)而言,日期将相同,但它不会是相等的日期。

如果您想提供另一种格式,则需要针对build_date 变量进行调整。

build_date.strftime('%d %m,%Y')

【讨论】:

  • 如果您知道构建,这很好,但我相信 OP 要求在时间窗口内查找任何构建,因为他们不知道哪个构建可能会发出恶意请求。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多