やりたいこと
gitlabにて、commitしたコードを使ってコンテナ(Webアプリケーション)をデプロイするCIを運用中。
本番とステージングの2種類を用意しているため、各々の画面を見たときに、これはどのコミットなのかすぐに判別したい(本番とステージングで差があるかどうか)。
解決策
GitLab10.8以上という条件付きではあるが、Gitlabであらかじめ用意されている環境変数を使用すればよい。
GitLab CI/CD Variables
この中の、CI_COMMIT_TITLEを使用する。
まず、表示させたいページのHTMLに、以下のような内容を追記する。
<p class="text-muted" align="right">Commit Version: CI_COMMIT_TITLE</p>
このCI_COMMIT_TITLEをCIのジョブで書き換える。
以下では確認のために、exportとechoで変数の内容を確認するステップを入れている。
before_script:
- docker info
- export
- echo ${CI_COMMIT_TITLE}
- sed -i -e "s/CI_COMMIT_TITLE/${CI_COMMIT_TITLE}/g" templates/toppage.html
build:
script:
- docker build -t citest .
#(略)
これでtoppage.htmlを表示させれば、コミットメッセージの最初の1行が表示される。
Shell Executerの場合(2020/1/7 Update)
上記の方法はshell executerでCIを行っているときには有効ではなかった。その場合は次のように、
まず--build-argオプションを使って、DockerfileにCI_COMMIT_TITLEを渡す。
build:
script:
- docker build -t citest . --build-arg commit_title="$CI_COMMIT_TITLE"
#(略)
そしてDockerfile内でその変数を使用してHTMLを書き換える。
ARG commit_title
RUN sed -i -e "s%CI_COMMIT_TITLE%${commit_title}%g" deploy-automation/templates/datadomain/home.html
ここでsedのセパレータとして%を使用しているのは、コミットタイトルにデフォルトのセパレータである/(スラッシュ)が入っていることが多いため。
補足
ちなみに"$CI_COMMIT_TITLE"をダブルクォータで囲まないと、CI_COMMIT_TITLEに空白がある場合に以下のようなエラーで失敗する。
$ sudo docker build citest --build-arg commit_title=$CI_COMMIT_TITLE .
"docker build" requires exactly 1 argument.
See 'docker build --help'.
Usage: docker build [OPTIONS] PATH | URL | -
Build an image from a Dockerfile
ERROR: Job failed: exit status 1