見出し画像

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を指定することで、対象のジョブを手動実行できる形になります。(今回の本題)

GitLab上のパイプライン

以下には、ジョブ内で実行しているシェルスクリプト「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
// 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はあまり使われていないですが、どなたかの一助になれば幸いです。

記事について何か質問等ございましたら、お気軽にご連絡ください。
また、何かアドバイスもあればお願いします!

では、失礼します…!


この記事が参加している募集

この記事が気に入ったらサポートをしてみませんか?