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

2024-01-11

在 Jenkins 的集成管道中,我使用以下命令并行触发不同的构建构建步骤 https://jenkins.io/doc/pipeline/steps/pipeline-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() or getNumber()我可以用它来做这个。

但是我如何知道返回对象的确切类以及我可以调用它的方法列表?这似乎在管道文档 https://jenkins.io/doc/pipeline/steps/pipeline-build-step/。我特别要求这种情况,但一般来说,我如何知道返回对象的类及其文档?


步骤文档是根据与插件捆绑在一起的一些文件生成的,有时这还不够。一种简单的方法是打印出来class通过调用获得结果对象getClass https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#getClass--:

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

此输出会告诉您结果(在本例中)是org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper其中有已发布 Javadoc http://javadoc.jenkins.io/plugin/workflow-support/org/jenkinsci/plugins/workflow/support/steps/build/RunWrapper.html.

对于其他情况,我通常必须深入研究 Jenkins 源代码。这是我的总体策略:

  • 通过步骤文档找出该步骤来自哪个插件,jenkins.io 步骤参考 https://jenkins.io/doc/pipeline/steps/pipeline-build-step/#build-%20build%20a%20job,或者只是在互联网上搜索
  • 来自插件网站 https://plugins.jenkins.io/pipeline-build-step,转到源代码存储库 https://github.com/jenkinsci/pipeline-build-step-plugin
  • 搜索步骤名称的字符串文字,并找到返回它的步骤类型。在这种情况下,它看起来来自the BuildTriggerStep类,其中extends AbstractStepImpl https://github.com/jenkinsci/pipeline-build-step-plugin/blob/c82f48fb270ec96a3f6a84d6ad61ae214f572fe4/src/main/java/org/jenkinsci/plugins/workflow/support/steps/build/BuildTriggerStep.java#L124

    @Override
    public String getFunctionName() {
        return "build";
    }
    
  • Look at 嵌套的DescriptorImpl查看返回的执行类 https://github.com/jenkinsci/pipeline-build-step-plugin/blob/c82f48fb270ec96a3f6a84d6ad61ae214f572fe4/src/main/java/org/jenkinsci/plugins/workflow/support/steps/build/BuildTriggerStep.java#L85-L87

    public DescriptorImpl() {
        super(BuildTriggerStepExecution.class);
    }
    
  • Go to BuildTriggerStepExecution并查看执行体start() method https://github.com/jenkinsci/pipeline-build-step-plugin/blob/c82f48fb270ec96a3f6a84d6ad61ae214f572fe4/src/main/java/org/jenkinsci/plugins/workflow/support/steps/build/BuildTriggerStepExecution.java#L60-L148

  • 阅读全文工作流程步骤自述文件 https://github.com/jenkinsci/workflow-step-api-plugin/blob/master/README.md#creating-an-asynchronous-step表明应该调用一些东西context.onSuccess(value)返回结果。该文件中有一个地方,但那只是在“不等待”的情况下,它总是立即返回并且是null (source https://github.com/jenkinsci/pipeline-build-step-plugin/blob/c82f48fb270ec96a3f6a84d6ad61ae214f572fe4/src/main/java/org/jenkinsci/plugins/workflow/support/steps/build/BuildTriggerStepExecution.java#L142-L147).

    if (step.getWait()) {
        return false;
    } else {
        getContext().onSuccess(null);
        return true;
    }
    
  • 好的,所以它在步骤执行中没有竞争,所以它一定在其他地方。我们还可以在存储库中搜索onSuccess看看还有什么可能会从这个插件触发它。我们发现一个RunListener如果已这样配置,则实现会异步设置步骤执行的结果: https://github.com/jenkinsci/pipeline-build-step-plugin/blob/c82f48fb270ec96a3f6a84d6ad61ae214f572fe4/src/main/java/org/jenkinsci/plugins/workflow/support/steps/build/BuildTriggerListener.java#L44-L56

    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));
    
  • The trigger.context.onSuccess(new RunWrapper(run, false));是哪里RunWrapper结果来自

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jenkins 管道:构建步骤的返回值 的相关文章

  • 如何将参数从jenkins传递到selenium

    我正在使用詹金斯和硒 我需要将测试 url 从 jenkins 发送到 selenium 服务器 在常规选项卡下 詹金斯字符串参数 Name APP Default Value http localhost basecode 在构建后操作下
  • Hudson 和电子邮件通知

    我可以覆盖每个作业的 Hudson 设置 系统管理员电子邮件地址 吗 阅读了一些源代码http sorcerer jenkins ci org http sorcerer jenkins ci org and hudson tasks Ma
  • 在 Cloudbees Jenkins 文件夹中设置环境变量

    在我重新安装 Jenkins 和 Cloudbees Free Enterprise 插件后 Jenkins 文件夹中设置的环境变量停止工作并从配置 UI 中消失 但是 它仍然存在于文件系统上的 config xml 中 如下所示
  • 如何在gradle中复制文件?

    我正在尝试将战争档案部署到 Tomcat 中 这是我编写的构建脚本 apply plugin war task deploy dependsOn war copy from build libs into E apache tomcat 8
  • macOS 更新后 Jenkins 用户消失

    我在 Mac 上运行 Jenkins 作为 CI 服务器 使用用户 jenkins 的典型设置 它在 macOS 10 12 上运行良好 今天我将 macOS 升级到 10 13 High Sierra 升级过程完成后 Jenkins 无法
  • 在 jelly 脚本中使用 JavaScript

    我正在尝试在 Jenkins 中使用用 JavaScript 编写的脚本 我认为最简单的方法是在 jelly 脚本中调用它们 例如 我有文件 myCustom js alert Hello World function myFunction
  • Jenkins 管道和 java.nio.file.* 方法的问题

    我正在尝试使用 java nio file 中的方法在 Jenkins 管道中执行一些基本文件操作 无论代码存在于哪个节点块中 代码都在主节点上执行 在管道中 我已经验证了各个节点块都是正确的 它们唯一地标识了特定的节点 但是 pathEx
  • grails 中的 log4j:如何登录文件?

    我的 grails config groovy 中有这个 log4j 配置 log4j error org codehaus groovy grails web servlet controllers org codehaus groovy
  • Jenkins git 插件 - 有时太慢

    以下内容摘自 Jenkins 日志 00 00 03 135 gt git fetch tags progress email protected cdn cgi l email protection some org some repo
  • 无法安装企业应用程序 - 此配置文件无法安装在此设备上

    我正在设置 Jenkins 来构建应用程序的企业版本 以便在我们的内部应用程序商店中分发 如果我将应用程序存档在 Xcode 中 然后在手机上下载内置的 ipa 则应用程序安装不会出现任何问题 但是当我使用 Jenkins 生成的具有相同私
  • 如何在 JavaFX 中将 FontAwesome 升级到版本 5

    我有一个使用 FontAwesome 图标的 JavaFX 我想使用新版本 5 但似乎已经不起作用了 这是一个用 Groovy 编写的简单演示应用程序 可与旧版 FontAwesome 一起使用 import javafx applicat
  • 与赋值“=”和括号 { } 的使用混淆

    我是 gradle 的新手 对于 groovy 也是如此 我几乎不了解某些概念 并且真的不知道它是否与 groovy 或 gradle 相关 以及需要 google 哪些关键字来获取帮助 我经常被这样的事情绊倒 android some c
  • 如何在 Jenkins 声明式管道中设置 PATH

    在 Jenkins 脚本化管道中 您可以像这样设置 PATH 环境变量 node git url https github com jglick simple maven project with tests git withEnv PAT
  • Jenkins + Gradle + Artifactory:无法读取生成的构建信息

    我正在尝试使用 Jenkins Pipeline 调用 Gradle 工具 将我的工件推送到 Artifactory 我正在关注 GitHub 上发布的示例 Example1 https github com JFrogDev projec
  • groovy中bigdecimal的默认比例

    groovy 中 BigDecimal 的默认小数位数是多少 和四舍五入 因此 当尝试进行计算时 def x 10 0 30 0 0 3333333333 def y 20 0 30 0 0 6666666667 基于此 我可以假设它使用比
  • 访问 jelly 模板中的自定义环境变量

    使用 Jenkins 管道 您可以通过以下方式设置任何环境变量全局变量称为 env 果冻模板反过来 您可以访问 Jenkins API 包括hudson model AbstractBuild and hudson model Abstra
  • 如何在 WebStorm 中安装 Groovy 插件?

    我正在使用 WebStorm 进行开发 我想要为 Jenkins Groovy 管道提供语法突出显示 使用IntelliJ IDEA来编辑Jenkinsfile是可以的 但是在IDE之间来回切换显然很不方便 我可以安装吗Groovy 插件
  • Groovy - JsonSlurper 解析 JSON 文件

    我有一个类似于下面的 JSON 文档 我正在尝试在 Groovy 中解析它 基本上对于每所学校 学校信息 我想抓住SCHOOL COUNTRY和其他领域 我正在尝试下面的代码 但它没有返回我需要的内容 对于列出的每所学校 1 000 所 我
  • Jenkins 共享库 - 从 /vars 中的 /src 文件夹导入类

    我正在尝试为我的 CI 流程编写一个 Jenkins 共享库 我想引用一个类 src定义在全局函数内的文件夹 vars文件夹 因为它允许我将大部分逻辑放在类中而不是全局函数中 我遵循 Jenkins 官方文档中记录的存储库结构 Jenkin
  • 如何从容器内运行 podman?

    我想跑podman https podman io作为运行 CI CD 管道的容器 但是 我不断从 podman 容器中收到此错误 podman info ERRO 0000 overlay is not supported over ov

随机推荐