リポジトリ、ブランチ、CIパイプライン
omnibus-gitlab
CIパイプラインは中々複雑で、パイプラインはプロジェクトのすべてのミラーに分かれています:
- 通常の機能開発用の開発者リポジトリ。
- リリースアーティファクトをビルドするためのリリースミラー。
- セキュリティ開発者のためのセキュリティミラー。
- 開発者がパッケージのビルドと開発目的の QA を実行するためのQA ミラー。
ブランチとタグの保護
保護ブランチ
- 開発者リポジトリ
-
master
:メンテナー、デリバリーチーム -
*-stable
:デリバリーチーム,リリースマネージャー -
*-stable-ee
:デリバリーチーム,リリースマネージャー -
*-auto-deploy-*
: メンテナー,delivery
グループ,managers
グループ
-
- リリースミラー:
-
master
:メンテナー -
*-stable
メンテナー -
*-stable-ee
メンテナー -
*-auto-deploy-*
メンテナー
-
- セキュリティミラーです:
-
master
:GitLab リリースツールボット,GitLab Bot,デリバリーチーム,リリースマネージャー -
*-stable
:GitLab リリースツールボット,GitLab Bot,デリバリーチーム,リリースマネージャー -
*-stable-ee
:GitLab リリースツールボット,GitLab Bot,デリバリーチーム,リリースマネージャー -
*-auto-deploy-*
:GitLab リリースツールボット,GitLab Bot,デリバリーチーム,リリースマネージャー
-
- QAミラー
-
master
:開発者 (マージのみ)、メンテナー
-
master
ブランチにアクセスできるのは、ブランチに対してトリガーパイプラインを実行するために必要だからです。この状況を変更するためのmaster
イシューがmaster
あります。保護されたタグ
- 開発者リポジトリ:
-
*
メンテナー、デリバリーチーム、リリースマネージャー
-
- リリースミラー:
-
*
:メンテナー
-
-
セキュリティミラーなし
- QAミラーなし
リポジトリ間のミラーリング
開発のほとんどはDevelopmentリポジトリで行われ、セキュリティ関連の変更はSecurity ミラーに送られます。これらの変更は、リリースミラーとQA ミラーにミラーされます。以下の図は、それぞれのリポジトリ間でミラーされる内容を示しています。
パイプラインの種類
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_PIPELINE | Canonical、QA | gemキャッシュとパッケージビルドキャッシュを更新します。CACHE_UPDATE 変数をtrue に設定する必要があります。 |
DURATION_PLOTTER_PIPELINE | QA | ビルドの期間をプロットするビルドパッケージ。DURATION_PLOTTER 変数をtrue に設定する必要があります。 |
DOCS_PIPELINE | Canonical、セキュリティ | ブランチ名の接頭辞にdocs- をつけるか、接尾辞に-docs をつける必要があります。 |
PROTECTED_TEST_PIPELINE | Canonical、セキュリティ | 保護されたブランチとタグ。トリガージョブや危険なレビュアーなどの不要なジョブは含まれません。 |
GITLAB_BRANCH_TEST_PIPELINE | Canonical、セキュリティ | 保護されていないブランチのプッシュ。danger-review のような不要なジョブは含まれません。トリガジョブを含みます。 |
GITLAB_MR_PIPELINE | Canonical、セキュリティ | Canonical/SecurityにブランチがあるMR(GitLabやチームメンバーのMRなど)。トリガージョブがあります。 |
AUTO_DEPLOY_BUILD_PIPELINE | Release | 自動デプロイタグがプッシュされたときにビルドします。 |
CE_BRANCH_BUILD_PIPELINE | Release | 通常のブランチがプッシュされたときにビルドします。 |
CE_NIGHTLY_BUILD_PIPELINE | Release | 夜間CEビルド。 |
CE_RC_BUILD_PIPELINE | Release | CE RCタグがプッシュされるとビルドされます。 |
CE_TAG_BUILD_PIPELINE | Release | 安定した CE タグがプッシュされたときにビルドします。 |
EE_BRANCH_BUILD_PIPELINE | Release | 通常のブランチがプッシュされたときにビルドしますが、EEパイプラインであることを強制します。 |
EE_NIGHTLY_BUILD_PIPELINE | Release | 夜間EEビルド。強制的にEEにするパイプラインが必要。 |
EE_RC_BUILD_PIPELINE | Release | EE RCタグがプッシュされたときにビルドします。 |
EE_TAG_BUILD_PIPELINE | Release | 安定版EEタグがプッシュされたときにビルドします。 |
TRIGGER_CACHE_UPDATE_PIPELINE | QA | トリガーされた QA パイプラインのビルドキャッシュを更新します。CACHE_UPDATE 変数をtrue に設定する必要があります。 |
TRIGGERED_CE_PIPELINE | QA | CEパッケージとイメージでe2e:package-and-testビルドをトリガー。 |
TRIGGERED_EE_PIPELINE | QA | EEパッケージとイメージでe2e:package-and-testビルドをトリガー。 |
FORK_BRANCH_TEST_PIPELINE | フォーク | プロジェクトのフォーク上で実行されるテストスイート。トリガージョブや危険なレビュアーなどの不要なジョブは含まれません。 |
FORK_MR_PIPELINE | フォーク | プロジェクトのフォークからのMRについて。トリガージョブは含まれません。 |
ブランチパイプライン
omnibus-gitlab
はまだデタッチドマージリクエストのパイプラインを使用していません。そのため、ブランチプッシュによるパイプラインが、このプロジェクトでよく使われるパイプラインです。これらのパイプラインは、開発者リポジトリ、セキュリティミラー、リリースミラーで使われます。
タグ パイプライン
リリースミラーへのタグプッシュはリリースジョブでパイプラインを開始します。開発者リポジトリと セキュリティミラーへのタグプッシュは、通常のブランチプッシュとして動作し (e2e:package-and-testパイプラインを開始するオプションがないことを除いて)、基本的なスタイルチェックとユニットテストを実行します。
スケジュールされたパイプライン
開発者リポジトリには、2つのスケジュールされたパイプラインがあります。
-
Dependencies Update
-dependency_update
ジョブを使用して古い依存関係をチェックするパイプライン。 -
Generate license pages
- S3バケットからのライセンス情報をLicense collectionウェブページに入力するパイプライン。
リリースミラーでは、次の2つのパイプラインがスケジュールされています。
-
CE nightly
- GitLab CE用のナイトリーパッケージとDockerイメージをビルドするパイプライン -
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
私たちはRSpec
とChefspec
を使って 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パイプラインでのみ実行されます。
<OS_NAME>-staging
これらのジョブは、前のジョブでビルドされたパッケージをPackagecloud インスタンスの内部ステージングリポジトリにアップロードします。
このジョブはRelease mirroron tagパイプラインでのみ実行されます。
<OS_NAME>-release
これらのジョブは内部のステージングリポジトリからPackagecloud インスタンスの公開リポジトリにパッケージをプルします。
このジョブはRelease mirroron tagパイプラインでのみ実行されます。
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-cache
と update-trigger-package-cache
.gems-cache
と.trigger-package-cache
の共有cache
定義から拡張されるジョブは、pull
のキャッシュのみです。
これらのキャッシュは、CACHE_UPDATE
が存在する場合、update-gems-cache
とupdate-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
実行と区別するため)。