在运行时获取Jenkinsfile并行阶段中的子阶段名称列表

hiz5n14c  于 2022-11-21  发布在  Jenkins
关注(0)|答案(1)|浏览(139)

我有一个运行集成测试的Jenkinsfile,它运行得很好,除了我的测试数据是硬编码的,可能会更改。
我已经创建了一个步骤来一次获取所有步骤的测试数据,以避免使用,目的是更快地并行运行集成测试。
如果我想在pre-step中获取所有的测试数据,并获取stage('Integration Tests')下每个阶段的数据,我需要计算出在运行jenkins流水线时有多少个子阶段。这可能吗?

stage('Integration Tests'){           
            parallel {
                stage('TestGroup 1'){
                    steps {
                        script {
                            sh  script: 'npm run some-init-func'
                            sh  script: 'npm run newman-run-collection --collection_file="100 tests.postman_collection.json"'
                            sh  script: 'npm run newman-run-collection --collection_file="110 more tests.postman_collection.json"'
                        }
                    }
                    post {
                        always {
                            junit 'newman/*.xml'
                            archiveArtifacts artifacts: 'newman/*.html'
                        }
                    }
                }
                stage('TestGroup 2'){
                    steps {
                        script {
                            sh  script: 'npm run some-init-func'
                            sh  script: 'npm run newman-run-collection --collection_file="200 tests.postman_collection.json"'
                            sh  script: 'npm run newman-run-collection --collection_file="210 even more tests.postman_collection.json"'
                        }
                    }
                    post {
                        always {
                            junit 'newman/*.xml'
                            archiveArtifacts artifacts: 'newman/*.html'
                        }
                    }
                }
            }
3qpi33ja

3qpi33ja1#

我看到了两种方法:编写一些Groovy代码或重构管道。

选项01

您可能可以将Pipeline重构为类似下面的内容。

pipeline {
    agent any
    stages {
        stage('Tests') {
            steps {
                script {
                    println getParallelStages().size()
                    parallel getParallelStages()
                }
            }
        }
    }
}

def getParallelStages() {
    return ["Group1": {stage('TestGroup 1'){
                        script {
                            sh  script: 'npm run some-init-func'
                            sh  script: 'npm run newman-run-collection --collection_file="100 tests.postman_collection.json"'
                            sh  script: 'npm run newman-run-collection --collection_file="110 more tests.postman_collection.json"'
                        }
                    post {
                        always {
                            junit 'newman/*.xml'
                            archiveArtifacts artifacts: 'newman/*.html'
                        }
                    }
                }}, 

                "Group2": {stage('TestGroup 2'){
                        script {
                            sh  script: 'npm run some-init-func'
                            sh  script: 'npm run newman-run-collection --collection_file="200 tests.postman_collection.json"'
                            sh  script: 'npm run newman-run-collection --collection_file="210 even more tests.postman_collection.json"'
                        }
                    post {
                        always {
                            junit 'newman/*.xml'
                            archiveArtifacts artifacts: 'newman/*.html'
                        }
                    }
                }
              }
        ]
}

选项02

这里有一种使用Groovy实现这一点的方法。让我们假设您有一个唯一的名称,它带有子阶段的公共前缀。在这种情况下,您可以读取管道定义并计算存在的唯一字符串。类似于下面的方法。

// Get the script
def jobInfo = Jenkins.instance.getItemByFullName("$JOB_NAME").getDefinition().getScript()
// Count the stages
println jobInfo.count("TestGroup ")

相关问题