GitLabで保護タグ(Protected Tag)の機能を活用してみた

#GitLab
#CI/CD
#保護タグ

GitLab の CI/CD を組む際、タグ機能をどう組み込むかで調べたことを共有したいと思います

  • タグの名称ルールによって保護タグにするかそうでないかを制御できる ここでは正規表現のように細かい指定はできないようです

    例)「 v* 」とすると頭文字が v とするタグは保護タグとなる

  • 権限を設定して保護タグを操作できる Role, User を制限することができる

  • タグ作成をイベントとしてパイプラインを動かす際、manual 実行の権限を保護タグ権限で制御できる

protected tags

参考 => https://docs.gitlab.com/ee/user/project/protected_tags.html

タグを作成したタイミングでデプロイのパイプラインを動かすサンプルです

シナリオは以下

  • 1、マージリクエスト orPush によって main ブランチ更新

  • 2、保護タグを作成(事前に「 v* 」のルールを設定しておく)

  • 3、パイプラインが動き、stg_deploy_job まで自動で進む

  • 4、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 の保護タグ機能を紹介しました

調べてみると色んなことができるのでもっと良いデプロイフローがないか勉強していきたいと思います