はじめに
こんにちはSREエンジニアのMakiです。
この記事ではJenkins Pipeline ジョブの作成方法について紹介します。
Pipelineジョブを使うのが初めての方に向けて基本的な使い方を説明していきたいと思います。
Jenkins Pipelineジョブを使ってみよう ~ 基本編 ~
シナリオ
【Jenkins】フリースタイルジョブを使いこなそう!~ かわいい子猫の画像を取得してみる ~
https://tielec.blog/index.php/sre/ci-cd/jenkins/free_style_job/
こちらの記事で紹介した猫の画像を取得するフリースタイルジョブと同じことをパイプラインジョブで実現します。
Pipelineジョブを作成する
-
新規アイテムの作成
-
kitten_image_generator_pipeline
という名前でPipelineを作成する
設定の入力
実行部分以外の設定はフリースタイルジョブの作成と同じ要領で入力します。
- 説明
- Throttle Concurrent Builds
- ビルドのパラメータ化
- 古いビルドの破棄
スクリプト作成1 (型を理解する)
Pipelineのスクリプトはここに書いていきます。
ですが、、、
ここに直接Pipelineを書いていくのは書くスペースが小さくて非常に効率が悪いです。
Visual Studio Code
にPipeline編集用に以下のプラグインがあるのでインストールして使うのがおすすめです。
-
JenkinsFile Support
Jenkins Pipelineの書式に従ってハイライトしてくれたり、コードサジェストしてくれたりと、Pipeline開発を強力にサポートしてくれます。
-
Jenkins Pipeline Linter Connector
Pipeline のシンタックスチェックを行ってくれるプラグインです。
Jenkins Pipeline はお作法に則って書かないとすぐにシンタックスエラーとなってしまうので、こまめにこのプラグインを使ってチェックすることで効率よく開発が行えるようになります。
また、Pipeline Syntax
というPipelineの作成をサポートしてくれる機能がJenkinsに標準搭載されています。
これもとても便利な機能なので合わせて使っていくとより素早くPipelineを作れるようになると思います。
ここからは Visual Studio Code
、Pipeline Syntax
の説明を交えながら実際にパイプラインを作っていきます。
-
まずはVSCodeの言語設定で
JenkinsFile
を選択します。画面右下から言語選択をします。
-
JenkinsFileを選択します。
-
pipeline
と入力してサジェストされたらそのままエンターを押してください。
-
Pipelineの型が出来上がります。
- ここに修正を入れていきます。
pipeline{ // <--- A
agent{ // <--- B
label "node" // <--- C
}
stages{ // <--- D
stage("A"){ // <--- E
steps{ // <--- F
echo "========executing A========" // <--- G
}
post{ // <--- H
always{
echo "========always========"
}
success{
echo "========A executed successfully========"
}
failure{
echo "========A execution failed========"
}
}
}
}
post{
always{
echo "========always========"
}
success{
echo "========pipeline executed successfully ========"
}
failure{
echo "========pipeline execution failed========"
}
}
}
必ず記載するブロック
A) pipeline
Pipeline
ブロックはDeclarative Pipelineを書く時のおまじないです。
java で言うpublic static void main(String[] args)
です。
とりあえず書きましょう。
B) agent
実行するノードを記入します。
特に指定しない場合は agent any
スレーブを設定している場合は label
を使って指定しましょう。
C) lavel
スレーブに設定してある名前を書くことで実行ノードを制御できます。
今回は slave1
と書きます。
D) stages
さらに続くstage
のセクションを包むブロックです。
E) stage
処理の固まりを表現するブロックです。本で例えると章立ての部分がstage
になります。
Pipelineを作ることはストーリーを作ることだと思います。わかりやすいストーリーにするためには章立てが大事です。
誰にでも伝わるストーリーにするためにもstage
ブロックにどのような文言を入れるかはしっかり吟味しましょう。
今回は download kitten image
としたいと思います。
F) steps
stepsブロックの中に必要な処理を書いていきます。
必要に応じて記載するブロック
G) echo
パイプラインのコンソールにメッセージを出力するステップです。
本当にただのechoです。
H) post
特定の処理が行われた後に実行する後処理を記載することができるブロックです。steps
またはstages
の後ろに書くことができます。
その際にstepsや、stagesの処理が成功したかどうかに応じて内容を振り分けることが可能です。
always
常に実行
success
前の処理が成功時のみ実行
failure
前の処理が失敗時のみ実行
このように使い分けることが可能です。
これらは特に必要がなければ書く必要はありません。
今回は、猫の画像をダウンロードするのに成功したら保存。
処理が終わったら成否に合わせてSlack通知の実行、加えてワークスペースの削除を行いたいので以下のものを残したいと思います。
- steps > post > success
- stages > post > always
- stages > post > success
- stages > post > failure
- スクリプトを修正
pipeline{
agent{
label "slave1"
}
stages{
stage("download kitten image"){
steps{
echo "=== start download kitten image ==="
echo "=== end download kitten image ==="
}
post{
success{
echo "======== executed successfully ========"
}
}
}
}
post{
always{
echo "========always========"
}
success{
echo "========pipeline executed successfully ========"
}
failure{
echo "========pipeline execution failed========"
}
}
}
ではこれをもとに行いたい処理を追加していきます。
やりたいことおさらい
- shellを実行して猫の画像を取得する
- 取得した画像を成果物として保存する。
- Slackに通知をする。
- ワークスペースを削除する。
スクリプト作成2 (shellを実行して猫の画像を取得する)
shellの実行は sh
ステップを使います。
VSCodeではサジェストされないのでJenkins標準のSnippet Generator
を使います。
- Pipeline Syntax を選ぶ
- 左のメニューで
Snippet Generator
を選ぶ - Stepsから項目を選べるので
sh
を選択します。
- Shell Scriptに実行処理を入れて
Generate Piepeline Script
を実行する。
- shステップの中身が作成されるのでこれをPipelineに書き込みます。
※注意点
スクリプトのシングルクォーテーション(')の中身はすべて文字列として判断されるので、変数展開がされません。
この例だと${KITTEN_IMAGE_FILE_NAME}
の部分が該当します。変数展開されるようにするためには代わりにダブルクォーテーション(")で囲んであげる必要があります。
NG: シングルクォーテーションなので変数展開されない。
sh label: '', script: 'curl --fail -o ${KITTEN_IMAGE_FILE_NAME} http://www.randomkittengenerator.com/cats/rotator.php'
OK: ダブルクォーテーションなので変数展開される。
sh label: '', script: "curl --fail -o ${KITTEN_IMAGE_FILE_NAME} http://www.randomkittengenerator.com/cats/rotator.php"
ここまでのスクリプト
pipeline{
agent{
label "slave1"
}
stages{
stage("download kitten image"){
steps{
echo "=== start download kitten image ==="
sh label: '', script: "curl --fail -o ${KITTEN_IMAGE_FILE_NAME} http://www.randomkittengenerator.com/cats/rotator.php"
echo "=== start download kitten image ==="
}
post{
success{
echo "======== executed successfully ========"
}
}
}
}
post{
always{
echo "========always========"
}
success{
echo "========pipeline executed successfully ========"
}
failure{
echo "========pipeline execution failed========"
}
}
}
スクリプト作成3 (画像を成果物として保存する)
成果物の保存も先ほどと同じようにSnippet Generatorから行います。
使用するステップはarchiveArtifacts
です。
先ほど同様シングルクォーテーションをダブルクォーテーションに修正してスクリプトに記載します。
ダウンロードが成功したときに実行したいのでstageのpostブロックに記載します。
pipeline{
agent{
label "slave1"
}
stages{
stage("download kitten image"){
steps{
echo "=== start download kitten image ==="
sh label: '', script: "curl --fail -o ${KITTEN_IMAGE_FILE_NAME} http://www.randomkittengenerator.com/cats/rotator.php"
echo "=== start download kitten image ==="
}
post{
success{
archiveArtifacts "${KITTEN_IMAGE_FILE_NAME}"
}
}
}
}
post{
always{
echo "========always========"
}
success{
echo "========pipeline executed successfully ========"
}
failure{
echo "========pipeline execution failed========"
}
}
}
スクリプト作成4 (Slackに通知・ワークスペース削除)
ここでも書き方は同じです。Snippet Generatorからスクリプトを作成します。
利用するステップは以下の通りです。
- Slackに通知:
slackSend
- ワークスペース削除:
cleanWs
slackSendの設定
- Message: "started ${env.JOB_NAME} ${env.BUILD_NUMBER} (<${env.BUILD_URL}|Open>)"
- Channel: "#topic_step_up_jenkins"
成功時
- color: "good"
失敗時
- color: "danger"
slackSend channel: '#topic_step_up_jenkins', color: 'good', message: "finished ${env.JOB_NAME} ${env.BUILD_NUMBER} (<${env.BUILD_URL}|Open>)"
cleanWsの設定
これで完成!! 完成したものをJenkinsの設定に書きましょう。
pipeline{
agent{
label "slave1"
}
stages{
stage("download kitten image"){
steps{
echo "=== start download kitten image ==="
sh label: '', script: "curl --fail -o ${KITTEN_IMAGE_FILE_NAME} http://www.randomkittengenerator.com/cats/rotator.php"
echo "=== start download kitten image ==="
}
post{
success{
archiveArtifacts "${KITTEN_IMAGE_FILE_NAME}"
}
}
}
}
post{
always{
cleanWs()
}
success{
slackSend channel: '#topic_step_up_jenkins', color: 'good', message: "finished ${env.JOB_BASE_NAME} ${env.BUILD_NUMBER} (<${env.BUILD_URL}|Open>)"
}
failure{
slackSend channel: '#topic_step_up_jenkins', color: 'danger', message: "finished ${env.JOB_BASE_NAME} ${env.BUILD_NUMBER} (<${env.BUILD_URL}|Open>)"
}
}
}
Pipelineジョブを実行する
- パラメータ付きビルド
- ビルド
- Slack通知
- ビルド結果確認
フリースタイルジョブと同様のことを行うことができました。
これでPipelineジョブの基本編は終わりです。
参考になるページ
Jenkins Official
- Pipeline Syntax
Pipeline SyntaxJenkins – an open source automation server which enables developers around the world to reliably build, test, and deploy...
agent
やstage
など、Pipelineを利用するにあたり必要な型の説明が書かれています。
- Pipeline Steps Reference
Pipeline Steps ReferenceJenkins – an open source automation server which enables developers around the world to reliably build, test, and deploy...
sh
やecho
など、Pipelineで使うステップの説明が書かれています。
Qiita
- 【Jenkins】declarative pipeline サンプル集
【Jenkins】declarative pipeline サンプル集 - Qiitadeclarative pipeline とはJenkins pipelineは次の2つの構文をサポートしています。Scripted PipelineDeclarative Pipeline …
私が書いた記事です。1年以上前に書いたものですが、22610回以上閲覧されています。
色々なサンプル作ってあるので是非見てください。
関連 ページ
- 【Jenkins】フリースタイルジョブを使いこなそう!~ かわいい子猫の画像を取得してみる ~
https://tielec.blog/index.php/sre/ci-cd/jenkins/free_style_job/
この記事で書いたパイプラインジョブをフリースタイルジョブで実現するやり方を記載しています。
- Jenkins Pipelineを学ぶ前に知っておいて欲しいこと
https://tielec.blog/index.php/sre/ci-cd/jenkins/pipeline-concept/
初めてJenkinsパイプラインについて学ぶ人に向けて書いた記事です。
おすすめ書籍
[改訂第3版]Jenkins実践入門 ――ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)
初めてJenkinsを学ぶ方におすすめです。
Jenkins
Jenkinsでできることについてもう少し詳しく学びたい方におすすめです。
コメント