2023/07/06 GitLab.com Enterprise Edition 16.2.0-pre の画面に差し替え、一部の文言を更新しました。
皆様こんにちは。SEの小池と申します。
以前、GitLabのCI/CDパイプラインのキーワード解説で include
を取り上げました。(こちら)
ほぼ筆者の自習メモと化しているこのキーワード解説なのですが、ふと筆者は気が付きました・・・。
というわけで、今回はキーワード stages の概要と具体例を用いた説明をします。
- 本記事の対象の方
- 今回のブログのゴール
- このブログをお読みいただくにあたっての事前ご連絡事項
- ケーキ作りで考えるキーワード stages の概念
- キーワード stages の概要
- stages の超簡単な使い方の例
- 最後に
本記事の対象の方
- GitLabのCI/CDパイプラインをはじめて構成しようとなさっている方。
- GitLabのCI/CDパイプラインの書き方がさっぱりわからなくて困っている方。
今回のブログのゴール
このブログのゴールはこちらです。
- GitLabのCI/CDパイプラインのキーワード stages の概要を把握する。
- キーワード stages を使ってみる。
- キーワード stages を宣言しないで、デフォルトのステージを使ってみる。
このブログをお読みいただくにあたっての事前ご連絡事項
- 本記事はSaaS版 (GitLab.com) の Enterprise Edition 16.2.0-pre (Ultimate) における仕様をベースに記載しております。それ以外のエディションやバージョンではこの記事に記載の通りではない可能性がございます。
- 本記事の操作説明と画面ショットはGitLabのローカライズを日本語にした状態で説明しております。それ以外の言語をご利用の方は適宜読み替えてください。
- 本記事はGitやCI/CDに関する知識ゼロのSEによるなんちゃって記事です。GitLabのディープな使用法についてはGitLabの公式オンラインドキュメント (こちら) をご参照ください。
ケーキ作りで考えるキーワード stages の概念
いつもはキーワードの概要から記載するのですが、今回は先にステージの概念を説明します。
今回は超初心者向けということで、思い切ってITから頭を離して、家でケーキを作る工程を例にキーワード stages の概念を説明いたします!
大丈夫かいな・・・すでに不安。
まず、家でチョコレートケーキを作りたいとします。
家にはボウル、泡だて器、はかり、ふるい、計量カップがないことに気が付いたので、近所のホームセンターに買いに行きます。
要するにまずは 調理器具を買うというステージがあるわけです。
必要な調理器具はそろったので、次は食材です。
小麦粉、牛乳、卵、砂糖、チョコレート、バター、パウダーシュガーなどを近所のスーパーで買う必要があります。
つまり 食材を買うというステージがあるわけです。
食材もそろったので、レシピ通りに作っていきます。
レシピには以下のように書いてあります。なおこのレシピは架空のレシピなので実際に作らないでください!
このレシピ通り作っていく、つまり調理するというステージがあるわけです。
- チョコレートとバターをレンジで溶かす。(A)
- 卵と砂糖を混ぜて泡立てる。(B)
- (A) と (B) と牛乳を混ぜる。
- 小麦粉をふるいながら入れ、混ぜる。
- 炊飯器に入れて、白米を炊くのと同じように炊飯する。
- 炊き上がったら竹串などを差して焼け具合を確認する。
- パウダーシュガーをいい感じにふる。
で、最終的にチョコレートケーキができました。
といったように、チョコレートケーキを作る例で考えると、ふるいを買う・小麦粉を買う・バターを溶かす 等様々なタスクがあります。
これらのタスクを、実行する順番を考慮し、ある程度まとまった処理単位で考えると、調理器具を買う・食材を買う・調理する 等の段階で区分できます。
CI/CDパイプラインではこの、ふるいを買う、小麦粉を買う、バターを溶かす 等の一つ一つのタスクがジョブにあたり、調理器具を買う、食材を買う、調理する 等の段階がステージにあたります。
つまり、ケーキ作りの場合を強引にGitLabのCI/CDパイプラインっぽく置き換えると、こんな感じになります。
・・・なんとなくGitLabのCI/CDパイプラインにおける ステージ のイメージつきましたでしょうか?キーワード stages の概要
ケーキのたとえ話はこのくらいにして、キーワード stages
の概要に移ります。
stages
は、CI/CDパイプラインの中で実行される複数のジョブを "ステージ" という単位にまとめ、その実行順序を制御するキーワードです。
先ほどのケーキ作りで考えると、下図の赤枠部分を定義するのが stages
です。
GitLabに限らず、CI/CDパイプラインにおいてステージはある程度意味のある処理単位で構成するのがセオリーです。よくあるのはビルドステージ、テストステージ、デプロイステージ等です。
GitLabのCI/CDパイプラインにおいて、ジョブは必ずどこかのステージに属している必要があります。
GitLabでは stages
でステージを複数定義した場合、基本的には前のステージのジョブが全て終わってから、次のステージのジョブが実行されます。
(ただし、ジョブにキーワードneeds
等を指定し、ステージをまたいだジョブの依存関係を定義している場合はこの限りではありません。)
GitLabのCI/CDパイプランでは、同じステージの中のジョブは並列に実行されます。
(ただし、他のキーワードを使って依存関係などを指定していない場合に限ります。また、ステージ内で並列実行されるジョブ数はRunnnerの数と設定に依存します。)
CI/CDパイプラインの途中でジョブが失敗してしまった場合。
失敗したジョブがあるステージに存在する未実行のジョブは、そのまま実行されます。
失敗したジョブが存在するステージより後ろのステージは実行されません。
GitLabにおいては stages
は任意で指定するグローバルキーワードです。
stages
でステージを定義していない場合、GitLabでは以下のデフォルトのステージが用意されます。
- .pre
- build
- test
- deploy
- .post
stages の超簡単な使い方の例
ここからは実際にキーワードstages
の使い方を、超簡単な例を用いて紹介してまいります。
例1:明示的にstagesを定義する場合
まずは明示的にステージを宣言する場合をご紹介いたします。
まず、GitLabで適当なプロジェクトを作成します。リポジトリは空で大丈夫です。
プロジェクトができたら、[ビルド] > [パイプラインエディタ] を開きます。
[パイプラインの設定] をクリックします。
サンプルが色々書いてありますが、とりあえず全部削除します。
ここでは例として以下のステージとジョブを構成してみます。
ステージ名 | ジョブ名 | ジョブ内容 |
---|---|---|
build | build_job01 | echo "ビルドジョブ" |
test | test_job01 | echo "テストジョブ" |
deploy | deploy_job01 | echo "デプロイジョブ" |
まず、明示的にステージを宣言します。
今回作るステージはbuild
, test
. deploy
の3つです。
stages: - build - test - deploy
続いてジョブの設定を入れていきます。
まず例として、ステージ build
にジョブ build_job01
を作成します。
stages: - build - test - deploy build_job01: stage: build script: - echo "ビルドジョブ"
同じ要領で残りの2個のジョブも設定します。
stages: - build - test - deploy build_job01: stage: build script: - echo "ビルドジョブ" test_job01: stage: test script: - echo "テストジョブ" deploy_job01: stage: deploy script: - echo "デプロイジョブ"
この時点でこのCI/CDパイプラインを概念図に起こすと、こんな感じになります。
画面下部の [ブランチ] を任意の文字列に変更し、[変更をコミット] をクリックします。
[パイプラインの表示] をクリックします。
CI/CDパイプラインの状態が表示されます。
今回の場合、stages
で宣言したステージが左から順に build
, test
, deploy
と並んでいることがわかります。
左側のステージから実行されるので、ジョブの実行順序は build_job01
, test_job01
, deploy_job01
となります。
以上がステージを明示的に宣言した場合の stages
の使用例です。
例2:stagesを宣言しないでデフォルトのステージを利用する場合
次にstagesを宣言しないでデフォルトのステージを利用する場合をご紹介いたします。
GitLabで適当なプロジェクトを作成します。リポジトリは空で大丈夫です。
プロジェクトができたら、[ビルド] > [パイプラインエディタ] を開きます。
[パイプラインの設定] をクリックします。
サンプルが色々書いてありますが、とりあえず全部削除します。
ここでは例として以下のステージとジョブを構成してみます。
ステージ名 | ジョブ名 | ジョブ内容 |
---|---|---|
.pre | samplejob01_.pre | echo ".preステージで実行されるジョブです。" |
build | samplejob02_build | echo "buildステージで実行されるジョブです。" |
test | samplejob03_test | echo "testステージで実行されるジョブです。" |
deploy | samplejob04_deploy | echo "deployステージで実行されるジョブです。" |
.post | samplejob05_.post | echo ".postステージで実行されるジョブです。" |
今回はデフォルトのステージを使用するため、stages
によるステージの宣言は不要です。
ステージ.pre
で実行するジョブを作ります。
samplejob01_.pre: stage: .pre script: - echo ".preステージで実行されるジョブです。"
同じ要領で残りの4個のジョブも設定します。
samplejob01_.pre: stage: .pre script: - echo ".preステージで実行されるジョブです。" samplejob02_build: stage: build script: - echo "buildステージで実行されるジョブです。" samplejob03_test: stage: test script: - echo "testステージで実行されるジョブです。" samplejob04_deploy: stage: deploy script: - echo "deployステージで実行されるジョブです。" samplejob05_.post: stage: .post script: - echo ".postステージで実行されるジョブです。"
この時点でこのCI/CDパイプラインを概念図に起こすと、こんな感じになります。
画面下部の [ブランチ] を任意の文字列に変更し、[変更をコミット] をクリックします。
[パイプラインの表示] をクリックします。
CI/CDパイプラインの状態が表示されます。
stages
で明示的にステージの定義をしていませんが、デフォルトのステージが左から .pre
, build
, test
, deploy
, .post
で定義されていることがわかります。
左側のステージから実行されるので、ジョブの実行順序は samplejob01_.pre
, samplejob02_build
, samplejob03_test
, samplejob04_deploy
, samplejob05_.post
となります。
以上が stages
でステージを宣言しないで、デフォルトのステージを利用する例です。
最後に
この度はGitもCI/CDもよくわかっていないど素人SEによるGitLab検証ブログをお読みいただき、誠にありがとうございます。
このブログの目標は以下のとおりでしたが、皆さまはいかがでしたでしょうか。
- GitLabのCI/CDパイプラインのキーワード stages の概要を把握する。
- キーワード stages を使ってみる。
- キーワード stages を宣言しないで、デフォルトのステージを使ってみる。
ちょうど1年くらい前は筆者は「CI/CDパイプラインってなんですか?配管??」という知識レベルでした。
もっとも今も大して変わりませんが。
当時の私はCI/CDパイプラインにおけるステージの概念すらわかっていなかったので、「あの時にこういう記事があれば、CI/CDの入門にちょうどよかったかもしれない・・・」などと実体験を思い出しながら本記事を書きました。
この記事がGitLabを触り始めた方の一助となれば幸いにございます。
GitLabに関するお問い合わせは、以下のフォームからお願い致します。
GitLab製品 お問い合わせ
GitLab操作デモ動画 (基本編) を作ってみました。(音声の録音は自宅でiPhoneのボイスメモ使うという超低クオリティですが…。)
つたない内容ではありますが、ご興味がおありでしたら是非ご視聴いただければと存じます。