【问题标题】:Jenkinsfile 'parallel' directiveJenkinsfile“并行”指令
【发布时间】:2020-05-03 18:11:35
【问题描述】:

我正在尝试编写一个并行执行一系列步骤的Jenkinsfile。目标是拥有两个agents(又名nodes)。一个应该做一个windows build,另一个应该做一个linux build。但是,我不希望这种情况顺序发生,而是并行发生。我正在尝试查找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,一个 windows)上并行执行一系列构建步骤的 Jenkinsfile?

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

【问题讨论】:

    标签: jenkins jenkins-pipeline


    【解决方案1】:

    您可以使用声明式或基于脚本的方式进行并行工作。可以在此处找到基于脚本的并行文档: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'
                }
            )
         }
    }
    

    Declarative Pipeline 1.2 开始,首选的声明式语法是:

    pipeline {
        agent none
        stages {
            stage('Run Tests') {
                parallel {
                    stage('Test On Windows') {
                        agent {
                            label "windows"
                        }
                        steps {
                            bat "run-tests.bat"
                        }
                        post {
                            always {
                                junit "**/TEST-*.xml"
                            }
                        }
                    }
                    stage('Test On Linux') {
                        agent {
                            label "linux"
                        }
                        steps {
                            sh "run-tests.sh"
                        }
                        post {
                            always {
                                junit "**/TEST-*.xml"
                            }
                        }
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 我可以将多个阶段放入并行指令中吗?例如在两个节点上并行进行结帐、构建和测试?还是并行不应该这样使用?
    • 同样在给定的脚本示例中,假设在build 阶段我还放置了一个parallel 指令以并行构建多个节点,那么test 阶段将等到所有并行任务在build 阶段已经完成,这意味着最慢的节点定义了构建何时可以移动到下一个阶段,对吗?
    • 您可以在脚本中放置多个阶段,不确定声明性管道。并行步骤中的多个阶段可以使 UI 做一些有趣的事情,如果我没记错的话,Blue Ocean 在 UI 中不支持它。对于您的第二个问题,是的,在一组并行任务的所有部分都完成之前,管道脚本不会继续。这确实意味着,如果您将构建+测试阶段分成两组并行任务,那么您会被最慢的节点拖住。
    • @SpencerMalone 谢谢老兄,声明式的工作就像一个魅力。
    【解决方案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

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

    【讨论】:

      猜你喜欢
      • 2017-11-23
      • 1970-01-01
      • 2018-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-25
      • 2020-11-20
      • 1970-01-01
      相关资源
      最近更新 更多