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

はじめに

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

保護タグでできること

  • タグの名称ルールによって保護タグにするかそうでないかを制御できる

ここでは正規表現のように細かい指定はできないようです

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

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

参考 => 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 の保護タグ機能を紹介しました

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

無料相談実施中
AWSを使用したサーバーレスアプリケーションの構築
サーバーレス開発内製化、AWSへの移行等
様々な課題について無料でご相談お受けいたします。
最新情報をチェックしよう!