我正在尝试使构建管道更有用,并且如果尚未完成以前的构建,我需要一种方法来终止它们。
我有下一个工作定义:
pipeline {
stages {
stage('A'){...}
stage('B'){...}
stage('C'){...}
}
}
如果所有先前的构建不在“ C”阶段,我需要终止所有构建。
我使用Jenkins API获取特定工作的先前版本:
@NonCPS
def cancelPreviousBuilds() {
def buildNumber = env.BUILD_NUMBER.toInteger()
def currentJob = Jenkins.getInstance().getItemByFullName(env.JOB_NAME)
currentJob.builds
.find{ build -> build.isBuilding() && build.number.toInteger() < buildNumber && currentStageName(build) != 'C' }
.each{ build -> build.doStop() }
}
因此,我当前的选择器是currentStageName
函数的实现。
我无法获得舞台的名称。
我已经找到了一些代码,但是对我来说不合适:
@NonCPS
def currentStageName(currentBuild) {
FlowGraphWalker walker = new FlowGraphWalker(currentBuild.getExecution())
for (FlowNode flowNode: walker) {
if(flowNode.isActive()) {
return flowNode.getDisplayName();
}
}
}
FlowNode对象不包含阶段名称,它在内部包含更狭窄的流程步骤。
所以问题是: 如何获得特定詹金斯工作的先前构建的当前阶段?
答案 0 :(得分:0)
给定一个 FlowNode
,您可以通过检查是否 node instanceof StepEndNode
来检查它是否是阶段的开始。如果是,您可以使用其 LabelAction
类来获取阶段的名称:
static String getLabel(FlowNode node) {
LabelAction labelAction = node.getAction(LabelAction.class);
if (labelAction != null) {
return labelAction.getDisplayName();
}
return null;
}
我认为它对您的情况没有用,但您也可以通过查找相应的起始节点从标记阶段结束的节点(StepEndNode
)获取它:
FlowNode startNode = ((StepEndNode) node).getStartNode();