[02] declarative pipeline の使用例 -- 使用する Slave(ノード) をパラメータで指定する


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


## 概要

パラメータを Pipeline declarative で使用する例.
次のパターンを書き残しておく.
Jenkins バージョンは Jenkins 2.314 である.

[1. 文字列パラメータ「NODENAME」を設けて Slave名 1台を入力する](#1-文字列パラメータnodenameを設けて-slave名-1台を入力する)
[2. 選択肢パラメータ「NODENAME」を設けて Slave名 1台を入力する](#2-選択肢パラメータnodenameを設けて-slave名-1台を入力する)
[3. 文字列パラメータ「NODENAME」を設けて Slave名 1台か全台(all)かを入力する](#3-文字列パラメータnodenameを設けて-slave名-1台か全台allかを入力する)


## 環境

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

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


## コード

### 1. 文字列パラメータ「NODENAME」を設けて Slave名 1台を入力する

次の (1)(2) を満すこと. 単に(1)のみであれば、パラメータは作成されない.

(1) 下記💚としてパラメータ「NODENAME」を定義する.
(2) 🛑 のように `params.NODENAME` としてパラメータ「NODENAME」にアクセスする.

```groovy
pipeline {
    parameters {
        string(name: 'NODENAME', defaultValue: '', description: 'ノード名') // 💚
    }
    agent any
    stages {
        stage('stage-1') {
            steps {
                echo "「${params.NODENAME}」が指定されました." // 🛑
            }
        }
    }
}
```

上記のような実装をすると、
次のように GUI 上にもパラメータが作成されている.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/d234ed74-656a-cf0c-4ad0-f230638df635.png)

　

### 2. 選択肢パラメータ「NODENAME」を設けて Slave名 1台を入力する

```groovy
pipeline {
    parameters {
        choice(
            name: 'NODENAME',
            choices: [
                'slave001',
                'slave002',
                'slave003',
                'slave004',
                'slave005',
                'slave006',
                'slave007',
                'slave008',
            ],
            description: 'ノード名'
        )
    }
    agent any
    stages {
        stage('stage-1') {
            steps {
                echo "「${params.NODENAME}」が指定されました."
            }
        }
    }
}
```

次のように選択肢パラメータが作成されている.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/506d5500-83f7-3a1c-aee0-a07041d5b5b1.png)

　

### 3. 文字列パラメータ「NODENAME」を設けて Slave名 1台か全台(all)かを入力する

グロバール変数として List型で選択肢を定義しておく.

```groovy
def List L_NODES = [
                'all',
                'slave001',
                'slave002',
                'slave003',
                'slave004',
                'slave005',
                'slave006',
                'slave007',
                'slave008',
            ]

pipeline {
    parameters {
        choice(
            name: 'NODENAME',
            choices: L_NODES,
            description: 'ノード名'
        )
    }
    agent any
    stages {
        stage('stage-1') {
            steps {
                script {
                    N = params.NODENAME
                    if(N == 'all'){
                        // all が選択されたら全台で実行する
                        for(i = 1; i < L_NODES.size(); i++){
                            N = L_NODES[i]
                            stage("stage -- ${N}"){
                                node(N){
                                    echo "コンテナ「${N}」でコマンド hostname を実行します."
                                    sh "hostname"
                                }
                            }
                        }
                    }
                    else {
                        // all 以外の場合は指定された 1台のみで実行する
                        stage("stage -- ${N}"){
                            node(N){
                                echo "コンテナ「${N}」でコマンド hostname を実行します."
                                sh "hostname"
                            }
                        }
                    }
                }
            }
        }
    }
}
```


以上