TECHSTEP

ITインフラ関連の記事を公開してます。

GitLabテンプレートでCI/CDの起動条件を管理する

今回はGitLabのCI/CD起動条件をテンプレート上で管理する例を紹介します。

背景

CI/CDワークフローの起動条件をテンプレートで管理することで、Project全体のワークフローの起動条件を変更しやすくなります。例えばCI/CDをプロジェクトに導入してからブランチ戦略を変更する場合、導入済みの多くのワークフローの起動条件を修正する必要があります。これを事前にテンプレート管理することで、修正の手間を軽減できます。

今回はワークフローの起動条件をテンプレート化する例を紹介し、上記の場合にも素早く起動条件を変更できる(かもしれない)方法を紹介します。

GitLabテンプレートで利用できる機能

GitLabテンプレートでCI/CDの起動条件を管理する方法として、「Job単位で管理する方法」「Workflow全体で管理する方法」の2つを取り上げます。

※GitLabのテンプレートの利用方法は、以下の記事などを参照してください。

Job単位で管理する場合、 .gitlab-ci.yml 以外のテンプレートで条件を記載し、それを include キーワードで呼び出します。テンプレートには rules キーワードで起動条件を指定します。またテンプレート上で複数のJobの設定をする場合は extends キーワードも組み合わせて利用するJobを指定します。

具体的には以下のようなテンプレートを使用します。

job-template.yml

.job-name:
  stage: test
  script:
    - echo "Start job for MR"
  rules:
    - <起動条件を定義>

.gitlab-ci.yml

include:
  - local: 'job-template.yml'

test-job:
  extends: [.job-name]
  script:
    - echo "This job will start when MR is created."

Workflow単位で管理する場合もテンプレートを用意し、include キーワードで呼び出すのは同じです。こちらはテンプレート側で workflow.rules キーワードを使います。

workflow-template.yml

workflow:
  rules:
    - <起動条件を定義>

.gitlab-ci.yml

include:
  - local: 'workflow-template.yml'

test-job:
  script:
    - echo "This job will start when MR is created."

例:GitHub Flow

最後に実際に検証で使ったテンプレートを紹介します。今回はGitHub Flowを実現することを目指し、main ブランチに向けたPRの作成と更新、マージを実行したときに起動するよう設定しています。

.gitlab-ci-job-trigger.yml

default:
  image: alpine:latest
stages:
  - test
.trigger_main:
  stage: test
  script:
    - echo "Start job for develop MR"
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main"'
      when: always
    - when: never

.gitlab-ci-workflow-trigger.yml

workflow:
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main"'
      when: always
    - when: never

.gitlab-ci.yml

default:
  image: alpine:latest

include:
  # 利用するテンプレートのみを指定します
  - local: '.gitlab-ci-job-trigger.yml'
  - local: '.gitlab-ci-workflow-trigger.yml'

test-job:
  extends: [.trigger_main] # .gitlab-ci-job-trigger.ymlを利用する場合はこれを設定します
  script:
    - echo "This job will start when MR for main branch is created, updated & merged."