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

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

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

ブランチとタグの保護

保護ブランチ

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

保護されたタグ

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

  4. QAミラー:なし

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

ほとんどの開発はDevelopmentリポジトリで行われ、セキュリティ関連の変更はSecurity ミラーに送られます。 これらの変更は、Release ミラーと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 そのため、ブランチプッシュによるパイプラインがこのプロジェクトでよく使われるパイプラインです。 これらのパイプラインは、開発者リポジトリ、セキュリティミラーリリースミラーで使われます。

タグパイプライン

Release ミラーへのタグプッシュは、リリースジョブによるパイプラインを開始します。Development リポジトリと Securityミラーへのタグプッシュは、(package-and-qa パイプラインを開始するオプションがないことを除いて) 通常のブランチプッシュと同じように振る舞い、基本的な文体チェックとユニットテストを実行します。

予定パイプライン

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

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

リリースミラーでは、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ミラーで“package-and-qa “パイプラインを実行するためにトリガーパイプラインを使用しています。 これらは、開発者リポジトリまたはGitLabプロジェクトのパイプラインからトリガーすることができます。

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

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 されています。

このジョブは、過去のパイプライン実行のナップサック・レポートをキャッシュから取り込み、現在のスペック実行に適した状態にします。

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

<OS_NAME> specs

実際に実行されるジョブrspec knapsack経由 .parralel キーワードを使用してカウント6まで並列化されたジョブ。

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

update-knapsack

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

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

Trigger:ce-package

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

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

Trigger:ee-package

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

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

fetch-assets

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

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

Trigger:package

このジョブはアーティファクトとして利用できるパッケージを1つビルドします。

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

Trigger:gitlab-docker

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

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

Trigger:qa-docker

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

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

Trigger:qa-test

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

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

Trigger:ha-validate

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

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

Trigger:measure-memory

この手動ジョブはGitLab Dockerイメージを使ってDockerコンテナを起動し、その中のメモリ使用量を計測し、詳細をアーティファクトとして保存します。

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

<OS_NAME>-branch

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

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

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

Docker-branch

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

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

QA-branch

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

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

Docker-branch-measure-memory

この手動ジョブはGitLab Dockerイメージを使ってDockerコンテナを起動し、その中のメモリ使用量を計測し、詳細をアーティファクトとして保存します。

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

リリース・ジョブ

<OS_NAME>

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

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

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

<OS_NAME>-staging

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

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

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

<OS_NAME>-release

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

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

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

Docker

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

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

Docker-Release

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

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

Docker-QA

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

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

QA-Tag

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

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

AWS

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

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

AWS-Ultimate

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

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

AWS-Premium

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

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

AWS-CE-Release

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

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

AWS-Ultimate-Release

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

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

AWS-Premium-Release

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

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

create_omnibus_manifest

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

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

dependency_scanning

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

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

HA-Validate-Tagged

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

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

Docker-measure-memory

このジョブはGitLab Dockerイメージを使ってDockerコンテナをスピンアップし、その中のメモリ使用量を計測し、詳細をアーティファクトとして保存します。

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

license-upload

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

ハウスキーピングのジョブ

dependency_update

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

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

dependencies_io_check

このジョブは、dependency_update ジョブからマージリクエストがなされたときに、(Trigger:ce-package ジョブに似た)QA ミラーのpackage-and-qa パイプラインを自動的に起動します。

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

valdiate_packer_changes

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

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

pages

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

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