首页 > 解决方案 > 一次锁定 Jekinsfile 管道中的资源以用于并行和顺序阶段

问题描述

我正在尝试在我的 Jenkinsfile 中运行以下过程:

  1. 构建应用程序
  2. 触发将两个组件并行部署到测试环境
    • 富部署
    • 酒吧部署
  3. 在已部署的应用程序上运行测试

第 2 步和第 3 步需要锁定一个资源,因为我只有一个可用的测试环境。

无需并行运行第 2 步即可实现这一目标,但是,当我将 Jenkinsfile 配置为一起运行它们时,我从 Jenkins 收到以下错误:

WorkflowScript: 19: Parallel stages or branches can only be included in a top-level stage. @ line 19, column 7.
                    stage('Deploy Foo') {
     ^

这是完整的 Jenkins 文件:

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                powershell(script: '.\\ci\\build.ps1 -Script .\\ci\\build\\build.cake')
            }
        }

        stage('Deploy and run tests') {
            when {
                branch('develop')
            }

            options {
                lock('test-env')
            }

            stages {
                stage('Deploy') {
                    parallel {
                        stage('Deploy Foo') {
                            steps {
                                build(job: 'Deploy_Foo')
                            }
                        }

                        stage('Deploy Bar') {
                            steps {
                                build(job: 'Deploy_Bar')
                            }
                        }
                    }
                }

                stage('Run tests') {
                    steps {
                        powershell(script: '.\\ci\\build.ps1 -Script .\\ci\\test\\build.cake')
                    }
                }
            }
        }
    }
}

我还尝试了一个解决方案,为 Deploy 和 Test 阶段分别锁定test-env资源,但是,当其他一些正在运行的作业可能等待该资源并在 Deploy 和 Test 阶段之间“跳转”时,这会增加竞争条件的风险目前的工作。

有没有办法实现上述 Jenkinsfile 中描述的顺序和并行阶段的混合?

标签: jenkins-pipelinejenkins-declarative-pipeline

解决方案


推荐阅读