GitLabCIで承認プロセスを実装してみた
お久しぶりです。Arumonの寺田です。
皆さん、GitLabはお使いでしょうか。
おそらくGitHubをお使いの方が多いのではないかと思いますが、今日はGitLabについて、共有できればと思います。
はじめに
最近、業務でGitLabCIを用いたのですが、こんなことを思いました。
「AWS CodePipelineみたいにパイプラインが一度止まって、ビルドした内容に問題がなければ、手動で後続のパイプラインを回せないかな」と。
色々と調べて、なんとか実装できたので、その内容や方法について共有できればと思います!
この記事でわかること・結論
GitLabCIを用いた、承認プロセスの方法がわかる
⇒ whenパラメータに、manualを指定すればOK!
deploy:
stage: deploy
when: manual
Artifactの出力方法がわかる
⇒ artifactsパラメータを使えばOK!
build:
stage: build
artifacts:
paths:
- build.txt
それでは、詳細に行きます!
概要
まずは、今回、説明用に作成したパイプラインの概念図およびそれぞれのジョブの説明を以下に示します。
作成したパイプラインは、Stage,Jobともに、「Build」「Verification」「Deploy」で構成されています。
Build:リリース資材(build.txt)のビルドを行います。
Verification:ビルドした資材の検証を行い、検証結果(result.html)を出力します。
Deploy:Verificationで出力した検証結果がOKの場合、手動で実行し、対象環境にデプロイします。
ソースコード
実際に実装した「.gitlab-ci.yml」について、重要なところだけピックアップします。
// .gitlab-ci.yml
stages:
- build
- verification
- deploy
# ビルド
build:
stage: build
before_script:
- echo [Info] build start
script:
- chmod +x Script/distribute/build.sh
- Script/distribute/build.sh
artifacts:
paths:
- build.txt
only:
variables:
- $CI_PIPELINE_JOB == "cicd-test"
# 資材検証
verification:
stage: verification
before_script:
- echo [Info] verification start
script:
- chmod +x Script/distribute/verification.sh
- Script/distribute/verification.sh
artifacts:
paths:
- result.html
only:
variables:
- $CI_PIPELINE_JOB == "cicd-test"
# デプロイ
deploy:
stage: deploy
before_script:
- echo [Info] deploy start
script:
- echo [Info] deploy OK!
when: manual
only:
variables:
- $CI_PIPELINE_JOB == "cicd-test"
artifacts:ジョブ内で生成されたファイルなどを出力できるパラメータです。GitLabのコンソールから取得可能です。
only:(今回の本題からは少しずれますが)このパラメータを指定することで、Schedulesの環境変数で指定された文字列が含まれている場合のみ、パイプラインを稼働させるということを実現できます。
when:manualを指定することで、対象のジョブを手動実行できる形になります。(今回の本題)
以下には、ジョブ内で実行しているシェルスクリプト「build.sh」「verification.sh」の説明を入れています。(.gitlab-ci.ymlの該当箇所も再掲しています)
今回は、とても簡易的に実装しましたが、ビルドした資材を出力して、その資材を元に検証を行うという点は同じです。
参考までにご覧ください。
// .gitlab-ci.yml > buildジョブ
# ビルド
build:
stage: build
before_script:
- echo [Info] build start
script:
- chmod +x Script/distribute/build.sh
- Script/distribute/build.sh
artifacts:
paths:
- build.txt // -- build.shで生成されたbuild.txtを出力 -- //
only:
variables:
- $CI_PIPELINE_JOB == "cicd-test"
// build.sh
#!/bin/bash
function set_variables() {
export LANG="ja_JP.utf8"
DIR=`pwd`
BUILD=${DIR}/build.txt
}
function create_build() {
touch ${BUILD}
cp /dev/null ${BUILD}
echo "Build!!" >> ${BUILD}
}
echo "build.sh Start."
echo "[Info] Set variables"
set_variables
echo "[Info] Create build"
create_build
echo "build.sh End."
build.shでは、例として、中身に「Build!!」と書かれた「build.txt」を出力しています。実際の運用では、リリースする資材が出力されるようにします。(例えば、iOSアプリであれば、build.shの代わりにfastlaneを回すことになると思います。)
// .gitlab-ci.yml > verificationジョブ
# 資材検証
verification:
stage: verification
before_script:
- echo [Info] verification start
script:
- chmod +x Script/distribute/verification.sh
- Script/distribute/verification.sh
artifacts:
paths:
- result.html // -- verification.shで生成されたresult.htmlを出力 -- //
only:
variables:
- $CI_PIPELINE_JOB == "cicd-test"
// verification.sh
#!/bin/bash
function set_variables() {
export LANG="ja_JP.utf8"
DIR=`pwd`
export COMPARE="Build!!"
export BUILD=`grep "Build!!" ${DIR}/build.txt`
}
function compare() {
if [ "${BUILD}" = "${COMPARE}" ]; then
export RESULT="OK"
else
export RESULT="NG"
fi
}
function create_html() {
cat ${DIR}/Script/distribute/result.html.template | envsubst > ${DIR}/result.html
}
echo "verification.sh Start."
echo "[Info] Set variables"
set_variables
echo "[Info] Compare"
compare
echo "[Info] Create HTML"
create_html
echo "verification.sh End."
verification.shでは、buildジョブで作成された、「build.txt」の中身を抽出して、その中身が「Build!!」と等しいかどうかを検証しています。等しかったかどうかを「result.html」に書き込み、verificationジョブ内でartifactsとして、出力しています。
出力された、「result.html」を承認者が確認して、問題なければ、deployジョブの再生ボタンを押して、デプロイするという運用を取っています。
ちなみに、result.htmlはただ比較をして、その内容を確認したいだけなので、以下のような殺風景な出力結果となっています。
もう少しリッチに作りたい場合は、テンプレートの中身を変えれば良いですね!
// result.html.template
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Compare Build Artifact</title>
</head>
<body>
<h2>検証</h2>
<table border="2" bordercolor="#696969">
<tr bgcolor="e0ffff">
<th>比較対象</th>
<th>出力結果</th>
<th>比較先</th>
<th>比較結果</th>
</tr>
<tr>
<td>Build</td>
<td>${BUILD}</td>
<td>${COMPARE}</td>
<td align="center">${RESULT}</td>
</tr>
</table>
</body>
</html>
さいごに
最後までにご覧いただきありがとうございます。
かなり端折って説明させていただきましたが、いかがだったでしょうか。
GitLabはあまり使われていないですが、どなたかの一助になれば幸いです。
記事について何か質問等ございましたら、お気軽にご連絡ください。
また、何かアドバイスもあればお願いします!
では、失礼します…!
この記事が参加している募集
この記事が気に入ったらサポートをしてみませんか?