Jenkins Pipeline中并行构建触发与等待同一项目中的同一作业

120次阅读
没有评论

问题描述

在Jenkins Pipeline中遇到了一个问题:他的测试流水线代码应该在不同的节点上运行2个构建,构建服务器名为build_servers。然而,实际情况是,虽然代码按预期在两个不同的节点上触发了构建,但构建却只提交了一个作业,而且tests['x']tests['y']都在等待同一个作业完成。他不明白为什么会出现这种情况。他希望每个tests['x']tests['y']都能触发一个独立的作业,即other_job2项目中会有两个作业,一个用于x,另一个用于y

解决方案

根据用户的描述,问题可能是在Jenkins Pipeline的脚本中没有为每个测试构建指定独立的参数,从而导致它们都等待相同的作业。以下是解决这个问题的可能方案:

方案

在Jenkins Pipeline的脚本中,为每个测试构建指定独立的参数,确保它们触发不同的作业实例。同时,需要处理并发导致的参数改变问题。

步骤1:修改Pipeline脚本

在Pipeline脚本中,为每个测试构建添加独立的参数。这将确保每个构建触发的是不同的作业。

pipeline {
    // ... 其他配置 ...

    stages {
        stage('1') {
            steps {
                script {
                    def tests = [:]
                    for (f in [ 'x', 'y' ]) {
                        tests["${f}"] = {
                            node('build_servers') {
                                // ... 其他步骤 ...

                                stage('Run other job') {
                                    script {
                                        def props = readProperties file: "wspace/params.txt"
                                        def fileParams = props.collect { string(name: it.key, value: it.value) }

                                        // 在这里为每个构建添加一个独立的参数
                                        build job: "other_job2", parameters: [fileParams, string(name: 'dummy', value: "${f}")], wait: true, propagate: true
                                    }
                                }
                            }
                        }
                    }
                    parallel tests
                }
            }
        }
    }
}

步骤2:处理并发导致的参数改变问题

由于并行构建可能导致参数改变,我们需要采取措施来防止参数的混淆。在循环内部为每个构建创建一个变量,以确保参数的独立性。

pipeline {
    // ... 其他配置 ...

    stages {
        stage('1') {
            steps {
                script {
                    def tests = [:]
                    for (f in [ 'x', 'y' ]) {
                        tests["${f}"] = {
                            node('build_servers') {
                                // ... 其他步骤 ...

                                // 在这里为每个构建创建独立的变量
                                def index = f

                                stage('Run other job') {
                                    script {
                                        def props = readProperties file: "wspace/params.txt"
                                        def fileParams = props.collect { string(name: it.key, value: it.value) }

                                        // 使用独立的变量作为参数,防止并发导致参数混淆
                                        build job: "other_job2", parameters: [fileParams, string(name: 'dummy', value: "${index}")], wait: true, propagate: true
                                    }
                                }
                            }
                        }
                    }
                    parallel tests
                }
            }
        }
    }
}

参考链接

如果需要更多的示例和用法,可以查看Jenkins官方文档的相关章节:https://www.jenkins.io/doc/pipeline/examples/#jobs-in-parallel

通过对Pipeline脚本的适当修改,您应该能够实现并行触发不同的构建作业,并避免参数改变导致的问题。请根据实际情况进行调整,并确保测试以验证所做的更改是否达到预期效果。

正文完