GitLab CI/CDworkflow キーワード

workflow キーワードを使ってパイプラインの作成タイミングを制御します。

workflow キーワードはジョブの前に評価されます。例えば、ジョブがタグに対して実行されるように設定されているにもかかわらず、ワークフローがタグパイプラインを禁止している場合、ジョブは実行されません。

の一般的なif 節は次のとおりです。workflow:rules

workflow: rulesif 節のいくつかの例:

ルール例詳細
if: '$CI_PIPELINE_SOURCE == "merge_request_event"'マージリクエストパイプラインの実行タイミングを制御します。
if: '$CI_PIPELINE_SOURCE == "push"'ブランチパイプラインとタグパイプラインの両方を実行するタイミングを制御します。
if: $CI_COMMIT_TAGタグパイプラインの実行を制御します。
if: $CI_COMMIT_BRANCHブランチパイプラインの実行を制御します。

その他の例については、commonif clauses forrules を参照してください。

workflow: rules

以下の例をご覧ください:

  • すべてのpush イベント (ブランチの変更と新しいタグ) に対してパイプラインが実行されます。
  • コミットメッセージの末尾が-draft であるプッシュイベントのパイプラインは、when: never に設定されているため、実行されません。
  • スケジュールやマージリクエストのパイプラインも実行されません。
workflow:
  rules:
    - if: $CI_COMMIT_MESSAGE =~ /-draft$/
      when: never
    - if: $CI_PIPELINE_SOURCE == "push"

この例ではルールが厳しく、それ以外のケースではパイプラインは実行されません

また、すべてのルールをwhen: neverにし、最後にwhen: always のルールを追加することもできます。when: never ルールにマッチするパイプラインは実行されません。他のすべてのパイプラインタイプは実行されます。例えば

workflow:
  rules:
    - if: $CI_PIPELINE_SOURCE == "schedule"
      when: never
    - if: $CI_PIPELINE_SOURCE == "push"
      when: never
    - when: always

この例では、スケジュールまたはpush (ブランチとタグ) パイプラインのパイプラインは実行されません。最後のwhen: always ルールは、マージリクエストパイプラインを含む他のすべてのパイプラインタイプを実行します。

ブランチパイプラインとマージリクエストパイプラインの切り替え

GitLab 13.8 で導入されました

マージリクエストが作成された後にパイプラインをブランチパイプラインからマージリクエストパイプラインに切り替えるには、.gitlab-ci.yml ファイルにworkflow: rules セクションを追加します。

両方のパイプラインタイプを同時に使用すると、パイプラインが重複して実行される可能性があります。パイプラインの重複を防ぐには、CI_OPEN_MERGE_REQUESTS 変数を使用します。

次の例は、ブランチとマージリクエストパイプラインのみを実行し、それ以外のケースではパイプラインを実行しないプロジェクトの例です。実行されます:

  • ブランチパイプラインは、マージリクエストがブランチに対してオープンされていないときに実行します。
  • マージリクエストパイプラインは、ブランチに対してマージリクエストがオープンされている場合に使用します。
workflow:
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
    - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS
      when: never
    - if: $CI_COMMIT_BRANCH

GitLab がトリガーしようとした場合:

  • マージリクエストパイプラインを開始します。例えば、マージリクエストパイプラインは、関連するオープンなマージリクエストがあるブランチへのプッシュによってトリガーされます。
  • ブランチ パイプラインで、そのブランチに対してマージ リクエストが開かれている場合、ブランチ パイプラインを実行しません。たとえば、ブランチパイプラインは、ブランチへの変更、APIコール、スケジュールされたパイプラインなどによってトリガーされます。
  • ブランチ・パイプラインがあるが、そのブランチに対してマージリクエストが開かれていない場合、ブランチ・パイプラインを実行します。

既存のworkflow セクションにルールを追加して、マージリクエストが作成されたときにブランチパイプラインからマージリクエストパイプラインに切り替えることもできます。

このルールをworkflow セクションの先頭に追加し、その後にすでに存在する他のルールを追加します:

workflow:
  rules:
    - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS && $CI_PIPELINE_SOURCE == "push"
      when: never
    - ...                # Previously defined workflow rules here

ブランチ上で実行されるトリガーされたパイプラインには$CI_COMMIT_BRANCH が設定されているため、同様のルールでブロックされる可能性があります。トリガされたパイプラインは、パイプラインソースがtrigger またはpipelineであるため、&& $CI_PIPELINE_SOURCE == "push" 、ルールがトリガされたパイプラインをブロックしないようにします。

マージリクエストパイプラインを使った Git フロー

workflow: rules をマージリクエストパイプラインと一緒に使うことができます。このルールを使えば、マージリクエストパイプラインの機能をフィーチャーブランチで使えるようになります。また、複数のバージョンをサポートするために長寿命のブランチを維持することもできます。

たとえば、マージリクエスト、タグ、保護ブランチに対してのみパイプラインを実行します:

workflow:
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
    - if: $CI_COMMIT_TAG
    - if: $CI_COMMIT_REF_PROTECTED == "true"

この例では、長期ブランチが保護されていると仮定しています。

workflow:rules のテンプレート

GitLab 13.0から導入されました

GitLabは一般的なシナリオのためのworkflow: rules を設定するテンプレートを提供します。これらのテンプレートはパイプラインの重複を防ぐのに役立ちます。

Branch-Pipelines テンプレートはブランチとタグに対してパイプラインを実行させます。

ブランチパイプラインステータスは、ブランチをソースとして使用するマージリクエストに表示されます。しかし、このパイプラインタイプは、マージ結果パイプラインや マージトレインのような、マージリクエストパイプラインが提供する機能をサポートしていません。このテンプレートは意図的にこれらの機能を避けています。

インクルードするには

include:
  - template: 'Workflows/Branch-Pipelines.gitlab-ci.yml'

MergeRequest-Pipelines テンプレート は、デフォルトのブランチ、タグ、すべてのタイプのマージリクエストパイプラインに対してパイプラインを実行させます。マージリクエストパイプラインの機能を使用する場合は、このテンプレートを使用してください。

インクルードするには

include:
  - template: 'Workflows/MergeRequest-Pipelines.gitlab-ci.yml'

トラブルシューティング

マージリクエストでChecking pipeline status. メッセージが表示されます。

マージリクエストがChecking pipeline status. と表示されるにもかかわらず、メッセージが消えない (「スピナー」の回転が止まらない) 場合、それは が原因である可能性がありますworkflow:rules。 このイシューは、プロジェクトでPipelines must succeed workflow:rulesworkflow:rules有効になっているにもかかわらず、 workflow:rulesマージリクエストに対してパイプラインが実行されないworkflow:rules場合に発生する可能性が workflow:rulesあります。

例えば、このワークフローでは、パイプラインが実行できないため、マージリクエストはマージできません:

workflow:
  rules:
    - changes:
      - .gitlab/**/**.md
      when: never