如何让 Jenkins 识别从“步骤”调用的 Groovy 方法中的“阶段”节点?

问题描述 投票:0回答:1

我在 git SCM 中有一个由 Groovy 支持的 Jenkins 管道,其中

stage
中有
steps
。 我为什么这么做——为了重用代码。实际上,我们的可重用代码位于一个具有
stage
的常规方法中。我们从
steps
调用这个绝妙的方法。它导致
stage
节点在 blueocean 上被隐藏。它不会仅仅因为舞台是从
stage
调用而将
stage
视为
steps
。 下面是蓝海视图的样子。
Code Push and Test Execution stage
就是问题所在。代码如下所示-

tests = [:]
//code for other stages like Prepare, Initialize, Prepare App
stage('Test') {
            stages{
                stage('Cycle and Test Definition Prep') {
                    steps {
                        script {
                                //groovy code to populate tests variable
                                for (int i = 1; i <= NUMBER_OF_ORGS.toInteger(); ++i) {
                                def orgNumber = i;
                                tests['Org ' + orgNumber] = {
                                    processOrg(orgNumber, cycleKey, definitionKey, newCycleName, folderName)
                                }
                            }
                         }
                    }
                }
                stage('Code Push and Test Execution') {
                    steps {
                        script {
                            parallel tests
                        }
                    }
                }
            }
        }
    }

void processOrg(int orgNumber, String testCycleID, String testCycleDefinition, String newCycleName, String testResultFolder) {
    def orgUsername
    def directory

    stage ('Deployment' + orgNumber) {
        //some code
    }
}



我期待部署 1 等阶段显示为未发生的阶段。

PS:-我看到https://stackoverflow.com/a/57507753/6532664Jenkins管道中的节点、阶段和步骤有什么区别?但仍然想看看是否有办法出去。这是完美的工作,但只是没有显示在 blueocean 中,我有下行代码来检查失败阶段。现在,因为它不被识别为一个阶段,所以我的缺点代码无法工作。

jenkins-pipeline jenkins-groovy jenkins-blueocean
1个回答
0
投票

由于 blueocean 和 classic UI 中渲染阶段的逻辑不同而出现视觉问题

script {}
内的所有代码都将被视为“脚本化”管道

jenkins 经典 UI 显示“舞台名称”,而 blueocean 显示分支名称

tests['Org ' + orgNumber]
- 它是并行 code

的分支名称

在完美的情况下需要使用相同的阶段名称和分支名称进行并行

def tests = [:]

void processOrg(int orgNumber, String testCycleID, String testCycleDefinition, String newCycleName, String testResultFolder) {

    stage ('Deployment' + orgNumber) {
      //some code
    }
}

pipeline {
  agent any

  stages {
    stage('Test') {
      stages {
        stage('Cycle and Test Definition Prep') {
          steps {
            script {
                //groovy code to populate tests variable
                for (int i = 1; i <= NUMBER_OF_ORGS.toInteger(); ++i) {
                  def orgNumber = i;
                  tests['Deployment' + orgNumber] = {
                    processOrg(orgNumber, cycleKey, definitionKey, newCycleName, folderName)
                  }
              }
            }
          }
        }
        stage('Code Push and Test Execution') {
          steps {
            script {
              parallel tests
            }
          }
        }
      }
    }
  }
}

使用 Map 作为 arg 会更好

void processOrg(Map args) {
  print("${args.orgNumber} ${args.testCycleID}")
}

并使用类似

def args = [orgNumber: 1, testCycleID: "111"]
processOrg(args)

processOrg(orgNumber: 1, testCycleID: "111")
© www.soinside.com 2019 - 2024. All rights reserved.