如何从Jenkins获得JSON格式的当前正在运行的作业列表?

ztmd8pv5  于 2022-11-02  发布在  Jenkins
关注(0)|答案(7)|浏览(246)

我可以通过远程API找到Jenkins服务器的所有信息,但无法找到当前正在运行的作业列表。
这,

http://my-jenkins/computer/api/json

http://my-jenkins/computer/(master)/api/json

这似乎是最合理的选择,但它们没有说明(除了作业数)哪些作业实际正在运行。

bgibtngc

bgibtngc1#

在Jenkins中,jobsbuild经常混淆,特别是因为jobs经常被称为“build jobs”。

*作业(或“生成作业”或“项目”)包含描述要运行的内容以及如何运行的配置。
*组建是工作的执行项目。组建包含开始和结束时间、状态、记录日志等相关信息。

如需详细信息,请参阅https://wiki.jenkins-ci.org/display/JENKINS/Building+a+software+project
如果您需要当前正在构建的作业(即,具有一个或多个正在运行的构建),最快的方法是使用REST API和XPath来过滤以_anime结尾的颜色,如下所示:

http://jenkins.example.com/api/xml?tree=jobs[name,url,color]&xpath=/hudson/job[ends-with(color/text(),%22_anime%22)]&wrapper=jobs

会给予你这样的信息:

<jobs>
  <job>
    <name>PRE_DB</name>
    <url>http://jenkins.example.com/job/my_first_job/</url>
    <color>blue_anime</color>
  </job>
  <job>
    <name>SDD_Seller_Dashboard</name>
    <url>http://jenkins.example.com/job/my_second_job/</url>
    <color>blue_anime</color>
  </job>
</jobs>

Jenkins使用color字段来指示作业的状态,其中_anime后缀指示作业当前正在生成。
不幸的是,这不会给予你任何关于实际运行的build的信息。作业的多个示例可能同时运行,并且运行的build不总是最后启动的。
如果您想列出所有正在运行的构建,您也可以使用REST API来快速获得答案,如下所示:

http://jenkins.example.com/computer/api/xml?tree=computer[executors[currentExecutable[url]],oneOffExecutors[currentExecutable[url]]]&xpath=//url&wrapper=builds

会给予你这样的东西:

<builds>
  <url>http://jenkins.example.com/job/my_first_job/1412/</url>
  <url>http://jenkins.example.com/job/my_first_job/1414/</url>
  <url>http://jenkins.example.com/job/my_second_job/13126/</url>
</builds>

在这里你可以看到一个当前正在运行的构建的列表。你需要解析URL来区分作业名称和构建号。注意my_first_job有两个当前正在运行的构建。

rbl8hiat

rbl8hiat2#

我有一个使用View Job Filters Plugin定义的视图,它只过滤当前正在运行的作业,然后你可以在视图页面上使用/api/json来只查看正在运行的作业。

更新

选择 * 编辑视图 * →*作业筛选器添加作业筛选器 * ▼构建状态过滤器

  • 建立状态 *: * 当前正在建设 *
  • 匹配类型 *: * 排除不匹配项-... *
jgwigjjp

jgwigjjp3#

有点小技巧,但我认为当你在/jenkins/api/json?pretty=true上执行GET时,你可以通过查看作业对象中的颜色键来推断当前正在运行哪些作业。如果Jenkins中给定作业的“球”图标是动画的,我们就知道它正在运行。
查看JSON响应中的作业对象数组:

{
 ...
  "jobs" : [
    {
      "name" : "Test Job 1",
      "url" : "http://localhost:8000/jenkins/job/Test%20Job%201/",
      "color" : "blue"
    },
    {
      "name" : "Test Job 2",
      "url" : "http://localhost:8000/jenkins/job/Test%20Job%202/",
      "color" : "blue_anime"
    }
  ...
}

在这种情况下,"color" : "blue_anime"表示作业当前正在运行,"color" : "blue"表示作业未运行。
希望这对你有帮助。

kse8i1jr

kse8i1jr4#

元帅输出和过滤器为“建筑:true”,以过滤掉无关的内容(希望这有帮助):

http://jenkins.<myCompany>.com/job/<myJob>/api/json?pretty=true&depth=2&tree=builds[builtOn,changeSet,duration,timestamp,id,building,actions[causes[userId]]]

会给予你这样的信息:

{
  "builds" : [
{
  "actions" : [
    {

    },
    {
      "causes" : [
        {
          "userId" : "cheeseinvert"
        }
      ]
    },
    {

    },
    {

    },
    {

    },
    {

    }
  ],
  "building" : true,
  "duration" : 0,
  "id" : "2013-05-07_13-20-49",
  "timestamp" : 1367958049745,
  "builtOn" : "serverA",
  "changeSet" : {

  }
}, ...
a5g8bdjr

a5g8bdjr5#

您可以使用Jenkins树API来实现这一点,使用如下所示的端点:

http://<host>/api/json?tree=jobs[name,lastBuild[building,timestamp]]

如果访问<job-endpoint>/lastBuild/api/json,您可以看到可以使用lastBuild中的哪些属性。

e1xvtsh3

e1xvtsh36#

我也遇到过类似的问题,在我重新启动jenkins之后,一些pipeline构建陷入了building状态(pipeline作业应该是持久的,可以恢复,但大多数时候它们会无限期地陷入)。
这些构建不使用执行程序,因此找到它们的唯一方法是打开每个作业。
当项目被视为正在建设时,所有其他答案似乎都适用,即:最后一个版本仍在构建。2但他们忽略了过去的版本仍在构建。
下面的查询对我很有效,它为我提供了所有当前正在运行的版本,即:它们没有结果。
http://localhost:8080/api/xml?tree=jobs[name,builds[fullDisplayName,id,number,timestamp,duration,result]]&xpath=/hudson/job/build[count(result)=0]&wrapper=builds

i7uaboj4

i7uaboj47#

没有什么工作我正常。我复制和修改的代码形式python-jenkins。因为主节点名称改变,它是给予例外。不想依赖插件。

def get_running_builds():
builds = []
        nodes = server.get_nodes()
        for node in nodes:
            # the name returned is not the name to lookup when
            # dealing with master :/
            if node['name'] == 'Built-In Node':
                continue
            if node['name'] == 'master':
                node_name = '(master)'
            else:
                node_name = node['name']
            try:
                info = server.get_node_info(node_name, depth=2)
            except server.JenkinsException as e:
                # Jenkins may 500 on depth >0. If the node info comes back
                # at depth 0 treat it as a node not running any jobs.
                if ('[500]' in str(e) and
                        server.get_node_info(node_name, depth=0)):
                    continue
                else:
                    raise
            for executor in info['executors']:
                executable = executor['currentExecutable']
                if executable and 'number' in executable:
                    #print(f'{executable}')
                    executor_number = executor['number']
                    build_number = executable['number']
                    url = executable['url']
                    m = re.search(r'/job/([^/]+)/.*', urlparse(url).path)
                    job_name = m.group(1)
                    builds.append({'name': executable['fullDisplayName'],
                                   'number': build_number,
                                   'url': url,
                                   'node': node_name,
                                   'executor': executor_number,
                                   'timestamp': executable['timestamp']})

        return builds

时间戳以毫秒为单位给出时间。

相关问题