外部コミットステータス
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
外部コミットステータスを使用すると、Jenkins、CircleCI、カスタムデプロイツールなどの外部CI/CDシステムをGitLabパイプラインと統合できます。外部システムはコミットステータスをGitLabにポストし、ステータスの結果はマージリクエストとコミットビューのCI/CDジョブとともに表示されます。
外部システムがCommits APIを使用してコミットステータスをポストすると、GitLabはこれらのステータスを既存のパイプラインに追加するか、それらを含める新しいパイプラインを作成して処理します。
パイプラインの選択
外部システムからコミットステータスをポストすると、検索または作成のアプローチが使用されます:
- GitLabは、指定されたコミットSHAとrefsの最新の
non-archivedCIパイプラインを検索します。pipeline_idパラメータを含めることで、パイプラインを直接検索することもできます。 - GitLabが適切なパイプラインを見つけた場合、新しいジョブステータスをそのパイプラインに追加します。既存のパイプラインに追加されたジョブの場合、
CI_PIPELINE_SOURCEはパイプラインソース(pushやmerge_request_eventなど)と一致します。 - 適切なパイプラインが存在しない場合、GitLabはジョブを含める新しいパイプラインを作成します。新しいパイプラインの場合、
CI_PIPELINE_SOURCEはexternalです。
外部ジョブステータスは、他のGitLab CI/CDステージとは別に、パイプラインのexternalステージに表示されます。
同じコミットに対して重複するパイプラインが存在する場合、外部ステータスの配置があいまいになります。GitLabはnewest_firstを使用して最新のパイプラインを選択しますが、同時パイプライン作成では、外部ステータスが予期しないパイプラインに表示されたり、マージリクエストビューに表示されなくなったりする可能性があります。
重複するパイプラインを回避したり、pipeline_idでパイプラインを直接ターゲットにしたりするには、ワークフロールールを設定します。
ジョブの更新と再試行
外部システムからコミットステータスをポストする場合:
- 同じ
nameuserおよびshaを持つrunningまたはpendingジョブがターゲットパイプラインにすでに存在する場合、GitLabはそのステータスを更新します。- 別のユーザーが同じ
nameでジョブを更新すると、ジョブが再試行されます。これにより、新しいジョブが作成され、現在のパイプラインから古いジョブが非表示になります。
- 別のユーザーが同じ
nameが同じでstatusが異なる(たとえば、failedとマークされたジョブにsuccessを送信する)runningまたはpendingでないジョブを再試行できます。これにより、新しいジョブが作成され、現在のパイプラインから古いジョブが非表示になります。- 異なる外部サービスは、一意のジョブ
nameを使用して、同じSHAとパイプラインにジョブを追加できます。
SHA/refsの組み合わせで更新がすでに進行中の場合、409エラーが返されます。このエラーを処理するには、リクエストを再試行してください。
トラブルシューティング
マージリクエストに外部ステータスが表示されない
外部CIステータスがマージリクエストパイプラインに表示されない場合:
- 同じコミットに対してマージリクエストとブランチパイプラインの両方が実行されているかどうかを確認します。
- ワークフロールールが重複するパイプラインを防いでいることを確認してください。
- 外部システムが正しいrefsにポストしていることを確認します。
- コミットがマージリクエストに関連付けられている場合は、APIコールがマージリクエストのソースブランチ内のコミットを対象としていることを確認してください。
詳細については、重複するパイプラインの回避を参照してください。