[Jenkins]Pipelineから複数のジョブを呼び出す

# はじめに
- Jenkins pipelineを使う際に、あるジョブの中で別のジョブを実行したい場合があると思います。今回はJenkinsのパイプラインジョブを使って、複数のジョブを呼び出して実行してみたいと思います。
- 動作環境
    - Jenkins 2.361.1

# ジョブと実行の流れ
## ジョブ
今回は以下の３つのジョブを作成します。
- execute-jobs
- first-job
- second-job

## 実行の流れ
逐次処理と並列処理の２つのパターンでやってみたいと思います。
### 逐次処理
![Screenshot 2022-11-17 at 21.41.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/6280e362-1573-46bb-558b-f64918d4d12b.png)

1. 「execute-jobs」を起動する
1. 「execute-jobs」の処理の中で「first-job」を呼び出す
1. 「first-job」が終了したら、「execute-jobs」の処理の中で「second-job」を呼び出す
1. 「second-job」が終了したら、「execute-jobs」が終了する

### 並列処理
![Screenshot 2022-11-17 at 21.41.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/d7d925d4-cdd1-c567-6d6f-9cffb6d6f67f.png)

1. 「execute-jobs」を起動する
1. 「execute-jobs」の処理の中で「first-job」と「second-job」を同時に呼び出す
1. 「first-job」と「second-job」が全て終了したら、「execute-jobs」が終了する





# ジョブの作成と実行
## first-jobとsecond-jobの作成
まず「first-job」と「second-job」を作成していきます。「新規ジョブ作成」をクリックし、ジョブ作成画面を開きます。「ジョブ名入力」に「first-job」を入力し、「パイプライン」を選択します。
![Screenshot 2022-11-17 at 21.44.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/8fd6027c-da9f-e296-39a0-909d1295f764.png)


ジョブ設定画面の「Script」に以下のスクリプトを貼り付けます。「This is the first job.」をコンソールに出力して、30秒待機するという処理です。
```groovy
pipeline {
    agent any
    stages {
        stage("echo") {
            steps {
                sh "echo This is the first job."
                sh "sleep 30"
            }
        }
    }
}
```
![Screenshot 2022-11-18 at 10.43.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/3d81987b-9156-7387-8606-2e2eb3a39d70.png)


同じ手順で「second-job」を作成します。以下のスクリプトを使います。
```groovy
pipeline {
    agent any
    stages {
        stage("echo") {
            steps {
                sh "echo This is the second job."
                sh "sleep 30"
            }
        }
    }
}
```

## execute-jobsの作成と実行

では、「first-job」と「second-job」の呼び出し元となる「execute-jobs」を作成して実行してみます。

### 逐次処理
まず逐次処理をやってみます。「execute-jobs」の作成手順は上記「first-job」と「second-job」の作成手順と同じです。以下のスクリプトを使います。`build job`を指定することで該当ジョブを呼び出すことが可能です。
```groovy
pipeline {
    agent any
    stages {
        stage("first-job") {
            steps {
                build job: "first-job"
            }
        }
        stage("second-job") {
            steps {
                build job: "second-job"
            }
        }
    }
}
```
「execute-jobs」を実行してみると、以下のようにfirst-jobとsecond-jobが順番通りに呼び出されたのがわかります。
![Screenshot 2022-11-18 at 10.44.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/1267d717-04cd-1fe1-62e4-ddfb4f3ba2ef.png)
![Screenshot 2022-11-18 at 10.44.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/b60b74cb-e5fc-65ea-5870-a32d85b65d63.png)
![Screenshot 2022-11-18 at 10.45.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/716f0add-3259-e9c8-e9e3-d6e59dafb368.png)
![Screenshot 2022-11-18 at 10.45.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/bcdb7023-e2f6-7398-5dba-25f8626e3d9e.png)
![Screenshot 2022-11-18 at 10.46.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/c65c6719-4ac0-0b0e-a748-1c5b7ccfa7ff.png)



以下、「first-job」と「second-job」の実行結果です。
![Screenshot 2022-11-18 at 10.46.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/27051d16-dbd8-8038-01da-4777877e0b17.png)
![Screenshot 2022-11-18 at 10.46.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/6622cb68-b173-337c-bc66-06ee76afa1ba.png)




### パラメータの使用と条件分岐
「first-job」と「second-job」にビルドパラメータを追加し、「execute-jobs」のスクリプトでそれぞれのジョブを呼び出す際にパラメータを渡せるようにします。さらに条件分岐を使って選択したジョブのみ呼び出すよう「execute-jobs」を修正します。
まず「first-job」の設定画面を開き、以下のパラメータを追加します。デフォルト値は設定しません。
- 文字列
    - 名前：name
![Screenshot 2022-11-18 at 11.53.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/8f406cad-24a8-250f-099d-d2488024d84d.png)




スクリプトを以下のように修正します。
```groovy
pipeline {
    agent any
    stages {
        stage("echo") {
            steps {
                sh "echo Hi, ${params.name}, this is the first job."
                sh "sleep 30"
            }
        }
    }
}
```

「second-job」も同じようにパラメータを追加します。
- 文字列
    - 名前：name

スクリプトを以下のように修正します。
```groovy
pipeline {
    agent any
    stages {
        stage("echo") {
            steps {
                sh "echo Hi, ${params.name}, this is the second job."
                sh "sleep 30"
            }
        }
    }
}
```

次に「execute-jobs」の設定画面を開き、以下の２つのパラメータを追加します。デフォルト値は設定しません。
- 真偽値
    - 名前：firstJob
- 真偽値
    - 名前：secondJob

スクリプトを以下のように修正します。build jobの後ろに`parameters`を追加することで、ジョブを呼び出す際に該当ジョブに必要なパラメータを渡すことができます。また、whenを使って条件分岐をさせることで、「execute-jobs」をパラメータ付きビルドで実行する際に、チェックボックスに`チェックがついたジョブのみ`呼び出します。
```groovy
pipeline {
    agent any
    stages {
        stage("first-job") {
            when {
                expression { params.firstJob }
            }
            steps {
                build job: "first-job",
                parameters: [
                    string(name: "name", value: "T")
                ]
            }
        }
        stage("second-job") {
            when {
                expression { params.secondJob }
            }
            steps {
                build job: "second-job",
                parameters: [
                    string(name: "name", value: "Fmak")
                ]
            }
        }
    }
}
```

まず「firstJob」と「secondJob」を全て選択した状態で「execute-jobs」を実行してみます。
![Screenshot 2022-11-18 at 11.55.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/14a8b73e-cad0-b680-a303-ab39f43963b1.png)


ジョブが順番通りに呼び出されて、Nameパラメータの値も渡されています。
![Screenshot 2022-11-18 at 11.57.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/b1109108-2237-9ca6-24c1-6293e035d4e9.png)
![Screenshot 2022-11-18 at 11.57.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/0e0afc86-fd27-384d-9fc9-1ff2c41904e0.png)
![Screenshot 2022-11-18 at 11.57.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/5243f796-d0ab-f18c-1552-31e40bba1c56.png)



次に「firstJob」を外して、「secondJob」のみ選択して「execute-jobs」を実行してみます。
![Screenshot 2022-11-18 at 11.59.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/49adc125-f8b0-e1ea-4bb0-ffb895fc8544.png)

「first-job」がスキップされましたね。
![Screenshot 2022-11-18 at 12.00.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/07cd1f5c-08a3-2273-f7ad-809da7acc69b.png)


### 並列処理
最後に並列処理をやってみます。`parallel`を使うことで並列処理を実現可能です。「execute-jobs」のスクリプトを以下に変更します。
```groovy
pipeline {
    agent any
    stages {
        stage("parallel") {
            parallel {
                stage("first-job") {
                    when {
                        expression { params.firstJob }
                    }
                    steps {
                        build job: "first-job",
                        parameters: [
                            string(name: "name", value: "Fmak")
                        ]
                    }
                }
                stage("second-job") {
                    when {
                        expression { params.secondJob }
                    }
                    steps {
                        build job: "second-job",
                        parameters: [
                            string(name: "name", value: "Fmak")
                        ]
                    }
                }
            }
        }
    }
}
```

Jenkinsのデフォルトの同時実行数が２になっているため、ジョブ実行前に同時実行数を増やしておきます。
「Jenkinsの管理」→「ノードの管理」を開き、ジョブ実行用ノードの設定画面を開きます。
![Screenshot 2022-11-18 at 11.24.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/cbfee960-bae8-886c-2586-d68c450f6b6d.png)
![Screenshot 2022-11-18 at 11.23.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/c207d670-66df-4483-4b46-de603eda4922.png)
同時実行数を「３」に変更します。
![Screenshot 2022-11-18 at 11.23.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/fc89ba1f-578a-c293-4afc-44a3e7cb12d4.png)

では、「firstJob」と「secondJob」を全て選択して「execute-jobs」を実行してみます。
![Screenshot 2022-11-18 at 12.02.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/8e250718-aba9-86b3-3e33-d4a17d0adb3d.png)

「first-job」と「second-job」が同時に呼び出されています。
![Screenshot 2022-11-18 at 12.03.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/36550a12-b167-6d55-cda9-783e09cc3710.png)
![Screenshot 2022-11-18 at 12.03.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/1f958bc6-c05f-e4f4-ae49-e56fa86ed542.png)
![Screenshot 2022-11-18 at 12.04.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/f25ac59c-b79f-54c6-0af1-e5be8c40085d.png)

# 参考
- [Pipeline Syntax | jenkins.io](https://www.jenkins.io/doc/book/pipeline/syntax/)