Jenkins Pipeline について

# はじめに
* CI/CDツール「Jenkins」は、2.0より複数のステップ（ビルドやテスト等）を制御する「Pipeline」が利用できます。上記について簡単に紹介します。

# Jenkinsとは
* Continuous Integration（継続的インテグレーション）、Continuous Delivery（継続的デリバリー）を実現するためのオープンソースのツールです。
* Windows, Linux, Mac OSといった多様なプラットフォームに対応しています。
* ジョブと呼ばれる単位で実行する機能（Windows バッチファイルやシェルスクリプト等）を定義します。
* 私見ですが、機能拡張のためのプラグインが充実していることが一つの特徴です。

## Continuous Integration（継続的インテグレーション）とは
* リポジトリに対して、頻繁にコミット、ビルド、テスト、マージの一連のサイクルを行うことで、バグの早期発見等によりリリースを短縮化する手法です。そのために、ビルド、テストを自動化します。

## Continuous Delivery（継続的デリバリー）とは
* CIを拡張した手法で、リリースプロセス全体を自動化することで、リリースを短縮化する手法です。ビルド、テストが成功後、テスト環境またはステージング環境に展開し、本番環境へリリースできるよう準備します。

# Jenkins Pipelineとは
* 2.0より追加されたジョブの種類です。
* 従来のジョブに比べて、複数のステップ（ビルドやテスト等）を順次実行させることができます。
  そのため、継続的デリバリーに向けたパイプラインの実現に活用できます。

## 記法
* [公式ドキュメント](https://www.jenkins.io/doc/book/pipeline/) より、2種類の記法があります。
  1. Declarative Pipeline
  2. Scripted Pipeline
* 「Declarative Pipeline」の「Script」ブロック、「Scripted Pipeline」では、ビルドツール「Gradle」でも用いられるスクリプト言語「Groovy」を利用できます。

### Declarative Pipeline
* Pipeline の実行オプションを定義する「options」等、多様な機能を提供するブロックが用意されています。
* 詳細は、[Declarative Pipeline](https://www.jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline) で紹介されています。

|項番|説明|
|---|---|
|1|Declarative Pipeline のトップブロック|
|2|pipeline ブロックや stage ブロックで定義される agent|
|3|Build、Test、Deploy といった複数の stage を含むブロック|
|4|各 stage ブロック|
|5|stage のステップ|

```
// (1)
pipeline {
    // (2)
    agent any

    // (3) 
    stages {
        // (4)
        stage('Build') {
            // (5) 
            steps {
                ...
            }
            ...
        }
        ...
    }
    ...
}
```

### Scripted Pipeline

* Declarative Pipeline と異なり、全ブロックで Groovy の記法を利用できます。
* 詳細は、[Scripted Pipeline](https://www.jenkins.io/doc/book/pipeline/syntax/#scripted-pipeline) で紹介されています。
 
|項番|説明|
|---|---|
|1|Scripted Pipeline のトップブロック|
|2|Build、Test、Deployといった stage|

```
// (1)
node {
    // (2)  
    stage('Build') { 
        ... 
    }
    ...
}
```

## 例

### Pipeline 例
* 以下では「Scripted Pipeline」の例を記載しています。
    * (1): Build, Test, Deploy の各ステップを実行します。今回は、専用の各外部ジョブを実行させるイメージです。
    * (2): 「Slack Notification」というプラグインが既に導入されている前提で、「[Slack](https://slack.com/intl/ja-jp/)」のチャンネルに、ビルド結果を通知します。
    * ※:  各ステップでエラーが発生した場合にキャッチします。

```
node {
     boolean isSuccess = true
     try {
         // (1)-1
         stage( 'Build' ) {
             build job: "Build", parameters: [[$class: 'StringParameterValue', name: 'Branch', value: "${Branch}"]]
         }

         // (1)-2
         stage( 'Test' ) {
             build job: "Test", parameters: []
         }

         // (1)-3
         stage( 'Deploy' ) {
             build job: "Deploy", parameters: []
         }
     }
     // ※
     catch( Exception e ) {
         isSuccess = false 
         throw( err )
     }
     // (2)
     finally {
         def color = ( ( isSuccess ) ? "good" : "danger" )
         def message = ( ( isSuccess ) ? "Success" : "Failure" )
         slackSend( channel : "jenkins", color: "${color}", message: "${env.JOB_NAME} - #${env.BUILD_NUMBER}  ${message} <${env.BUILD_URL}|Open>" )
     }
}
```

### 実行例
#### Pipeline Stage View
* 各ビルドにてどのステップで成功またはエラーになったかが分かります。
![pipeline.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672573/66848614-29d4-568d-51ee-64e90b1e81c0.jpeg)

#### Slack メッセージ
* ビルドの成功またはエラーに応じて色とメッセージを切り替えて通知しています。

![jenkins.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672573/8a2d1ece-45e1-52f4-3603-81edd1e833a3.jpeg)


### 補足: Slack への通知
* Jenkins プラグインでは、コミュニケーションツールの「Slack」に Jenkins のビルド結果を通知する、「Slack Notification」があります。
* Jenkins Pipeline では、フリースタイルジョブ等と違い、以下のように「slackSend」で通知内容を定義します。

```
slackSend( channel : 【Slack への通知チャンネル】, color: 【色】, message: 【メッセージ】 )
```

* 詳細は [Slack Notification Plugin](https://www.jenkins.io/doc/pipeline/steps/slack/#slack-notification-plugin) で紹介されています。

# おわりに
* Jenkins を利用する場合、Pipeline は一連のステップを順次実行できることに加えて、「Stage View」でビルドでエラーになったステップを分かりやすく可視化できるという点で役立つように思います。

# 参考資料
* [CI(継続的インテグレーション)](https://cloudbees.techmatrix.jp/devops/ci/)
* [CD(継続的デリバリー)](https://cloudbees.techmatrix.jp/devops/cd/)
* [Pipeline](https://www.jenkins.io/doc/book/pipeline/)
* [Declarative Pipeline](https://www.jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline) 
* [Scripted Pipeline](https://www.jenkins.io/doc/book/pipeline/syntax/#scripted-pipeline)
* [Slack Notification Plugin](https://www.jenkins.io/doc/pipeline/steps/slack/#slack-notification-plugin)