0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[05] declarative pipeline の使用例 -- 複数ノードでビルドをする(分散ビルド)

Last updated at Posted at 2021-10-03
本シリーズのトップページ
https://qiita.com/robozushi10/items/52a393aee1ba57999196

概要

最終的には Slave 8台を同時に実行し、かつ、終了待合せをする.
実施する処理は簡単のために sleep のみとする.
なお、使用した Jenkins バージョンは Jenkins 2.314 である.

1. まずは Slave 3台を同時実行する (処理内容は sleep するのみ)
2. 上記 1 を Map を使って簡潔に記す
3. 記載予定

環境

下記で構築した Master(1台) - Slave(8台) [SSH通信] を使って Pipeline を書いてみる.
(OS は Linux である)

[シリーズ] docker-compose を使って同一物理マシン上に Jenkins Master(docker) - Slave(docker) [SSH通信]を構築する

コード

1. まずは Slave 3台を同時実行する (処理内容は sleep するのみ)

ここでは slave001, slave002, slave003 の 3台を同時実行する.
そして次のように sleep をする.
・slave001 は 13秒間の sleep
・slave002 は 1秒間の sleep
・slave003 は 9秒間の sleep

そして、3台全てが終了したら、ジョブを終了させる.

// デバッグのための変数
def MESG = 'DONE ... '

pipeline {
    agent any
    stages {
        stage('並列実行') {
            steps { 
                script {
                    parallel(
                        [
                            'slave001':{
                                node('slave001'){
                                    stage('slave001 での実行'){
                                        script {
                                            sh "sleep 13"
                                            MESG += " ${env.NODE_NAME} "
                                        }
                                    }
                                }
                            },
                            'slave002':{
                                node('slave002'){
                                    stage('slave002 での実行'){
                                        script {
                                            sh "sleep 1"
                                            MESG += " ${env.NODE_NAME} "
                                        }
                                    }
                                }
                            },
                            'slave003':{
                                node('slave003'){
                                    stage('slave003 での実行'){
                                        script {
                                            sh "sleep 4"
                                            MESG += " ${env.NODE_NAME} "
                                        }
                                    }
                                }
                            },
                        ]
                    )
                }
            } 
        }
        stage('Done') {
            steps {
                script {
                    echo "MESG => ${MESG}"
                }
            }
        }
    }
}

結果

次のように、終了したノード順に MESG 変数に対してノード名が書き込まれている.

image.png

 

2. 上記 1 を Map を使って簡潔に記す

処理内容は同じだが、Map を使って記述する.

def MESG = 'DONE ... '

Map<String, Object> pipelines = [:]
pipelines['slave001'] = { node('slave001'){ stage('slave001 での実行'){ script { sh "sleep 13"; MESG += " ${env.NODE_NAME} " } } } }
pipelines['slave002'] = { node('slave002'){ stage('slave002 での実行'){ script { sh "sleep 1" ; MESG += " ${env.NODE_NAME} " } } } }
pipelines['slave003'] = { node('slave003'){ stage('slave003 での実行'){ script { sh "sleep 4" ; MESG += " ${env.NODE_NAME} " } } } }

pipeline {
    agent any
    stages {
        stage('並列実行') {
            steps { 
                script {
                    parallel( pipelines )
                }
            } 
        }
        stage('Done') {
            steps {
                script {
                    echo "MESG => ${MESG}"
                }
            }
        }
    }
}

参考にしたサイト

https://gist.github.com/hartsock/f76f2bf150644c16d2a7831b0688933a
https://stackoverflow.com/questions/59261562/jenkinshow-to-achieve-parallel-dynamic-stages-in-jenkins-declarative-pipeline

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?