如何使用 Groovy 获取声明性 jenkins 管道中每个阶段正在运行的代理?

问题描述 投票:0回答:2

我正在尝试获取每个阶段正在运行的代理名称。我可以通过使用 env.NODE_NAME 来获取此信息,但随后我必须在每个阶段块中编写一些代码以从该阶段捕获 env.NODE_NAME。 相反,我尝试通过 PipelineNodeGraphVisitor 获取阶段类型 FlowNodes,并获取这些阶段 flowNode 正在执行的代理,从而在一个位置捕获所有阶段的代理。我读到了有关使用 WorkSpaceAction 来获取代理节点的信息,并且我能够通过此获取代理。 由于我的管道仅在管道级别定义了一个代理,因此我发现每个阶段都使用相同的代理。因此,我尝试使用不同的代理,例如一个阶段的“测试”,并希望通过 WorkSpaceAction 为该阶段获得不同的代理,但我得到的代理与管道级别定义的代理相同,而不是管道级别定义的代理。 “测试”代理。

有知道的请帮忙。我已经被这个问题困扰了很长一段时间了。

这是我使用的常规代码:

 WorkflowRun run = Jenkins.instance.getItemByFullName(env.JOB_NAME)._getRuns()[0]
  FlowExecution exec = run.getExecution()
  PipelineNodeGraphVisitor visitor = new PipelineNodeGraphVisitor(run)
  def flowNodes = visitor.getPipelineNodes()

  for (Iterator iterator = flowNodes.iterator(); iterator.hasNext();)
  {
    def node = iterator.next()
    if (node.getType() == FlowNodeWrapper.NodeType.STAGE) //Get Stage Type flownodes
    {
      String stageName = node.getDisplayName()
      print "${stageName}"
     
      for (FlowNode enclosing : node.getNode().iterateEnclosingBlocks()) {
        WorkspaceAction ws = enclosing.getAction(WorkspaceAction.class)
        if (ws != null) {
           print "${ws.getNode()}"
        }
      }
    }
  }
jenkins groovy jenkins-pipeline jenkins-groovy
2个回答
0
投票

您需要从 FlowNodeWrapper 中解开节点,然后获取执行,然后使用 FlowGraphWalker 获取某个阶段包含的所有节点:

PipelineNodeGraphVisitor visitor = new PipelineNodeGraphVisitor(run)
def flowNodes = visitor.getPipelineNodes()

for (flowNode in flowNodes) {
  def node = flowNode.node
  def exec = node.execution
  def graphWalker = new FlowGraphWalker(exec)
  for (subNode in graphWalker) {
     if (subNode.allEnclosingIds.contains(node.id)) {
       def ws = subNode.getAction(WorkspaceAction.class)
       if (ws != null) {
         steps.echo "$subNode.displayName runs on ${ws.node}"
       }
     }
  }
}

0
投票

在这里修改答案,在这个问题中,经过大量的试验和错误,我想出了以下对我有用的内容(我无法导入 PipelineNodeGraphVisitor 或 FlowNodeWrapper):

import org.jenkinsci.plugins.workflow.flow.FlowExecution
import org.jenkinsci.plugins.workflow.actions.WorkspaceAction
import org.jenkinsci.plugins.workflow.support.visualization.table.FlowGraphTable

job = Jenkins.instance.getItemByFullName("my.pipeline.job")
if (job) {
    runs = job._getRuns()
    runs.each { run ->
        FlowExecution exec = run.getExecution()
        FlowGraphTable t = new FlowGraphTable(run.execution)
        t.build()

        for (def row in t.rows) {
            ws = row.node.getAction(WorkspaceAction)
            if (ws) {
                println ("${row.node.displayName}  :: ${row.node.url} :: ${ws.getNode()}\n")
                break
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.