groovy Jenkins管道:返回构建步骤的值

vulvrdjw  于 2022-11-01  发布在  Jenkins
关注(0)|答案(2)|浏览(267)

在Jenkins的集成管道中,我使用the build step并行触发不同的构建,如下所示:

stage('trigger all builds')
{
  parallel
  {
    stage('componentA')
    {
      steps
      {
        script 
        {
          def myjob=build job: 'componentA', propagate: true, wait: true
        }
      }
    }
    stage('componentB')
    {
      steps 
      {
        script
        {
          def myjob=build job: 'componentB', propagate: true, wait: true
        }
      }
    }
  }
}

我想访问build步骤的返回值,这样我就可以知道在我的Groovy脚本中触发了什么作业名称和编号。
我在示例中发现,返回的对象具有类似getProjectName()getNumber()的getter,我可以使用这些getter。
但是我如何知道返回对象的确切类以及我可以在其上调用的方法的列表呢?这似乎是Pipeline documentation中缺少的。我特别针对这种情况进行询问,但是一般来说,我如何知道返回对象的类以及它的文档?

j2cgzkjk

j2cgzkjk1#

步骤文档是基于插件捆绑的一些文件生成的,有时候这还不够。一个简单的方法是通过调用getClass打印结果对象的class

def myjob=build job: 'componentB', propagate: true, wait: true
echo "${myjob.getClass()}"

此输出将告诉您结果(在本例中)是org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper,其中包含published Javadoc
对于其他情况,我通常不得不深入研究Jenkins源代码。下面是我的一般策略:

  • 通过步骤文档、jenkins.io步骤参考或者只是搜索互联网来确定步骤来自哪个插件
  • plugin site转到source code repository
  • 搜索步骤名称的String文字,并找到返回该文字的步骤类型。
@Override
public String getFunctionName() {
    return "build";
}
  • 查看嵌套的DescriptorImpl,查看返回了什么执行类
public DescriptorImpl() {
    super(BuildTriggerStepExecution.class);
}
  • 转到BuildTriggerStepExecution并查看start()方法中的执行体
  • 阅读工作流步骤README,可以看到应该调用context.onSuccess(value)来返回结果。在该文件中有一个地方,但那只是在“no-wait”情况下,它总是立即返回,并且是null(源代码)。
if (step.getWait()) {
    return false;
} else {
    getContext().onSuccess(null);
    return true;
}
  • 好的,它没有在步骤执行中完成,所以它一定在其他地方。我们也可以在仓库中搜索onSuccess,看看还有什么可以从这个插件中触发它。我们发现,如果RunListener实现已经被配置为异步地为步骤执行设置结果:
for (BuildTriggerAction.Trigger trigger : BuildTriggerAction.triggersFor(run)) {
    LOGGER.log(Level.FINE, "completing {0} for {1}", new Object[] {run, trigger.context});
    if (!trigger.propagate || run.getResult() == Result.SUCCESS) {
        if (trigger.interruption == null) {
            trigger.context.onSuccess(new RunWrapper(run, false));
        } else {
            trigger.context.onFailure(trigger.interruption);
        }
    } else {
        trigger.context.onFailure(new AbortException(run.getFullDisplayName() + " completed with status " + run.getResult() + " (propagate: false to ignore)"));
    }
}
run.getActions().removeAll(run.getActions(BuildTriggerAction.class));
  • trigger.context.onSuccess(new RunWrapper(run, false));RunWrapper结果的来源
ztyzrc3y

ztyzrc3y2#

下游作业的结果在返回对象的result属性中给出。
我建议使用propagate: false来控制下游作业的结果如何影响当前构建。
示例:

pipeline{
    [...]
    stages {
        stage('Dummy') {
            steps {
                echo "Hello world #1"
            }
        }
        stage('Fails') {
            steps {
                script {
                    downstream = build job: 'Pipeline Test 2', propagate: false
                    if (downstream.result != 'SUCCESS') {
                        unstable(message: "Downstream job result is ${downstream.result}")
                    }
                }

            }
        }
    }
    [...]
}

只要下游生成不成功,这将设置导致当前生成变为UNSTABLE。
有关其他问题,请参阅Is there a built-in function to print all the current properties and values of an object?Groovy / grails how to determine a data type?

相关问题