【问题标题】:How can I retrieve dynamically-named stashes in a Jenkins pipeline?如何在 Jenkins 管道中检索动态命名的存储?
【发布时间】:2022-11-09 20:47:08
【问题描述】:

我有一个 Jenkins 管道,它使用 matrix 指令在不同的工作人员中针对各种环境运行一套自动化测试。最后,我想将各种测试套件运行的代码覆盖率输出合并到一个文件中收集它们,以确保结果准确。这听起来应该很简单:

  1. 对于每个矩阵单元格,根据矩阵单元格的值,使用唯一的存储名称存储覆盖范围输出文件。
  2. 测试运行完成后,取消存储“主”工作器上的所有文件并将它们合并。

    但是,存储是动态命名的这一事实使第 2 步变得困难。这似乎给我留下了三个选择:

    • 对矩阵轴进行硬编码再次卸载时。不是特别吸引人。
    • 以编程方式检索矩阵轴。好像是应该有可能,但我不确定如何从代表矩阵阶段的FlowNodeWrapper 转到底层轴字符串。
    • 列出构建的所有存储,然后选择我想要的。如果可能的话,这也是一个可行的解决方案,因为存储名称遵循一种模式,但我什至不确定从哪里开始。在 Jenkins 问题板上有一个与此相关的 open issue,但它似乎不会很快发生变化。

    简而言之:我怎样才能做到这一点?我怎么能:

    • FlowNodeWrapper 转到矩阵轴?
    • 以不同的方式找到我的藏匿处?

【问题讨论】:

    标签: jenkins jenkins-pipeline jenkins-groovy


    【解决方案1】:

    1. 对于每个矩阵单元格,根据矩阵单元格的值,使用唯一的存储名称存储覆盖输出文件。

    正确的。我不熟悉matrix,所以我不确定如何获得唯一的名称,但在很多情况下你可以使用env.STAGE_NAME

    2. 测试运行完成后,将“主”worker 上的所有文件 unstash 并合并它们。

    在第 1 步中,跟踪您使用的存储名称。然后第2步很容易。

    使用脚本化管道,这很容易:

    def stashes = [:]
    …
    stage(…) {
        …
        String stash_name = env.STAGE_NAME
        stash stash_name, …
        stashes[stash_name] = 1
    }
    …
    stage('Coverage analysis') {
        for (stash_name in stashes) {
            unstash stash_name
        }
        …
    }
    

    我不知道这是否适用于声明性管道。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-01
      • 1970-01-01
      • 2021-06-09
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多