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.

[01] declarative pipeline の使用例 -- Slave 8台から空いている Slave を使う(4パターン)

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

概要

Slave 8台から空いている Slave を選択して実行する例.
次のパターンを書き残しておく.
Jenkins バージョンは Jenkins 2.314 である.

1. 単に実行するだけ
2. どの Slave(node) で実行しているか表示する
3. 選択された Node によって処理を変える(1)
4. 選択された Node によって処理を変える(2)

環境

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

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

コード

各 Slave でコマンド「hostname」を実行して「sleep 120」するジョブ.

1. 単に実行するだけ

文字列の中で「||」を使ってノードを定義してやる.
そして、連続してジョブを実行すると、各 Slave に割り振られる動作が見られる.
また、特定の Slave の同時実行数を 2 や 3 にしてやると、並列実行していることも見られる.

pipeline {
    agent {label 'slave001 || slave002 || slave003 || slave004 || slave005 || slave006 || slave007 || slave008'}
    stages {
        stage ("stage-1") {
            steps {
                sh "hostname ; sleep 120"
            }
        }
    }
}

 

2. どの Slave(node) で実行しているか表示する

declarative 組込みコマンドの echo を使ってログ表示させる.

pipeline {
    agent {label 'slave001 || slave002 || slave003 || slave004 || slave005 || slave006 || slave007 || slave008'}
    stages {
        stage('setup') {
            steps {
                script {
                    NODENAME = "${env.NODE_NAME}"
                }
            }
        }
        stage ("stage-1") {
            steps {
                echo "「${NODENAME}」で実行します."
                sh "hostname ; sleep 120"
            }
        }
    }
}

 

3. 選択された Node によって処理を変える(1)

ここでは sleep の待機時間を変えている.
が、条件分岐が長い. (改善は次の 4 で行う)

pipeline {
    agent {label 'slave001 || slave002 || slave003 || slave004 || slave005 || slave006 || slave007 || slave008'}
    stages {
        stage('setup') {
            steps {
                script {
                    NODENAME = "${env.NODE_NAME}"
                }
            }
        }
        stage ("stage for slave001") {
            when { 
                expression {
                    NODENAME == 'slave001'
                }
            }
            steps {
                echo "「${NODENAME}」で実行します."
                sh "hostname ; sleep 101"
            }
        }
        stage ("stage for slave002") {
            when { 
                expression {
                    NODENAME == 'slave002'
                }
            }
            steps {
                echo "「${NODENAME}」で実行します."
                sh "hostname ; sleep 102"
            }
        }
        stage ("stage for slave003") {
            when { 
                expression {
                    NODENAME == 'slave003'
                }
            }
            steps {
                echo "「${NODENAME}」で実行します."
                sh "hostname ; sleep 103"
            }
        }
        stage ("stage for slave004") {
            when { 
                expression {
                    NODENAME == 'slave004'
                }
            }
            steps {
                echo "「${NODENAME}」で実行します."
                sh "hostname ; sleep 104"
            }
        }
        stage ("stage for slave005") {
            when { 
                expression {
                    NODENAME == 'slave005'
                }
            }
            steps {
                echo "「${NODENAME}」で実行します."
                sh "hostname ; sleep 105"
            }
        }
        stage ("stage for slave006") {
            when { 
                expression {
                    NODENAME == 'slave006'
                }
            }
            steps {
                echo "「${NODENAME}」で実行します."
                sh "hostname ; sleep 106"
            }
        }
        stage ("stage for slave007") {
            when { 
                expression {
                    NODENAME == 'slave007'
                }
            }
            steps {
                echo "「${NODENAME}」で実行します."
                sh "hostname ; sleep 107"
            }
        }
        stage ("stage for slave008") {
            when { 
                expression {
                    NODENAME == 'slave008'
                }
            }
            steps {
                echo "「${NODENAME}」で実行します."
                sh "hostname ; sleep 108"
            }
        }
    }
}

 

4. 選択された Node によって処理を変える(2)

Map型変数(いわゆるハッシュ) を使って、ノード名とパラメータ(sleep秒数)を定義しておく.
なお、ブロック内で変数に def を定義するとローカル変数になり、異なる stage からは参照できなくなる.

stage 名に変数を使うためには、
stages/stage/steps/script/stage
という青文字 の階層で stage を使わないといけない. (違っていたら指摘ください)

pipeline {
    agent {label 'slave001 || slave002 || slave003 || slave004 || slave005 || slave006 || slave007 || slave008'}
    stages {
        stage('setup') {
            steps {
                script {
                    NODENAME = "${env.NODE_NAME}"
                    Map MAP_N_S = [ // N_S is node and seconds
                            'slave001': '101',
                            'slave002': '102',
                            'slave003': '103',
                            'slave004': '104',
                            'slave005': '105',
                            'slave006': '106',
                            'slave007': '107',
                            'slave008': '108',
                    ]
                    SLEEP_SEC = MAP_N_S[NODENAME]
                }
            }
        }
        stage('stage-1') {
            steps {
                script {
                    stage ("stage for ${NODENAME}") {
                        script {
                            echo "「${NODENAME}」で実行します. 待機秒数は ${SLEEP_SEC} です."
                            sh "hostname ; sleep ${SLEEP_SEC}"
                        }
                    }
                }
            }
        }
    }
}
参考サイト

https://stackoverflow.com/questions/44757172/how-to-get-the-current-builds-node-name-in-jenkins-using-groovy?rq=1

 

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?