【CI奮闘記】第11章:パイプラインに承認・Webhookを追加する!


前回のブログでは、Jenkinsのパイプラインを用いてMavenのビルドを行う方法説明しました。
前回のブログはこちら
今回は前回作成したパイプラインを発展させていきます。前回のブログを確認していただいてからご覧ください。

はじめに

登場人物

吉田:転職したてのエンジニア。前職では積極的にCIやCDに取り組みながら開発をしていた。

服部:配属1年後の新人。CIやJenkinsについては言葉は聞いたことがある程度。もともと開発で今回初めて環境周りを扱う事になった。

パイプラインの発展

さて、今回は前回作ったパイプラインを発展させていきましょう。

前回の最後に挙げていた入力待機といったものですね。

まずはdeployステージを発展させていきましょうか。このデプロイはstaging環境にデプロイするとしましょう。

staging環境であれば開発リーダーの承認を待機して承認後にデプロイするという事ができると良いですね。

Snippet Generatorを利用する

承認の待機って簡単にできるんですか?

inputステップを利用することで実現できるわ。inputステップ実行する入力待機Stageを作成してみましょう。

ステップの書き方がわからないです。。。

そういったときはJenkinsの入力補助機能である「Snippet Generator」を使いましょう。Jenkinsのダッシュボードから新規ジョブ作成 > パイプラインを選択してJobパイプラインジョブを一つ作りましょう。

了解です。パイプラインジョブの設定画面に飛びました。

設定画面の一番下にPipeline Syntaxというリンクがあるので、そこをクリックしてみて。

Snippet Generatorというものが開きました。これはどういった機能ですか?

stepの書き方を教えてくれるものよ。試しにSample Stepにecho:Print Messageを選択して、Message欄にHello World!と入力してみましょう。

そのあと「Generate Pipeline Script」を押下すれば良いですかね?

そう。こうすることでstepのスクリプトを作ってくれるの。

kこrこれこ

Inputステップを作成する

今と同じ流れでInputステップを作っていきましょう。

「input: Wait for interactive input」というやつですか?Messageに質問文を入れればよさそうですね。この高度な設定って何ですか?

ここを押すとMessage以外の内容も指定できるようになるわ。例えば承認ボタンを押下できるのはAさんだけといったことも可能よ。詳しくはこのドキュメントを見ると良いと思うわ。今回はOKのメッセージを変更する「OK Button Caption」の欄だけ変更しましょうか。

了解です。これで「Generate Pipeline Script」を押下して、、、と。できました。

作成したスクリプトをそのままコピーして利用します。

じゃあ作成したスクリプトをJenkinsfileに埋め込んで、inputステージを作ってみましょう。

stage ('input') {
  steps {
    input message: 'Do you want to deploy to staging?', ok: 'Yes, let\'s do it!'
  }
}

できました!早速実行してみます!

inputステージで止まりました!

このようにinputステージでパイプラインの実行を一時停止して、OKを選択すれば次のStageに進むし、abortを選択するとそこでパイプラインの実行を終了させれるわ。

abortを選択すると上記のように後続のstageは実行されません。

このようにinputステップの実装は出来ましたが、実運用上このような使い方をしてしまうと弊害が生まれます。今回のinputステップの場合、OKまたはAbortが選択されるまで入力を待機し続けます。その間次のジョブは実行されませんし、エージェントも専有し続けてしまいます。この専有を防ぐために、通常はtimeoutステップを併用します。

steps {
  timeout(time:3, unit:'DAYS') {
    input message: 'Do you want to deploy to staging?', ok: 'Yes, let\'s do it!'
  }
}

また、InputやTimeout以外にもパイプラインの便利な構文は様々あります。
https://www.jenkins.io/doc/book/pipeline/syntax/
こちらのPipeline Syntaxのページでも確認できますが、より実践的な内容を学びたい場合、弊社で実施しているJenkinsトレーニングを受講いただけると実践的なパイプラインの構築を余すところなくお伝えしております。ご興味ある方はぜひ受講いただければと思います。

Wehhookを設定する

さて、このパイプラインをもう少しCI環境の実現として発展させていきましょう。定期実行についてはCI奮闘記の9章で教えたわね。

はい。スケジュール実行やSCMをポーリングについて学びました。

今回はWebhookという仕組みを使っていくわ。Webhookを使う事でコードがGitにpushされたら即時にJenkinsのジョブが実行されるようになる便利な仕組みよ。

コードがpushされる度に自動テストが実施されるのはとてもCI環境っぽいですね。

今回はSCMとしてGiteaを利用しているので、専用のプラグインを使ってみましょう。Giteaで表示されるGiteaプラグインをインストールしましょう

これですね。インストールしました。

インストールが完了すると「Jenkinsの管理」 > 「システムの設定」に「Gitea Servers」という項目が増えているので設定していきましょう。Manage hooksを選択すると認証情報の設定を求められるわ。種類を「 Gitea Personal Access Token」を選択して、ここにGitea側で取得したTokenを入力すればOKよ。

「Gitea Personal Access Token」に入力するアクセストークンはGitea側でアカウントの「設定」 > 「アプリケーション」で生成すれば良いですよね。

そうね。これを入力して問題無ければ認証情報の下にGitea側のユーザーが表示されるわ。

次にジョブの作成ね。さっきGiteaプラグインを入れたので「新規ジョブ作成」に「Gitea Organization」が表示されているので選択しましょう。さっきGiteaのサーバーURLを入力しているので、サーバー情報も自動で入力されるわ。Ownerの項目がJenkins側のジョブの名称になっているので、ここをGitea側のオーナーの名称に変更しましょう。

自動的にリポジトリのスキャンが始まりました!

これで、JenkinsfileがあるリポジトリはJenkins側に自動的にマルチブランチパイプラインのジョブが作成されるようになるわ。新しくリポジトリを作成してもJenkins側にいちいちジョブを作成しなくてよくなるのでとても便利よ。

スキャンが完了するとリポジトリに対応するジョブが自動作成されます。

次はGitea側のWebhookの設定ですね。

とても簡単よ。というか、Jenkinsの管理>システムの設定>Gitea Servers>Manage Hooksにチェックを入れていれば自動で設定してくれるわ。
設定されていない場合はGiteaのリポジトリの設定からWebhookのタブを選択して、このターゲットURLに
http://[jenkins_url]/gitea-webhook/post
と入れるだけで設定完了よ。

入力しました。テスト配信をしてみますね。問題無く疎通できてそうです

これでGiteaにpushするたびにJenkinsのジョブが実行されるようになるわ。ジョブ実行タイミングを変更したい場合はWebhookのトリガーのタイミングを設定すればいいわ。

トリガーを「イベントを指定」を選択し、イベントを選択します。

今回はGiteaでしたけど、リポジトリを一括で読み込むといったことやwebhookといったことは他のGitHubやGitLabといったSCMでもできるんですか?

どんなSCMを使っているかによるけど、可能なものが多いわね。様々なSCMに対応して豊富なプラグインで機能拡張していけるのはJenkinsのいいところね。

まとめ

今回はInputとwebhookを作成したわね。どうだった?

inputの書き方わからなくて調べなきゃと思ったんですが、JenkinsのSnippet Generatorで1発でわかって助かりました。このような機能があるのは便利ですね。
Webhookについてももっと設定面倒なのかなと思っていたのですが、設定してみると設定箇所も少なくて良かったです。Giteaプラグインといった仕組みがあるの良いですね。

次にどういったことを実装していきたい?

そうですね。通知関連でしょうか。いちいちJenkinsを確認しなくてもジョブの実行状況やテストが失敗したときの通知とかがあると良いと思います。

それじゃあ次回は通知関連について説明していきましょう。

CI奮闘記一覧