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


|本シリーズのトップページ|
|:--|
|https://qiita.com/robozushi10/items/52a393aee1ba57999196|


## 概要

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

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



## 環境

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

・[[シリーズ] docker-compose を使って同一物理マシン上に Jenkins Master(docker) - Slave(docker) [SSH通信]を構築する](https://qiita.com/robozushi10/items/80bfd9934500b458b831)


## コード

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

#### 1. 単に実行するだけ

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

```groovy
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 を使ってログ表示させる.

```groovy
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 で行う)

```bash
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/<font color="blue">stage</font>
という<font color="blue">青文字</font> の階層で stage を使わないといけない. (違っていたら指摘ください)

```groovy
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