今回はGitLabのCI/CD起動条件をテンプレート上で管理する例を紹介します。
背景
CI/CDワークフローの起動条件をテンプレートで管理することで、Project全体のワークフローの起動条件を変更しやすくなります。例えばCI/CDをプロジェクトに導入してからブランチ戦略を変更する場合、導入済みの多くのワークフローの起動条件を修正する必要があります。これを事前にテンプレート管理することで、修正の手間を軽減できます。
今回はワークフローの起動条件をテンプレート化する例を紹介し、上記の場合にも素早く起動条件を変更できる(かもしれない)方法を紹介します。
GitLabテンプレートで利用できる機能
GitLabテンプレートでCI/CDの起動条件を管理する方法として、「Job単位で管理する方法」「Workflow全体で管理する方法」の2つを取り上げます。
※GitLabのテンプレートの利用方法は、以下の記事などを参照してください。
- GitLab rulesを理解してCI/CD Jobの起動を制御する - APC 技術ブログ
- GitLabのCI/CDで超重要なrulesの全てを理解する | DevelopersIO
- GitLabのtemplate機能を組み合わせて開発生産性を向上する - APC 技術ブログ
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."