TECHSTEP

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

GitLab rulesを試す

今回はGitLab rulesを少しだけ試してみました。

docs.gitlab.com

背景

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は実行され、しばらく待つと完了します。