はじめに
JenkinsはメジャーなCI/CD支援ツールとして地位を築いています。そんなJenkinsが数年前からGUIベースではなく、コードベースで設定ができるようにした機能がJenkins pipeline(パイプライン)です。コードで設定ができるようになったことで、バージョン管理が可能になり、設定の差分などを容易に参照できるようになりました。今回は、そのJenkins pipelineの基本的な使い方を学んでいきます。
- 本記事はJenkinsで通常のジョブを作った経験がある方を対象としています。
- 本記事で扱うJenkinsのバージョンは2.249.2となります。
レッスン1.ジョブをつくる
まずは、パイプラインのジョブを作ってみましょう。Jenkinsのダッシュボードから、新規ジョブ作成を押して、ジョブ名を入力し、ジョブの種類はパイプラインを選択します。
OKを押すと続けて設定ページに移行します。設定ページの中腹にパイプラインとよばれるエリアがあるので、そこまで移動します。通常のジョブでは、設定をこのページでチェックを入れたり、テキストエリアに入力したりしながら作っていきましたが、パイプラインではここにコードを入力してジョブを制御します。
ではまずはサンプルコードを試してみましょう。Scriptと書かれている右側の欄がスクリプトを入力するエリアです。右上に「try sample Pipeline…」と書かれているところがありますので、そこを押して、「Hello World」を選びます。すると、スクリプトエリアにコードが自動挿入されるので、そのまま保存します。
ジョブが出来たら、早速実行してみましょう。左側のツリーから「ビルド実行」を押します。
実行が無事完了したら、結果を見てみます。ビルド番号を示す「#1」と書かれているところを押すと、ビルドの結果ページに移動します。
ビルド結果画面に移動したら左のツリーから「Console Output」を押して実行結果を確認します。
コンソール出力結果を見てみましょう。コードの実行結果の中に、「Hello World」が出力されていることが確認できたら完了です。
パイプラインジョブの作成方法は以上になります。ジョブの作り方自体は同じで、制御がスクリプトで行われるところが違いとなります。
レッスン2.パイプラインの文法を調べる
パイプラインジョブに記載できるスクリプトはGroovy(グルーヴィ)というJava scriptをベースとしたスクリプト言語になります。基本的な制御コードはGroovyのリファレンスを見れば分かりますが、ジョブを作っていくためにはJenkins独自の命令を記載する必要があるので、それはコードジェネレータを使って生成することができます。
まずは、スクリプトエリアの下にある「Pipeline Syntax」というリンクを押します。
コードジェネレータのページが開くので、ここでやりたいことを選択します。今回はバッチコマンドの実行をしたいと仮定します。右側の「Sample Step」から「bat: Windows Batch Script」を選びます。
Sample Stepを選んだら、続いてBatch Scriptというエリアに、実行したいバッチコマンドを入力しましょう。今回はecho命令でHelloという文字を出力してみたいと思います。
入力が終わったらその下にある青いボタン「Generate Pipeline Script」を押して下のテキストエリアにパイプラインのコードが出力されるので、これをジョブ設定画面のスクリプトエリアに貼り付けて使います。
以上、コードジェネレータの使い方でした。尚、今回使ったbat以外にも使えそうなStepsをいくつかピックアップしますので、必要に応じて使ってみてください。
Sample Step | 説明 |
---|---|
checkout: Check out from version control | Git/SVN等からリポジトリをチェックアウトします |
emailext:Extended Email | メールを送信します |
build:Build a job | 他のジョブを実行します |
レッスン3.ステージ
ここでは「ステージ」という概念を学びます。ステージはジョブのタグ付けのようなもので、これを使うことにより、どこで失敗したか特定したり、特定のステージから開始したりすることもできます。また、ステージごとの所要時間も出ますし、並列実行も可能になります。
今回はステージを理解するためのテストとして、下記のようなコードを実行してみたいと思います。スクリプトエリアに下記を貼り付けてください。
pipeline { agent any stages { stage('Build') { steps { echo 'Build done' } } stage('Test') { steps { echo 'Test done' } } stage('Deploy') { steps { echo 'Deploy done' } } } }
修正が終わったら、実行しましょう。実行が完了するとStage Viewに、各ステージ名が表示されており、それぞれの実行時間が表示されています。
続いて実行結果をコンソール出力で見てみましょう。各ステージのecho文の内容が出ていれば成功です。
では続いて、ジョブが途中のステップでエラーになってしまった等で途中のステージからやり直す方法を紹介します。一つ上のページに戻り、左のツリーから「Restart from Stage」を押します。
ここでステージを選択できますので、始めたいステージを選び、Runを押すと、そのステージからジョブが開始されます。
では、最後に並列実行の方法もご紹介します。サンプルコードは以下になります。設定画面のスクリプトエリアに貼り付けて保存してください。
pipeline { agent any stages { stage('Build') { steps { echo 'Build done' } } stage('Tests'){ parallel { stage('Test1') { steps { echo 'Test done' } } stage('Test2') { steps { echo 'Test done' } } } } stage('Deploy') { steps { echo 'Deploy done' } } } }
今回はparallelというブロックを使い、”Tests”というステージにTest1とTest2を並列実行するコードになっています。保存したら、実行してみてください。
ここでは並列実行されたことが見て取れないので、Console Outputで実行結果を見てみましょう。ビルド番号を押してビルド結果から、Console Outputに移動します。
コンソール出力を見ると、parallelと書いてある部分の直後にBranchが2つ出来ていて、それぞれTest1とTest2が実行されています。これにより、問題なく並列実行できていることが分かりました。
並列実行を駆使することで、ジョブの実行時間の短縮が見込めますので、ジョブ設計の際には検討してみてください。
尚、ステージの分け方について決まりはありません。失敗しやすいフェーズは単独のStageとして分けることで再実行を容易にしたり、あえて細かく分けることで問題の特定を容易にしたりするなど、プロジェクトの方針に応じて最適な設計を考慮しましょう。
レッスン4.バッチコマンドを実行する
続いてWindowsバッチファイルで利用される、バッチコマンドを実行するジョブを作ってみましょう。これを使う場面は、ビルド実行や成果物のデプロイ等です。
まずは今回のコードです。ジョブの設定画面のスクリプトエリアに貼り付けてください。
pipeline { agent any environment { BAT_RESULT = bat returnStdout: true, script: '@echo off && echo %~dp0' } stages { stage('Bat') { steps { echo 'result:'+BAT_RESULT } } } }
では、今回のコードについて、ポイントを説明しておきます。
まず、コードの冒頭部分
environment { BAT_RESULT = bat returnStdout: true, script: '@echo off && echo %~dp0' }
environmentで括られた部分は変数の宣言を行います。定義したBAT_RESULTにbatコマンドの実行結果を格納します。returnStdout: trueというオプションを付けると、実行結果がそのまま文字列として戻ってきます。@echo~以降はバッチコマンドです。これはバッチファイル自身のパスを返すコマンドになります。
変数に実行結果が格納されたら、
echo 'result:'+BAT_RESULT
の行で実行結果を出力します。+記号は文字列結合です。
では、これを実行して結果を見てみましょう。
コンソール出力を見ると、バッチのパスが出力されています。これはbatコマンドを実行すると、一時ファイルとしてバッチファイルが生成され、それが実行されるからです。そのパスが下記に表れているということになります。
JenkinsがインストールされているPCと、ジョブが実行されるPC(クライアントPC)が必ずしも同じとは限りません。Jenkins本体はLinuxにインストールされることが多いのですが、一方でビルド環境はWindowsのみ準備されているといったケースがあります。そのような場合にバッチコマンドで書いておくと、コマンドはクライアントPCで実行されますので、このような違いに悩むことが無くなります。
おわりに
Jenkins パイプラインではGroovyスクリプトを扱いましたが、設定を全てスクリプトで書く必要があるために、最初はとっつきにくいと感じるかと思います。しかしながら、コードで管理することで、バージョン管理ができるというメリットがあります。また、将来的にはJenkinsはパイプラインをメインストリームにするという話もあるので、今から学んでくことで新しい便利な機能をいち早く取り入れられるメリットもあるでしょう。
最後までお読みいただきありがとうございました。
No Comments