Jenkinsfile'并行'指令

时间:2017-05-11 11:09:45

标签: jenkins jenkins-pipeline

我正在尝试编写一个Jenkinsfile并行执行一系列步骤。目标是有两个agents(又名。nodes)。一个应该做一个Windows构建,另一个应该是Linux构建。但是,我不希望这种情况顺序发生,而是并行发生。我正在尝试查找Pipeline - Parallel execution of tasks中描述的parallel指令的文档。

我在Jenkins上发现了一个parallel一个,但似乎文档被破坏了:https://jenkins.io/doc/pipeline/steps/workflow-cps/

parallel: Execute in parallel

org.kohsuke.stapler.NoStaplerConstructorException: 
    There’s no @DataBoundConstructor on any constructor of class
    org.jenkinsci.plugins.workflow.cps.steps.ParallelStep

我应该如何设置一个可以在两个不同代理(一个linux,一个窗口)上并行执行一系列构建步骤的Jenkins文件?

特别是,我应该使用基于声明或基于脚本的管道DSL吗?

2 个答案:

答案 0 :(得分:10)

您可以使用声明式或基于脚本来执行并行工作。可以在此处找到基于脚本的并行文档:https://jenkins.io/doc/book/pipeline/jenkinsfile/#advanced-scripted-pipeline

他们给出了以下例子......

stage('Build') {
    /* .. snip .. */
}

stage('Test') {
    parallel linux: {
        node('linux') {
            checkout scm
            try {
                unstash 'app'
                sh 'make check'
            }
            finally {
                junit '**/target/*.xml'
            }
        }
    },
    windows: {
        node('windows') {
            /* .. snip .. */
        }
    }
}

对于声明,我相信你会这样做:

stage('Build') {
    steps {
        parallel (
            "Windows" : {
                echo 'done'
            },
            "Linux" : {
                echo 'done'
            }
        )
     }
}  

答案 1 :(得分:2)

Declarative Matrix是用于运行并行任务的一项出色功能。它允许您为矩阵指令中定义的每个配置执行定义的阶段(包括后构建操作),而无需重复代码。

示例:

pipeline {
    agent none
    stages {
        stage('Test') {
            matrix {
                agent {
                    label "${PLATFORM}-agent"
                }
                axes {
                    axis {
                        name 'PLATFORM'
                        values 'linux', 'windows'
                    }
                }
                stages {
                    stage('Test') {
                        steps {
                            echo "Do Test for ${PLATFORM}"
                        }
                    }
                }
                post {
                    always {
                        junit "**/TEST-*.xml"
                    }
                }
            }
        }
    }
}

詹金斯blog post语录:

在没有矩阵的情况下创建的等效管道将很容易 倍,并且难以理解和维护。