我正在尝试获取每个阶段正在运行的代理名称。我可以通过使用 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()}"
}
}
}
}
您需要从 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}"
}
}
}
}
在这里修改答案,在这个问题中,经过大量的试验和错误,我想出了以下对我有用的内容(我无法导入 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
}
}
}
}