今回はGitLab rulesを少しだけ試してみました。
背景
GitLab CIに限らず、CI/CDのジョブを実行するタイミングを制御したいケースは多くあります。GitLabでは rules
というキーワード配下に条件を指定することで、ジョブの実行タイミングを制御できます。
ここでは rules
を使ったいくつかの例を簡単に検証しました。
検証
今回は以下のような .gitlab-ci.yml
ファイルを使用します。
stages: - build - test - deploy at-merge-request: stage: build script: - echo "This job is executed at merge request." rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event" at-file-change: stage: test script: - echo "This job is executed when target file is changed." rules: - if: $CI_COMMIT_BRANCH changes: - test.md at-manual-execution: stage: deploy script: - echo "This job is executed at manual." rules: - when: manual
Merge request経由でだけ起動する
まずはMerge requestイベント発生時のみ起動するジョブを見ます。 .gitlab-ci.yml
では以下のように rules:if
を利用します。
job: script: rules: - if: $CI_PIPELINE_SOURCE == “merge_request_event”
$CI_PIPELINE_SOURCE
はパイプラインがどうやって起動したか、そのイベントを格納する変数です。GitLabでMerge requestを作成・更新すると、この変数は merge_request_event
となり、これと一致するときは特定のジョブを起動します。
ここではMerge requestを作成し、 at-merge-request
というジョブだけが実行される様子を確認します。
適当なMerge requestを作成し、パイプラインを起動します。
パイプラインを確認すると、 at-merge-request
というJobのみ実行されていることを確認できます。
試しにこのMerge requestをマージしますが、どのJobも実行されないことも確認できます。
特定のファイルが修正されたときのみ起動する
特定のファイルが変更されたときのみ起動するJobを用意したい場合、以下のように changes
というキーワードを使うことで実現します。
job: script: rules: - changes: - <対象のファイル名を指定>
changes
は、指定したファイルが変更するかをチェックし、変更時にのみJobを実行します。
ここでは test.md
の変更があった時だけJobが起動する様子を確認します。なお今回の .gitlab-ci.yml
で記載している $CI_COMMIT_BRANCH
はコミットブランチ名が代入される変数で、ブランチからPushしたときにJobが起動するよう定義しています。
test.md
を作成するとパイプラインが起動し、 at-file-change
Jobだけが実行されます。
手動でのみ起動する
Jobを手動で実行する場合は when:manual
を利用できます。
job: script: rules: - when: manual
when
はJobをいつ実行するかを指定できます。ここでは when: manual
と指定し、Jobを手動でしか起動できないよう指定しています。
when: manual
と設定したJobは、以下のようにパイプライン画面から手動で実行できます。
Play
と表示されるボタンをクリックするとJobは実行され、しばらく待つと完了します。