Jenkinsfile入門

# はじめに
これはJenkinsfileを完璧にかけるを目指す、というよりも、なんとなく理解して、より複雑なことをする際に自分で調べながらJenkinsfileを書くことができるようになることを目指しています。
またこの記事ではJenkinsfileを動かしてみるところまで記載しています。

## 前提条件
今回はVSCodeを用いてJenkinsfileを記載していきます。
VSCodeには下記の拡張機能を入れておくとよいでしょう。

- JenkinsPipelineLinterConnector
    - 構文が正しいかどうかをチェックしてくれるプラグイン
- Jenkinsfile Support
    - Jenkisfileを作成する際に補完やシンタックスハイライトをしてくれるプラグイン

また今回はGitHubでJenkinsfileを管理しようと思います。

#Jenkisfileとは
そもそもJenkinsfileとはということを記載しておきます。
ざっくり下記のような感じです。

- JenkinsのPipelineという仕組みを使ってジョブをコード化するためのファイル
- groovyで記載する
- 記法は2種類ある
    - Declarative Pipeline
        - Jenkinsの推奨はこちらの記法
    - Scripted Pipeline

# Jenkinsfileの良いところ
※あくまでも個人の感想になります。

- Gitなどで管理ができる
    - 設定の復元がしやすくなる
        -  GUIで設定をしているとあのときの設定に戻したいんだけど…が発生すると面倒
    -  誰が、いつ、なんの目的で設定変更したかがわかる
    -  レビューが可能になる
-  Jenkinsのサーバを移すことになった時に便利
    -  Jenkinsを1から立ち上げ直す時になったときにもジョブを移管しやすい
- Scriptを書くので、自由度が高い

一方でScriptを書く、というとちょっとハードルが高い気がしてしまうところもあると思います。

# Jenkinsfileを書いてみる
## サンプルスクリプト

まずサンプルスクリプトです。
模写して、実際に動かしてみると動作がわかりやすいと思います。
下記でJenkisfileが記載できたら、GitHubにpushしておきましょう。

``` groovy:Jenkisfile
pipeline { // Declarative pipelineであることを宣言する
  agent any // 環境の指定（anyなので指定なし）
  stages{
      stage("build"){
          steps{
            echo "Start build!"
          }
          //ステップ終了処理
          post{
              //常に実行
              always{
                echo "========End build!========"
              }
              //成功時
              success{
                  echo "========Success!!========"
              }
              //失敗時
              failure{
                echo "========Fail……========"
              }
          }
      }
      stage("check"){
        steps{
          echo 'checking'
        }
      }
    }
  post{
    always{
      echo "========Finish========"
    }
  }
}
```

## Jenkisfileを動かす

Jenkinsfileを動かすためにジョブを作っていきます。

今回は画像の上から3つ目パイプラインを用います。
（一番下に少し写っているMultiBranch Pipelineを用いると、GitHubのブランチを見てよしなにやってくれるみたいです。ブランチをきって、Jenkinsfileを試行錯誤したいときはこっちのほうがいいかもです）
![2.Jenkinsパイプライン.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121319/cde81e68-6995-8858-c79b-a9b3db9bee3e.png)

また細かい設定は下記のとおりです。

- General
    - GitHub project：ProjectURLにご自身のGitHubのURLを入れてください
- パイプライン
    - 定義を「Pipeline script from SCM」に変更
    - SCM：Git
    - リポジトリURLにGeneralのGitHub projectと同じURLを入力
    - 認証情報：GitHubの認証情報を追加
    - ビルドするブランチ：ブランチ指定子はビルドしたいブランチを設定
    - Script Path：GitHubのどこに配置するかによりますが、一番上の階層においた場合はJenkisfileのみでOKです。

設定ができたらビルドをしてみましょう。

## 実行結果

問題なく実行ができたら下記のような感じに結果が表示されると思います。
それぞれ緑になっている部分をクリックすると詳細な実行結果が確認できます。

![5.Jobの結果.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121319/c2da1834-32ea-d6f9-9ea2-554c60952434.png)

最初のDeclarative:Chechout SCMはJobの中で設定したGitHubからCheckoutをしてきています。
buildやcheckはstageで書いたところになります。
最後のDeclarative:Post Actionsは最後に書いたpostにあたります。

なんとなーーく動きが見えてきましたでしょうか。

# さらにJenkinsfileを書いてみる

サンプルスクリプトではecho文のみでとても簡単なことしかやりませんでした。
echo以外のスクリプトを書くときにどうすればいいかわからない、という方もいらっしゃるかと思います。
その際はPipeline Syntaxを使用してみましょう。（画像一番下）
![7.Pipeline Syntax.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121319/74ba03d4-70e4-8f18-f34f-8c03e4474f2f.png)

Pipeline Syntaxを用いると簡単にスクリプトを作成することができます。
下記はWindows バッチコマンドの例です。
この他にもSample Stepには色々なアクションがあります。
![8.PipelineSyntax変換.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121319/6858e6a9-d92a-89b9-cdbc-ae40d123b0ae.png)

Pipeline Syntaxで生成されたコードは各stageのstepsの中に記述しましょう。


ここまでわかればJenkinsfile入門はできたかと思います。
ぜひ色々試して、よいJenkinsライフを！（？）