GitLab CI/CDworkflow
キーワード
workflow
キーワードを使ってパイプラインの作成タイミングを制御します。
workflow
キーワードはジョブの前に評価されます。例えば、ジョブがタグに対して実行されるように設定されているにもかかわらず、ワークフローがタグパイプラインを禁止している場合、ジョブは実行されません。
の一般的なif
節は次のとおりです。workflow:rules
workflow: rules
のif
節のいくつかの例:
ルール例 | 詳細 |
---|---|
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:rules
がworkflow:rules
有効になっているにもかかわらず、 workflow:rules
マージリクエストに対してパイプラインが実行されないworkflow:rules
場合に発生する可能性が workflow:rules
あります。
例えば、このワークフローでは、パイプラインが実行できないため、マージリクエストはマージできません:
workflow:
rules:
- changes:
- .gitlab/**/**.md
when: never