gpt4 book ai didi

Jenkins 管道 : return value of build step

转载 作者:行者123 更新时间:2023-12-03 21:20:43 27 4
gpt4 key购买 nike

在 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() 的 getter或 getNumber()我可以用这个。

但是我怎么知道返回对象的确切类以及我可以调用它的方法列表?这似乎从 Pipeline documentation 中丢失了.我特别要求这种情况,但一般来说,我怎么知道返回对象的类及其文档?

最佳答案

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

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 steps reference ,或者只是在互联网上搜索
  • 来自 plugin site ,转至 source code repository
  • 搜索步骤名称的字符串文字,并找到返回它的步骤类型。在这种情况下,它看起来来自 the BuildTriggerStep class, which extends AbstractStepImpl

    @Override
    public String getFunctionName() {
    return "build";
    }
  • the nested DescriptorImpl to see what execution class is returned

    public DescriptorImpl() {
    super(BuildTriggerStepExecution.class);
    }
  • 转至 BuildTriggerStepExecution and look at the execution body in the start() method
  • 阅读全文 workflow step README显示某事应该调用 context.onSuccess(value)返回结果。该文件中有一个地方,但这仅在“无等待”情况下,它总是立即返回并且是 null ( source )。

    if (step.getWait()) {
    return false;
    } else {
    getContext().onSuccess(null);
    return true;
    }
  • 好的,所以它没有在步骤执行中完成,所以它必须在其他地方。我们还可以在存储库中搜索 onSuccess看看还有什么可能从这个插件触发它。 We find that a RunListener implementation handles setting the result asynchronously for the step execution if it has been configured that way:

    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结果来自
  • 关于 Jenkins 管道 : return value of build step,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51103359/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com