はじめに
GitLab の CI/CD を組む際、タグ機能をどう組み込むかで調べたことを共有したいと思います
保護タグでできること
- タグの名称ルールによって保護タグにするかそうでないかを制御できる
ここでは正規表現のように細かい指定はできないようです
例)「 v\* 」とすると頭文字が v とするタグは保護タグとなる
- 権限を設定して保護タグを操作できる Role, User を制限することができる
- タグ作成をイベントとしてパイプラインを動かす際、manual 実行の権限を保護タグ権限で制御できる
参考 => https://docs.gitlab.com/ee/user/project/protected_tags.html
保護タグを使ったデプロイ戦略
タグを作成したタイミングでデプロイのパイプラインを動かすサンプルです
シナリオは以下
- マージリクエスト orPush によって main ブランチ更新
- 保護タグを作成(事前に「 v\* 」のルールを設定しておく)
- パイプラインが動き、stg_deploy_job まで自動で進む
- CI/CD -> Pipelines -> Pipeline を選択から手動で prod_deploy_job を開始する
stg_deploy_job:
stage: deploy
rules:
- if: $CI_COMMIT_TAG =~ /^v\d+.\d+.\d+/
script:
- echo "stg deploy"
prod_deploy_job:
stage: deploy/manual
when: manual
rules:
- if: $CI_COMMIT_TAG =~ /^v\d+.\d+.\d+/
script:
- echo "prod deploy"
CI 上では保護タグ名のパターンを正規表現で指定することができます
rules:
- if: $CI_COMMIT_TAG =~ /^v\d+.\d+.\d+/
とすることで
v1.1.1 のようなタグ名でタグを作った際にパイプラインを動かすことができます
特定のブランチにのみでタグ起点のパイプラインを動かす方法は?
現状タグはコミットに紐付けられますが、特定ブランチに紐づけているわけではないので CI 上で$CI_COMMIT_BRANCH を使用することができません
なので開発ブランチのコミットに誤ってタグを作ってしまったという場合もパイプラインが動いてしまいます
苦肉の策ですが以下のようにすることで実現してみました
stg_deploy_job:
stage: deploy
rules:
- if: $CI_COMMIT_TAG =~ /^v\d+.\d+.\d+/ && $CI_COMMIT_TITLE =~ /into \'main\'$/
script:
- echo "stg deploy"
マージリクエストからのみ main にマージを行う場合、GitLab では
「 Merge branch ‘<元となるブランチ名>’ into ‘main’ 」
という文字列になるのを利用して正規表現で末尾をマッチさせました
マージリクエスト時にコミットメッセージを変更したり、他ブランチでも末尾に into ‘main’とすると同じようにパイプラインが動いてしまいますので注意が必要なところはまだ課題となります
まとめ
GitLab の保護タグ機能を紹介しました
調べてみると色んなことができるのでもっと良いデプロイフローがないか勉強していきたいと思います