外部リポジトリのGitLab CI/CD
- プラン: Premium、Ultimate
- 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
GitLab CI/CDは、GitHub 、Bitbucket Cloud、またはその他のGitサーバーで使用できます。いくつかの既知の問題があります。
プロジェクト全体をGitLabに移動する代わりに、外部リポジトリを接続してGitLab CI/CDの利点を得ることができます。
外部リポジトリを接続すると、リポジトリのミラーリングが設定され、イシュー、マージリクエスト、Wiki、およびスニペットが無効になっている軽量プロジェクトが作成されます。これらの機能は後で再度有効にできます。
外部リポジトリに接続する
外部リポジトリに接続するには、次の手順に従います:
- 左側のサイドバーの上部で、新規作成( )を選択し、新規プロジェクト/リポジトリを選択します。新しいナビゲーションをオンにした場合、このボタンは右上隅にあります。
- 外部リポジトリのCI/CDを実行を選択します。
- GitHubまたはリポジトリのURLを選択します。
- フィールドに入力します。
外部リポジトリのCI/CDを実行オプションが利用できない場合:
- GitLabインスタンスにインポート元が設定されていない可能性があります。管理者にインポート元の設定を確認するように依頼してください。
- プロジェクトのミラーリングが無効になっている可能性があります。無効になっている場合、管理者のみが外部リポジトリのCI/CDを実行オプションを使用できます。管理者にプロジェクトのミラーリングの設定を確認するように依頼してください。
外部プルリクエストのパイプライン
GitHub上の外部リポジトリでGitLab CI/CDプルリクエストのコンテキストでパイプラインを実行できます。
GitHubのリモートブランチに変更をプッシュすると、GitLab CI/CDは、そのブランチのパイプラインを実行できます。ただし、そのブランチのプルリクエストを開くか更新するときは、次のことをお勧めします:
- 追加のジョブを実行します。
- 特定のジョブを実行しません。
例:
always-run:
script: echo 'this should always run'
on-pull-requests:
script: echo 'this should run on pull requests'
rules:
- if: $CI_PIPELINE_SOURCE == "external_pull_request_event"
except-pull-requests:
script: echo 'This should not run for pull requests, but runs in other cases.'
rules:
- if: $CI_PIPELINE_SOURCE == "external_pull_request_event"
when: never
- when: on_success外部プルリクエストのパイプライン実行
リポジトリがGitHubからインポートされると、GitLabはpushイベントとpull_requestイベントのWebhookをサブスクライブします。pull_requestイベントを受信するとすぐに、プルリクエストデータが保存され、参照として保持されます。プルリクエストが作成されたばかりの場合、GitLabはすぐに外部プルリクエストのパイプラインを作成します。
プルリクエストによって参照されるブランチに変更がプッシュされ、プルリクエストがまだ開いている場合、外部プルリクエストのパイプラインが作成されます。
GitLab CI/CDは、この場合2つのパイプラインを作成します。ブランチのプッシュ用と外部プルリクエスト用です。
プルリクエストが閉じられた後、新しい変更が同じブランチにプッシュされても、外部プルリクエストのパイプラインは作成されません。
追加の定義済み変数
外部プルリクエストのパイプラインを使用することにより、GitLabは追加の定義済み変数をパイプラインジョブに公開します。
変数名には、CI_EXTERNAL_PULL_REQUEST_というプレフィックスが付きます。
既知の問題
この機能は、以下をサポートしていません:
- GitHub Enterpriseに必要な手動接続方式。インテグレーションが手動で接続されている場合、外部プルリクエストはパイプラインをトリガーしません。
- フォークしたリポジトリからのプルリクエスト。フォークしたリポジトリからのプルリクエストは無視されます。
GitLabは2つのパイプラインを作成するため、開いているプルリクエストを参照するリモートブランチに変更がプッシュされると、両方ともGitHubインテグレーションを介してプルリクエストのステータスにコントリビュートします。外部プルリクエストでのみパイプラインを実行し、ブランチでは実行しない場合は、ジョブの仕様にexcept: [branches]を追加できます。詳細はこちら。
トラブルシューティング
- プルミラーリングがパイプラインをトリガーしません。
- ミラーリング時のハード障害を修正する。