リポジトリ、ブランチ、CIパイプライン

omnibus-gitlab CIパイプラインは中々複雑で、パイプラインはプロジェクトのすべてのミラーに分かれています:

  1. 通常の機能開発用の開発者リポジトリ
  2. リリースアーティファクトをビルドするためのリリースミラー
  3. セキュリティ開発者のためのセキュリティミラー。
  4. 開発者がパッケージのビルドと開発目的の QA を実行するためのQA ミラー

ブランチとタグの保護

保護ブランチ

note
特に指定がない限り、リストアップされたユーザー/グループには、保護されたブランチへのマージとプッシュの両方の権限があります。
  1. 開発者リポジトリ
    1. master:メンテナー、デリバリーチーム
    2. *-stable:デリバリーチーム,リリースマネージャー
    3. *-stable-ee:デリバリーチーム,リリースマネージャー
    4. *-auto-deploy-*: メンテナー,delivery グループ,managers グループ
  2. リリースミラー:
    1. master:メンテナー
    2. *-stable メンテナー
    3. *-stable-ee メンテナー
    4. *-auto-deploy-* メンテナー
  3. セキュリティミラーです:
    1. master:GitLab リリースツールボット,GitLab Bot,デリバリーチーム,リリースマネージャー
    2. *-stable:GitLab リリースツールボット,GitLab Bot,デリバリーチーム,リリースマネージャー
    3. *-stable-ee:GitLab リリースツールボット,GitLab Bot,デリバリーチーム,リリースマネージャー
    4. *-auto-deploy-*:GitLab リリースツールボット,GitLab Bot,デリバリーチーム,リリースマネージャー
  4. QAミラー
    1. master:開発者 (マージのみ)、メンテナー
note
開発者が QA ミラーのmaster ブランチにアクセスできるのは、ブランチに対してトリガーパイプラインを実行するために必要だからです。この状況を変更するためのmasterイシューがmasterあります。

保護されたタグ

note
特に指定がない限り、リストアップされたユーザー/グループは、保護されたタグのマージとプッシュの両方の権限を持っています。
  1. 開発者リポジトリ:
    1. * メンテナー、デリバリーチームリリースマネージャー
  2. リリースミラー:
    1. *:メンテナー
  3. セキュリティミラーなし

  4. QAミラーなし

リポジトリ間のミラーリング

開発のほとんどはDevelopmentリポジトリで行われ、セキュリティ関連の変更はSecurity ミラーに送られます。これらの変更は、リリースミラーQA ミラーにミラーされます。以下の図は、それぞれのリポジトリ間でミラーされる内容を示しています。

graph TD A[Development repository] -->|Protected branches| B[Security mirror] A[Development repository] -->|Protected branches| C[Release mirror] A[Development repository] -->|All branches| D[QA mirror] B[Security mirror] -->|Protected branches| C[Release mirror] B[Security mirror] -->|All branches| D[QA mirror]

パイプラインの種類

omnibus-gitlab のジョブは複数のミラーにまたがっているため、ジョブを実行する場所/タイミングを指定するためにrules キーワードを使用すると、CI 設定が比較的複雑になります。そのため、omnibus-gitlab では、必要なパイプラインタイプをPIPELINE_TYPEという変数でマークし、必要に応じて様々なパイプラインタイプにジョブをアタッチするという、異なるアプローチを採用しています。異なるパイプライン・タイプは以下の表に示されています:

パイプラインタイプパイプラインが実行されるミラー(複数可備考
DEPENDENCY_SCANNING_PIPELINE正規表現依存関係のセキュリティ脆弱性をチェックします。DEPENDENCY_SCANNING 変数がtrue に設定されている必要があります。
DEPS_IO_VERSION_BUMP_PIPELINE正規表現 deps.io によるブランチのプッシュ。ブランチにはdeps- プレフィックスが必要です。
DEPS_IO_VERSION_CHECK_PIPELINE正規表現 deps を実行してアップデートを検出します。DEPS_PIPELINE 変数がtrue に設定されている必要があります。
LICENSE_PAGE_UPDATE_PIPELINE正規表現ライセンスページの更新。PAGES_UPDATE 変数がtrue に設定されている必要があります。
CACHE_UPDATE_PIPELINECanonical、QAgemキャッシュとパッケージビルドキャッシュを更新します。CACHE_UPDATE 変数をtrue に設定する必要があります。
DURATION_PLOTTER_PIPELINEQAビルドの期間をプロットするビルドパッケージ。DURATION_PLOTTER 変数をtrue に設定する必要があります。
DOCS_PIPELINECanonical、セキュリティブランチ名の接頭辞にdocs- をつけるか、接尾辞に-docs をつける必要があります。
PROTECTED_TEST_PIPELINECanonical、セキュリティ保護されたブランチとタグ。トリガージョブや危険なレビュアーなどの不要なジョブは含まれません。
GITLAB_BRANCH_TEST_PIPELINECanonical、セキュリティ保護されていないブランチのプッシュ。danger-review のような不要なジョブは含まれません。トリガジョブを含みます。
GITLAB_MR_PIPELINECanonical、セキュリティCanonical/SecurityにブランチがあるMR(GitLabやチームメンバーのMRなど)。トリガージョブがあります。
AUTO_DEPLOY_BUILD_PIPELINERelease自動デプロイタグがプッシュされたときにビルドします。
CE_BRANCH_BUILD_PIPELINERelease通常のブランチがプッシュされたときにビルドします。
CE_NIGHTLY_BUILD_PIPELINERelease夜間CEビルド。
CE_RC_BUILD_PIPELINEReleaseCE RCタグがプッシュされるとビルドされます。
CE_TAG_BUILD_PIPELINERelease安定した CE タグがプッシュされたときにビルドします。
EE_BRANCH_BUILD_PIPELINERelease通常のブランチがプッシュされたときにビルドしますが、EEパイプラインであることを強制します。
EE_NIGHTLY_BUILD_PIPELINERelease夜間EEビルド。強制的にEEにするパイプラインが必要。
EE_RC_BUILD_PIPELINEReleaseEE RCタグがプッシュされたときにビルドします。
EE_TAG_BUILD_PIPELINERelease安定版EEタグがプッシュされたときにビルドします。
TRIGGER_CACHE_UPDATE_PIPELINEQAトリガーされた QA パイプラインのビルドキャッシュを更新します。CACHE_UPDATE 変数をtrue に設定する必要があります。
TRIGGERED_CE_PIPELINEQACEパッケージとイメージでe2e:package-and-testビルドをトリガー。
TRIGGERED_EE_PIPELINEQAEEパッケージとイメージでe2e:package-and-testビルドをトリガー。
FORK_BRANCH_TEST_PIPELINEフォークプロジェクトのフォーク上で実行されるテストスイート。トリガージョブや危険なレビュアーなどの不要なジョブは含まれません。
FORK_MR_PIPELINEフォークプロジェクトのフォークからのMRについて。トリガージョブは含まれません。

ブランチパイプライン

omnibus-gitlab はまだデタッチドマージリクエストのパイプラインを使用していません。そのため、ブランチプッシュによるパイプラインが、このプロジェクトでよく使われるパイプラインです。これらのパイプラインは、開発者リポジトリセキュリティミラーリリースミラーで使われます。

タグ パイプライン

リリースミラーへのタグプッシュはリリースジョブでパイプラインを開始します。開発者リポジトリと セキュリティミラーへのタグプッシュは、通常のブランチプッシュとして動作し (e2e:package-and-testパイプラインを開始するオプションがないことを除いて)、基本的なスタイルチェックとユニットテストを実行します。

スケジュールされたパイプライン

開発者リポジトリには、2つのスケジュールされたパイプラインがあります。

  1. Dependencies Update - dependency_update ジョブを使用して古い依存関係をチェックするパイプライン。
  2. Generate license pages - S3バケットからのライセンス情報をLicense collectionウェブページに入力するパイプライン。

リリースミラーでは、次の2つのパイプラインがスケジュールされています。

  1. CE nightly - GitLab CE用のナイトリーパッケージとDockerイメージをビルドするパイプライン
  2. EE nightly - GitLab EE用のナイトリーパッケージとDockerイメージをビルドするパイプライン

その他のミラーにはスケジュールされたパイプラインはありません。

自動デプロイパイプライン

GitLabはリリースプロセスでAuto deployブランチとタグを使います。これらのブランチは<MAJOR>-<MINOR>-auto-deploy-<TIMESTAMP> という名前で、タグは<MAJOR>.<MINOR>.<TIMESTAMP>+<gitlab sha>.<omnibus-gitlab sha>.

変更をGitLab環境にデプロイするために必要な特定のジョブだけが、このパイプラインの一部となります。

トリガーパイプライン

QAミラーで“e2e:package-and-test “パイプラインを実行するために、トリガーパイプラインを使います。これらは、開発者リポジトリや GitLabプロジェクトのパイプラインからトリガーすることができます。

このパイプラインは、これらのアーティファクトに対して自動的に QA を実行することに加えて、開発者にパッケージとイメージを与えて変更をテストすることを意図しています。また、これらのアーティファクトを使ってスピンアップした HA インスタンスに対して QA を実行するオプションも提供します。

CI ジョブ

開発者のジョブ

danger-review

このジョブはマージリクエストがいくつかの基本的な要件を満たしているか、Dangerツールを使ってチェックします。

このジョブは、ブランチとタグパイプラインの開発者リポジトリと セキュリティミラーでのみ実行されます。

rubocop

特定のスタイル要件を満たすソースコードファイルをチェックします。

このジョブは、ブランチとタグパイプラインの開発者リポジトリと セキュリティミラーでのみ実行されます。

docs-lint

特定のスタイル要件を満たすために docs ファイルをチェックしてください。

このジョブは、ブランチとタグパイプラインの開発者リポジトリと セキュリティミラーでのみ実行されます。

review-docs-deploy

gitlab-docs の docs build をトリガーする手動ジョブで、現在のコミットからの変更点を含む GitLab Docs のレビューアプリをデプロイします。

このジョブはブランチパイプライン上の開発者リポジトリでのみ実行されます。

review-docs-cleanup

review-docs-deploy によって作成された環境を停止する手動ジョブです。マージリクエストのマージ時に自動的に実行されます。

このジョブはブランチパイプライン上の開発者リポジトリでのみ実行されます。

<OS_NAME> knapsack

私たちはRSpecChefspec を使って Chef レシピとライブラリを網羅するテストを行っています。これらはknapsackの助けを借りて Parallels されています。

このジョブは以前のパイプライン実行のknapsackレポーターをキャッシュから取り込み、現在のspec実行のために配置します。

これらのジョブは開発者リポジトリと セキュリティミラーでのみブランチパイプラインとタグパイプラインで実行されます。

<OS_NAME> specs

実際に実行されるジョブrspec knapsack 経由。parallel キーワードを使用してカウント 6 まで Parallels されます。

これらのジョブは開発者リポジトリと セキュリティミラーでのみブランチパイプラインとタグパイプラインで実行されます。

update-knapsack

このジョブは、ユニットテストの個々の並列実行からのレポーターを結合し、最終的な JSON レポートを作成します。このレポートは MR ウィジェットで仕様のステータスを表示するために使用され、また次のパイプラインが使用するためにキャッシュにアップロードされます。

このジョブは、ブランチパイプラインとタグパイプラインの開発者リポジトリと セキュリティミラーでのみ実行されます。

Trigger:ce-package

これは手動ジョブで、実行するとQAミラーのパイプラインがトリガーされ、開発者向けのパッケージビルドとQAが実行されます。これは開発者がテスト用のパッケージやDockerイメージを取得したり、MRの変更に対して完全なQAスイートを実行するために使用できます。

QAの失敗をデバッグするには、QAの失敗を調査するセクションを参照してください。このジョブはAllureレポートも生成します。詳細とデモはOmnibus-GitLab のテストレポート生成 を参照してください。

このジョブはブランチパイプライン上の開発者リポジトリと セキュリティミラーでのみ実行されます。

Trigger:ee-package

Trigger:ce-package と同じですが、EE パッケージをビルドします。

このジョブはブランチパイプライン上の開発者リポジトリと セキュリティミラーでのみ実行されます。

fetch-assets

パッケージのビルドには、GitLabや GitLab-FOSSパイプラインでコンパイル済みのRailsアセットを利用します。これらのパイプラインはそれをDockerイメージとしてプッシュし、私たちはそれをここに取り込み、アセット自体をあらかじめ定義された場所にコピーします。

このジョブはブランチ、タグ、トリガーパイプラインのリリースミラーと QAミラーでのみ実行されます。

Trigger:package

このジョブはアーティファクトとして利用可能な単一のパッケージをビルドします。

このジョブはトリガーされたパイプライン上のQAミラーでのみ実行されます。

Trigger:gitlab-docker

このジョブはTrigger:package ジョブによってビルドされたパッケージを使用して GitLab Docker イメージをビルドします。

このジョブはトリガーされたパイプライン上のQAミラーでのみ実行されます。

qa-test

このジョブはGitLab QAミラーのパイプラインをトリガーし、Trigger:gitlab-docker ジョブによって作成されたGitLab DockerイメージとGitLab RailsパイプラインによってビルドされたGitLab QA Dockerイメージを渡します。

このジョブはトリガーされたパイプライン上のQAミラーでのみ実行されます。

RAT

この手動ジョブは、Trigger:package ジョブによって構築されたパッケージへの URL を渡すRATプロジェクト内のパイプラインをトリガーします。このパイプラインは、GET を使用してそのパッケージで PostgreSQL HA インスタンスをスピンアップし、そのインスタンスに対して QA を実行します。

このジョブは、トリガーされたEEパイプラインのQAミラーでのみ実行されます。

<OS_NAME>-branch

これらのジョブは、指定されたOS用のパッケージをビルドし、アーティファクトとして利用できるようにするだけでなく、結果のパッケージをS3バケットにプッシュします。

このジョブはブランチ上のリリースミラーとナイトリーパイプラインでのみ実行されます。

NOTE:Raspberry Pi のジョブは CE ブランチでのみ実行され、SLES のジョブは EE ブランチでのみ実行されます。

Docker-branch

このジョブは、Ubuntu 22.04-branch ジョブでビルドされたパッケージを使用して GitLab Docker イメージをビルドします。イメージは GitLab コンテナレジストリにプッシュされます。

このジョブはブランチ上のリリースミラーとナイトリーパイプラインでのみ実行されます。

QA-branch

このジョブはRailsコードベースのqaディレクトリからGitLab QA Dockerイメージをビルドします。

このジョブはブランチ上のリリースミラーとナイトリーパイプラインでのみ実行されます。

リリースジョブ

<OS_NAME>

これらのジョブは、指定されたOS用のパッケージをビルドし、アーティファクトとして利用できるようにするだけでなく、結果のパッケージをS3バケットにプッシュします。

このジョブはRelease mirroron tagパイプラインでのみ実行されます。

note
Raspberry Pi のジョブは CE タグでのみ実行され、SLES のジョブは EE タグでのみ実行されます。

<OS_NAME>-staging

これらのジョブは、前のジョブでビルドされたパッケージをPackagecloud インスタンスの内部ステージングリポジトリにアップロードします。

このジョブはRelease mirroron tagパイプラインでのみ実行されます。

note
Raspberry Pi のジョブは CE タグでのみ実行され、SLES のジョブは EE タグでのみ実行されます。

<OS_NAME>-release

これらのジョブは内部のステージングリポジトリからPackagecloud インスタンスの公開リポジトリにパッケージをプルします。

このジョブはRelease mirroron tagパイプラインでのみ実行されます。

note
Raspberry Pi のジョブは CE タグでのみ実行され、SLES のジョブは EE タグでのみ実行されます。

Docker

このジョブはUbuntu 22.04ブランチのジョブでビルドされたパッケージを使用してGitLab Dockerイメージをビルドします。イメージはGitLab内部のコンテナレジストリにプッシュされます。

このジョブはRelease mirroron tagパイプラインでのみ実行されます。

Docker-Release

このジョブはGitLab内部のコンテナレジストリからGitLab Dockerイメージを取得し、Dockerhubにプッシュします。

このジョブはRelease mirroron tagパイプラインでのみ実行されます。

Docker-QA

このジョブはRailsコードベースのqaディレクトリからGitLab QA Dockerイメージをビルドし、GitLab内部のコンテナレジストリにプッシュします。

このジョブはReleaseミラーとタグパイプラインでのみ実行されます。

QA-Tag

このジョブはGitLab内部のコンテナレジストリからGitLab QA Dockerイメージを取得し、Dockerhubにプッシュします。

このジョブはReleaseミラーとタグパイプラインでのみ実行されます。

AWS

このジョブはUbuntu 20.04パッケージを使用してライセンスされていないAWS AMIをビルドします。

このジョブはReleaseミラーとタグパイプラインでのみ実行されます。

AWS-Ultimate

このジョブはUbuntu 20.04パッケージを使用してUltimateライセンスを組み込んだAWS AMIを構築します。

このジョブはリリースミラーとEEタグパイプラインでのみ実行されます。

AWS-Premium

このジョブはUbuntu 20.04パッケージを使用してPremiumライセンスを組み込んだAWS AMIを構築します。

このジョブはリリースミラーとEEタグパイプラインでのみ実行されます。

AWS-CE-Release

このジョブはAWS Marketplace の GitLab Community Edition のリストを現在のバージョンで更新します。

このジョブはRelease ミラーとCE タグパイプラインでのみ実行されます。

AWS-Ultimate-Release

このジョブはAWS MarketplaceのGitLab Ultimateのリストを現在のバージョンで更新します。

このジョブはリリースミラーとEEタグパイプラインでのみ実行されます。

AWS-Premium-Release

このジョブはAWS MarketplaceのGitLab Premiumのリストを現在のバージョンで更新します。

このジョブはリリースミラーとEEタグパイプラインでのみ実行されます。

create_omnibus_manifest

このジョブはdependency_scanning ジョブで使用するversion-manifest.json ファイルを作成します。

このジョブはリリースミラー、タグ、ナイトリーパイプラインでのみ実行されます。

dependency_scanning

このジョブは、パッケージの全コンポーネントの依存性スキャンを実行し、既知の脆弱性に対して脆弱性があるかどうかをチェックします。

このジョブはリリースミラー、タグ、ナイトリーパイプラインでのみ実行されます。

RAT-Nightly

このジョブは、このパイプラインでビルドされたUbuntu 22.04のナイトリーパッケージへのURLを渡すRATプロジェクトのパイプラインをトリガーし、GETを使用してそのパッケージでPostgreSQL HAインスタンスをスピンアップし、そのインスタンスに対してQAを実行します。

このジョブはナイトリーパイプラインのリリースミラーでのみ実行されます。

RAT-Tag

このジョブは、このパイプラインでビルドされたUbuntu 22.04パッケージへのURLを渡すRATプロジェクトのパイプラインを起動し、GETを使用してそのパッケージでPostgreSQL HAインスタンスをスピンアップし、そのインスタンスに対してQAを実行します。

このジョブはEEタグパイプラインのリリースミラーでのみ実行されます。

license-upload

このジョブはパッケージからすべての依存関係のライセンス情報をコンパイルし、S3バケットにアップロードします。これは、Development リポジトリのpages スケジュールジョブで、License collection ウェブページに入力するために使用されます。

ハウスキーピングジョブ

update-gems-cacheupdate-trigger-package-cache

.gems-cache.trigger-package-cache の共有cache 定義から拡張されるジョブは、pull のキャッシュのみです。

これらのキャッシュは、CACHE_UPDATE が存在する場合、update-gems-cacheupdate-trigger-package-cache のジョブによってそれぞれスケジュールされたパイプラインで更新されます。

dependency_update

このジョブはDependencies.ioを利用して、パッケージに含まれる様々なコンポーネントのバージョン更新を自動的にチェックし、更新が見つかった場合はDevelopmentリポジトリに対してマージリクエストを開きます。

このジョブは、DEPS_PIPELINE 変数が存在する場合、スケジュールされたパイプライン上で、Development リポジトリに対してのみ実行されます。

dependencies_io_check

このジョブは、dependency_update ジョブによってマージリクエストが行われると、QA ミラーの e2e:package-and-test パイプラインを自動的に起動します (Trigger:ce-package ジョブに似ています)。

このジョブは、ブランチ名がdeps で始まる場合、開発者リポジトリでのみ実行されます (これはdependency_update ジョブがマージリクエストに使うフォーマットです)。

valdiate_packer_changes

このジョブはPacker 設定ファイルが有効かどうかをチェックします。

このジョブはPacker 設定ファイルが変更されたとき、開発者リポジトリと セキュリティミラーでのみ実行されます。

pages

このジョブはGitLab Pagesに関連付けられ、GitLabの各リリースのパッケージに含まれる様々なコンテナのライセンス情報を含む静的ウェブサイトを生成します。

このジョブは開発者リポジトリと DEPS_PIPELINE 変数を持たないスケジュールされたパイプラインでのみ実行されます(dependency_update 実行と区別するため)。