首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >脚本jenkinsfile并行阶段

脚本jenkinsfile并行阶段
EN

Stack Overflow用户
提问于 2017-10-20 00:49:42
回答 7查看 61.8K关注 0票数 33

我正在尝试使用groovy DSL编写一个脚本化的Jenkinsfile,它将在一组阶段中具有并行的步骤。

这是我的jenkinsfile:

代码语言:javascript
运行
复制
node {   
stage('Build') {
    sh 'echo "Build stage"'
}

stage('API Integration Tests') {
    parallel Database1APIIntegrationTest: {
        try {
            sh 'echo "Build Database1APIIntegrationTest parallel stage"'
        }
        finally {
            sh 'echo "Finished this stage"'
        }               

    }, Database2APIIntegrationTest: {
        try {
            sh 'echo "Build Database2APIIntegrationTest parallel stage"'
        }
        finally {
            sh 'echo "Finished this stage"'
        }

    }, Database3APIIntegrationTest: {
        try {
            sh 'echo "Build Database3APIIntegrationTest parallel stage"'
        }
        finally {
            sh 'echo "Finished this stage"'
        }
    }
}

stage('System Tests') {
    parallel Database1APIIntegrationTest: {
        try {
            sh 'echo "Build Database1APIIntegrationTest parallel stage"'
        }
        finally {
            sh 'echo "Finished this stage"'
        }               

    }, Database2APIIntegrationTest: {
        try {
            sh 'echo "Build Database2APIIntegrationTest parallel stage"'
        }
        finally {
            sh 'echo "Finished this stage"'
        }

    }, Database3APIIntegrationTest: {
        try {
            sh 'echo "Build Database3APIIntegrationTest parallel stage"'
        }
        finally {
            sh 'echo "Finished this stage"'
        }
    }
}
}

我想有3个阶段:构建;集成测试和系统测试。在两个测试阶段中,我希望有3组测试并行执行,每个测试针对不同的数据库。

我有3个可用的执行者。一个在主服务器上,两个代理,我希望每个并行步骤在任何可用的执行器上运行。

我注意到的是,在运行我的管道后,我只看到了3个阶段,每个阶段都标为绿色。我不想查看该阶段的日志来确定该阶段中的任何并行步骤是否成功/不稳定/失败。

我希望看到我的测试阶段中的3个步骤-标记为绿色、黄色或红色(成功、不稳定或失败)。

我已经考虑过将测试扩展到自己的阶段,但已经意识到并行阶段不受支持(有人知道这是否会得到支持吗?),所以我不能这样做,因为完成流水线将需要太长时间。

任何有见地的人都将不胜感激,谢谢

EN

回答 7

Stack Overflow用户

发布于 2018-11-24 16:20:42

在Jenkins脚本管道中,并行(...)使用一张地图来描述要构建的每个阶段。因此,您可以预先编程构建您的构建阶段,这是一种允许灵活的串行/并行切换的模式。

我使用过类似的代码,其中prepareBuildStages返回一个Map列表,每个列表元素都是按顺序执行的,而Map描述了当时的并行阶段。

代码语言:javascript
运行
复制
// main script block
// could use eg. params.parallel build parameter to choose parallel/serial 
def runParallel = true
def buildStages

node('master') {
  stage('Initialise') {
    // Set up List<Map<String,Closure>> describing the builds
    buildStages = prepareBuildStages()
    println("Initialised pipeline.")
  }

  for (builds in buildStages) {
    if (runParallel) {
      parallel(builds)
    } else {
      // run serially (nb. Map is unordered! )
      for (build in builds.values()) {
        build.call()
      }
    }
  }

  stage('Finish') {
      println('Build complete.')
  }
}

// Create List of build stages to suit
def prepareBuildStages() {
  def buildStagesList = []

  for (i=1; i<5; i++) {
    def buildParallelMap = [:]
    for (name in [ 'one', 'two', 'three' ] ) {
      def n = "${name} ${i}"
      buildParallelMap.put(n, prepareOneBuildStage(n))
    }
    buildStagesList.add(buildParallelMap)
  }
  return buildStagesList
}

def prepareOneBuildStage(String name) {
  return {
    stage("Build stage:${name}") {
      println("Building ${name}")
      sh(script:'sleep 5', returnStatus:true)
    }
  }
}

生成的管道显示为:

对于可以嵌套在并行块中的内容有一定的限制,有关确切的详细信息,请参阅the pipeline documentation。不幸的是,大部分引用似乎偏向于声明性管道,尽管它比脚本(IMHO)更不灵活。pipeline examples页面是最有帮助的。

票数 74
EN

Stack Overflow用户

发布于 2020-09-11 10:21:44

这是一个简单的例子,没有基于@Ed Randall的帖子的循环或函数:

代码语言:javascript
运行
复制
node('docker') {
    stage('unit test') {
        parallel([
            hello: {
                echo "hello"
            },
            world: {
                echo "world"
            }
        ])
    }

    stage('build') {
        def stages = [:]

        stages["mac"] = {
            echo "build for mac"
        }
        stages["linux"] = {
            echo "build for linux"
        }

        parallel(stages)
    }
}

...which产生了这样的结果:

请注意,Map的值不需要是stages。你可以直接给出步骤。

票数 15
EN

Stack Overflow用户

发布于 2018-02-15 14:35:57

下面是他们的docs中的一个示例

并行执行

上面部分中的示例以线性序列的形式在两个不同的平台上运行测试。在实践中,如果make check执行需要30分钟才能完成,那么"Test“阶段现在需要60分钟才能完成!

幸运的是,Pipeline具有用于并行执行部分脚本Pipeline的内置功能,该功能在适当命名的并行步骤中实现。

重构上面的示例以使用并行步骤:

代码语言:javascript
运行
复制
// Jenkinsfile (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 .. */
        }
    }
}
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46834998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档