更新日:2026年1月15日
17分で読めます
GitLab.comのデプロイパイプラインを技術的に深掘りします。段階的ロールアウト、Canary戦略、データベースマイグレーション、マルチバージョン互換性について解説します。

毎日、GitLabは世界最大のGitLabインスタンスであるGitLab.comにコード変更を最大12回、ダウンタイムなしでデプロイしています。これらのデプロイ管理には、GitLab独自のCI/CDプラットフォームを使用しており、世界中の数百万人のデベロッパーに影響を与えています。このデプロイ頻度は、私たちの主要な品質基準とストレステストとして機能しています。また、お客様は数週間や数か月待つことなく、開発から数時間以内で新機能にアクセスできるようになります。組織がDevOpsワークフローにGitLabを利用する場合、私たち自身のインフラストラクチャで大規模に実証されたプラットフォームを使用していることになります。この記事では、このデプロイの複雑さを処理するために、GitLab CI/CDのコア機能を使用して自動化されたデプロイパイプラインを構築した方法をご紹介します。
当社の実践から見えるもの:私たちのデプロイ頻度は単なるエンジニアリング指標ではなく、ビジネス上の必須要件です。迅速なデプロイサイクルにより、お客様からのフィードバックに数時間以内に対応し、セキュリティパッチを即座に提供し、新機能を本番環境で検証してからスケールすることができます。
お客様が得られる価値:GitLab.comへのすべてのデプロイは、ユーザーに推奨するデプロイプラクティスを検証しています。GitLabのデプロイ機能を使用する場合、数百万のgit操作、CI/CDパイプライン、ユーザーインタラクションを日々処理する実証済みのアプローチを使用していることになります。以下のメリットがあります:
デプロイパイプラインは、複数のステージを経て構造化された進行に従います。各ステージは、コード提案から本番環境へのデプロイまでの過程におけるチェックポイントとして機能します。
graph TD
A[コード提案] --> B[マージリクエスト作成]
B --> C[パイプライントリガー]
C --> D[ビルド & テスト]
D --> E{スペック/統合/QAテスト合格?}
E -->|いいえ| F[フィードバックループ]
F --> B
E -->|はい| G[デフォルトブランチへマージ]
G -->|定期的| H[Auto-Deployブランチ]
subgraph "デプロイパイプライン"
H --> I[パッケージ作成]
I --> K[Canary環境]
K --> L[QA検証]
L --> M[main環境]
end
デプロイアプローチでは、GitLabのネイティブCI/CD機能を使用して、ハイブリッドインフラストラクチャ全体で複雑なデプロイを調整します。 その実装方法をご紹介します。
GitLabのビルドは、それ自体が複雑なトピックであるため、ここでは概要レベルで説明します。
OmnibusパッケージとCloud Native GitLab(CNG)イメージの両方をビルドします。OmnibusパッケージはGitalyフリート(Gitストレージレイヤー)にデプロイされ、CNGイメージは他のすべてのコンポーネントをコンテナ化されたワークロードとして実行します。PostgresやRedisなどの他のステートフルサービスは非常に大規模になったため、専任チームが個別に管理しています。GitLab.comの場合、これらのシステムはAuto-Deploy手順中にはデプロイされません。
gitlab-org/gitlabを定期的に確認し、デフォルトブランチで成功した(「グリーン」)パイプラインを持つ最新のコミットを検索するスケジュールされたパイプラインがあります。グリーンパイプラインは、GitLabのすべてのコンポーネントが包括的なテスト群に成功したことを示します。次に、そのコミットからauto-deployブランチを作成します。
これにより一連のイベントがトリガーされます。主に、このパッケージとモノリスの一部であるすべてのコンポーネントをビルドする必要があります。 別のスケジュールされたパイプラインが、最新のビルドされたパッケージを選択し、デプロイパイプラインを開始します。手順としては、このようにシンプルに見えます:
graph LR
A[ブランチ作成] --> B[ビルド]
B --> C[ビルドされたパッケージを選択]
C --> D[デプロイパイプラインを開始]
ビルドには時間がかかり、さまざまな状況によりデプロイが変動する可能性があるため、最新のビルドをデプロイするように選択しています。技術的には、実際にデプロイされるよりも多くのGitLabのバージョンを.com用にビルドしています。これにより、常に準備が整ったパッケージが用意され、.comに対して完全に継続的にデリバリーされる製品に最も近い状態を実現できます。
品質保証(QA)は単なる後付けではなく、開発からデプロイまでのすべてのレイヤーに組み込まれています。QAプロセスでは、ユニットテスト、統合テスト、GitLabの機能との実際のユーザーインタラクションをシミュレートするエンドツーエンドテストを含む自動化されたテスト群を活用しています。しかし、デプロイパイプラインにとってさらに重要なのは、QAプロセスが環境ベースの検証を通じてCanary戦略と密接に連携していることです。
検証アプローチの一環として、GitLabのネイティブCanaryデプロイを活用し、完全な本番環境へのデプロイ前に、限定されたトラフィックで変更を制御しながら検証できるようにしています。すべてのトラフィックの約5%をCanaryステージに送信しています。このアプローチはデータベースマイグレーションの複雑性を高めますが、Canaryデプロイを成功させることで、信頼性の高い製品をシームレスにデプロイすることができます。
GitLabで使用するCanaryデプロイ機能は、本番環境における最も複雑なデプロイメントシナリオの管理を通じて改良されたものです。アプリケーション用にCanaryデプロイを実装する場合、大規模環境で実証済みのパターンを使用していることになります。
当社のデプロイプロセスは、段階的ロールアウト戦略に従います:
graph TD
C[ステージング環境 Canaryデプロイ]
C --> D[QA スモーク main Testステージ]
C --> E[QA スモーク Canary Testステージ]
D --> F
E --> F{テスト合格?}
F -->|はい| G[本番環境 Canary デプロイ]
G --> S[QA スモーク main Testステージ]
G --> T[QA スモーク Canary Testステージ]
F -->|いいえ| H[イシュー作成]
H --> K[修正&バックポート]
K --> C
S --> M[Canary トラフィック監視]
T --> M[Canary トラフィック監視ベイク期間]
M --> U[本番環境安全性チェック]
U --> N[ステージング環境 main]
N --> V[本番環境 main]
QA検証は、この段階的デプロイプロセス全体の複数のチェックポイントで行われます。各Canaryデプロイ後、そしてデプロイ後のマイグレーション実施後に再度検証を行います。この多層的なアプローチにより、デプロイ戦略の各フェーズに独自のセーフティーネットが確保されます。GitLabの包括的なテスト手法については、ハンドブックで詳しく説明しています。
デプロイパイプライン全体で対処している課題についてご紹介します。
GitLab.comは、大規模な実環境でのデプロイの複雑性を体現しています。既知の最大規模のGitLabインスタンスとして、デプロイには公式のGitLab HelmチャートとLinuxパッケージを使用しており、これらはお客様が使用するものと同じアーティファクトです。GitLab.comアーキテクチャについては、ハンドブックで詳しく説明しています。このハイブリッドアプローチにより、デプロイパイプラインは同一のデプロイサイクルでコンテナ化されたサービスと従来のLinuxサービスの両方をインテリジェントに処理する必要があります。
大規模なドッグフーディング: ゼロダウンタイムのアップグレード用にドキュメント化したものと同じ手順を使用してデプロイしています。もし私たちにとってスムーズに機能しないものがあれば、お客様にも推奨しません。この自己規律により、デプロイツールの継続的な改善が促進されています。
すべての環境とステージのアップグレードで、以下のステージが実行されます:
graph LR
a[Prep] --> c[通常 Migrations - Canaryステージのみ]
a --> f[Assets - Canaryステージのみ]
c --> d[Gitaly]
d --> k8s
subgraph subGraph0["VMワークロード"]
d["Gitaly"]
end
subgraph subGraph1["Kubernetesワークロード"]
k8s["k8s"]
end
subgraph fleet["フリート"]
subGraph0
subGraph1
end
ステージの詳細:
gitとバンドルされているため、特殊です。したがって、このサービスがアトミックアップグレードを実行可能かを確認する必要があります。Gitalyのラッパーを活用し、新しいバージョンのGitalyをインストールし、ライブラリtableflipを使用しすることで、実行中のGitalyをクリーンにローテーションし、各インスタンスでこのサービスの高可用性を確保しています。プロセスを読むと、データベーススキーマがmainステージが認識しているコードより先行している期間があることに気付くでしょう。これは、Canaryステージが既に新しいコードをデプロイし、通常のデータベースマイグレーションを実行しているが、mainステージはまだこれらの新しいデータベース変更を認識していない以前のバージョンのコードを実行しているために発生します。
実際の例: マージリクエストに新しいmerge_readinessフィールドを追加するとします。デプロイ中、一部のサーバーはこのフィールドを期待するコードを実行していますが、他のサーバーはまだその存在を認識していません。これを適切に処理しないと、数百万人のユーザーが使用するGitLab.comが壊れてしまいます。適切に処理すれば、誰も何が起こったか気付きません。
これは他のほとんどのサービスでも発生します。たとえば、クライアントが複数のリクエストを送信する場合、そのうちの1つがCanaryステージに到達する可能性があります。他のリクエストはmainステージに向けられる可能性があります。これはデプロイとそれほど変わりません。サービスを実行している数千のPodを通過するのにかなりの時間がかかるためです。
いくつかの例外を除いて、サービスの大部分は、Canaryでそのコンポーネントのわずかに新しいバージョンを一定期間実行します。ある意味では、これらのシナリオはすべて一時的な状態です。しかし、ライブの本番環境では数時間または数日間持続することがよくあります。したがって、永続的な状態と同じように注意を払って扱う必要があります。どのデプロイ中も、複数のバージョンのGitLabが同時に実行されており、それらすべてが適切に連携する必要があります。
データベースマイグレーションは、Canaryデプロイモデルにおいて独特の課題を提示します。新機能をサポートするためのスキーマ変更が必要な一方で、問題が発生した場合のロールバック機能を維持する必要があります。当社のソリューションでは、懸念を慎重に分離しています:
データベース変更は、正確さと広範な検証手順により処理されます:
graph LR
A[通常マイグレーション] --> B[Canaryステージデプロイ]
B --> C[mainステージデプロイ]
C --> D[デプロイ後マイグレーション]
GitLabのデプロイには多くのコンポーネントが関与します。GitLabの更新はアトミックではないため、多くのコンポーネントが後方互換性を持つ必要があります。
デプロイ後マイグレーションには、簡単にロールバックできない変更(データ変換、カラムの削除、または古いコードバージョンを壊す構造的変更など)が含まれることがよくあります。複数の成功したデプロイを通じて信頼を得た_後_にそれらを実行することで、次を保証します:
このアプローチは最適なバランスを提供します。Canaryリリースによる迅速な機能デプロイを可能にしながら、デプロイの安定性に高い信頼を得るまでロールバック機能を維持します。
拡張-移行-縮小パターン: データベース、フロントエンド、アプリケーション互換性の変更は、慎重に調整された3段階のアプローチに従います。
実際の例: マージリクエストに新しいmerge_readinessカラムを追加する場合:
3 縮小: 複数の成功したデプロイの後、デプロイ後マイグレーションで古いカラムを削除
すべてのデータベース操作、アプリケーションコード、フロントエンドコードなどは、エンジニアリングが遵守する必要がある一連のガイドラインの対象となります。これらはマルチバージョン互換性ドキュメントで確認できます。
デプロイインフラストラクチャは測定可能なメリットを提供します:
GitLabにとって
お客様にとって
GitLabのデプロイパイプラインは、デプロイ速度と運用の信頼性のバランスをとる洗練されたシステムを表しています。段階的デプロイモデル、包括的なテスト統合、堅牢なロールバック機能により、大規模な信頼性の高いソフトウェア配信の基盤を提供します。
同様のシステムを実装するエンジニアリングチームにとって、次のような重要な考慮事項があります:
GitLabのアーキテクチャは、最新のCI/CDシステムが競争力のあるソフトウェア開発に必要な速度を維持しながら、大規模デプロイの複雑性を管理する方法を実証しています。
この記事では、特にGitLab OmnibusパッケージとHelmチャートの一部であるサービス(基本的にコアGitLabモノリスとその緊密に統合されたコンポーネント)のデプロイパイプラインについて具体的に説明しています。
ただし、GitLabのインフラストラクチャの範囲は、ここで説明されている内容を超えて広がっています。他のサービス、特にAIサービスや概念実証段階にあるサービスは、Runwayと呼ばれる内部プラットフォームを使用した異なるデプロイアプローチに従っています。
これらの他のサービスで作業している場合、または興味がある場合は、Runwayドキュメントで詳細情報を確認できます。
GitLab Dedicatedなどの他のサービスは、お客様がGitLab Environment Toolkitを使用して、お客様自身で実行できることを期待する内容により沿った形でデプロイされます。詳細については、GitLab Environment Toolkitプロジェクトをご覧ください。
この記事で概説されているデプロイ戦略、アーキテクチャに関する考慮事項、パイプラインの複雑性は、コアプラットフォームで使用している実証済みのアプローチを表していますが、大規模なエンジニアリング組織と同様に、さまざまなサービスタイプと成熟度レベルに合わせた複数のデプロイ戦略があります。
Auto-Deployと手順に関する詳細なドキュメントは、以下のリンクで確認できます:
このブログ記事を楽しんでいただけましたか?ご質問やフィードバックがあればお知らせください。GitLabコミュニティフォーラムで新しいトピックを作成してあなたの声を届けましょう。
フィードバックを共有する