This page contains information related to upcoming products, features, and functionality. It is important to note that the information presented is for informational purposes only. Please do not rely on this information for purchasing or planning purposes. As with all projects, the items mentioned on this page are subject to change or delay. The development, release, and timing of any products, features, or functionality remain at the sole discretion of GitLab Inc.
StatusAuthorsCoachDRIsOwning StageCreated
proposed -

このドキュメントは作業中のものであり、セルズの設計のごく初期の状態を表しています。重要な点は文書化されていませんが、将来的には追加される予定です。これはCellsの可能性のあるアーキテクチャの一つであり、どのアプローチを実装するか決める前に、代替案と比較検討するつもりです。この文書化は、このアプローチを選ばなかった理由を文書化できるよう、これを実装しないと決めた場合でも残しておきます。

Cells:Git アクセス

このドキュメントでは、Cellsのアーキテクチャが全てのGitアクセス(HTTPSとSSH経由)に与える影響について説明します。

1.定義

Gitへのアクセスはアプリケーション全体で行われます。システムによるオペレーション(Git リポジトリの読み込み)、ユーザーによるオペレーション(Web IDE、git clonegit push を使ったコマンドラインからの新規ファイルの作成)があります。Cellsアーキテクチャでは、すべてのGitリポジトリはCellにローカルであると定義されているため、リポジトリを他のCellと共有することはできません。

Cellsアーキテクチャでは、Gitオペレーションはデータを保持しているCellでしか扱えないようにします。つまり、Web インターフェースや API、GraphQL 経由のオペレーションは正しい Cell にルーティングされる必要があります。つまり、git clone またはgit push のオペレーションは、Cell のコンテキスト内でのみ実行可能です。

2.データフロー

今日GitLabがGitリポジトリに対して行うオペレーションは様々です。これは、より良い影響を表すために、それらが今日どのように振る舞うのか、データフローを説明します。

Git へのアクセスは、プロジェクトにスコープされたいくつかのエンドポイントにのみ変更が必要なようです。リポジトリには様々なタイプがあるようです:

  • プロジェクト: グループに割り当てられたもの
  • Wiki: プロジェクトに割り当てられた追加リポジトリ
  • Design: Wikiと同様、プロジェクトに割り当てられた追加リポジトリ
  • スニペット: リポジトリを保持する仮想プロジェクトを作成し、ユーザーに関連付けられます。

2.1.HTTPS での Git クローン

実行:git clone over HTTPS

sequenceDiagram User ->> Workhorse: GET /gitlab-org/gitlab.git/info/refs?service=git-upload-pack Workhorse ->> Rails: GET /gitlab-org/gitlab.git/info/refs?service=git-upload-pack Rails ->> Workhorse: 200 OK Workhorse ->> Gitaly: RPC InfoRefsUploadPack Gitaly ->> User: Response User ->> Workhorse: POST /gitlab-org/gitlab.git/git-upload-pack Workhorse ->> Gitaly: RPC PostUploadPackWithSidechannel Gitaly ->> User: Response

2.2.SSH経由のGitクローン

実行:git clone over SSH

sequenceDiagram User ->> Git SSHD: ssh git@gitlab.com Git SSHD ->> Rails: GET /api/v4/internal/authorized_keys Rails ->> Git SSHD: 200 OK (list of accepted SSH keys) Git SSHD ->> User: Accept SSH User ->> Git SSHD: git clone over SSH Git SSHD ->> Rails: POST /api/v4/internal/allowed?project=/gitlab-org/gitlab.git&service=git-upload-pack Rails ->> Git SSHD: 200 OK Git SSHD ->> Gitaly: RPC SSHUploadPackWithSidechannel Gitaly ->> User: Response

2.3.HTTPS 経由での Git プッシュ

実行:git push over HTTPS

sequenceDiagram User ->> Workhorse: GET /gitlab-org/gitlab.git/info/refs?service=git-receive-pack Workhorse ->> Rails: GET /gitlab-org/gitlab.git/info/refs?service=git-receive-pack Rails ->> Workhorse: 200 OK Workhorse ->> Gitaly: RPC PostReceivePack Gitaly ->> Rails: POST /api/v4/internal/allowed?gl_repository=project-111&service=git-receive-pack Gitaly ->> Rails: POST /api/v4/internal/pre_receive?gl_repository=project-111 Gitaly ->> Rails: POST /api/v4/internal/post_receive?gl_repository=project-111 Gitaly ->> User: Response

2.4.SSHD経由でのGitプッシュ

実行:git clone over SSH

sequenceDiagram User ->> Git SSHD: ssh git@gitlab.com Git SSHD ->> Rails: GET /api/v4/internal/authorized_keys Rails ->> Git SSHD: 200 OK (list of accepted SSH keys) Git SSHD ->> User: Accept SSH User ->> Git SSHD: git clone over SSH Git SSHD ->> Rails: POST /api/v4/internal/allowed?project=/gitlab-org/gitlab.git&service=git-receive-pack Rails ->> Git SSHD: 200 OK Git SSHD ->> Gitaly: RPC ReceivePack Gitaly ->> Rails: POST /api/v4/internal/allowed?gl_repository=project-111 Gitaly ->> Rails: POST /api/v4/internal/pre_receive?gl_repository=project-111 Gitaly ->> Rails: POST /api/v4/internal/post_receive?gl_repository=project-111 Gitaly ->> User: Response

2.5.ウェブ経由でのコミット作成

リポジトリへのAdd CHANGELOG の実行:

sequenceDiagram Web ->> Puma: POST /gitlab-org/gitlab/-/create/main Puma ->> Gitaly: RPC TreeEntry Gitaly ->> Rails: POST /api/v4/internal/allowed?gl_repository=project-111 Gitaly ->> Rails: POST /api/v4/internal/pre_receive?gl_repository=project-111 Gitaly ->> Rails: POST /api/v4/internal/post_receive?gl_repository=project-111 Gitaly ->> Puma: Response Puma ->> Web: See CHANGELOG

3.提案

Cells ステートレス・ルーターの提案では、(ルーティング不可能な)あいまいなパスはすべてルーティング可能にする必要があります。つまり、ルーティング可能なエンティティ(プロジェクト、グループ、組織)を導入するためには、少なくとも以下のパスを更新する必要があります。

変更してください:

  • /api/v4/internal/allowed =>/api/v4/internal/projects/<gl_repository>/allowed
  • /api/v4/internal/pre_receive =>/api/v4/internal/projects/<gl_repository>/pre_receive
  • /api/v4/internal/post_receive =>/api/v4/internal/projects/<gl_repository>/post_receive
  • /api/v4/internal/lfs_authenticate =>/api/v4/internal/projects/<gl_repository>/lfs_authenticate

どこに:

  • gl_repository can beproject-1111 (Gitlab::GlRepository)
  • gl_repository GitLab Shell (/gitlab-org/gitlab.git) で実行されるリポジトリへのフルパスである場合もあります。

4.評価

セルが自分のリポジトリにしかアクセスできないのであれば、Git リポジトリのサポートは複雑ではありません。スニペットをサポートするのが一つ大きな複雑さですが、これはユーザーの個人名前空間をサポートするアプローチと同じカテゴリに入るでしょう。

4.1.長所

  1. HTTPS/SSHとHooksをサポートするためのAPIはよく定義されており、簡単にルーティング可能です。

4.2.コンサ

  1. リポジトリオブジェクトの共有は、指定されたCellとGitalyノードに限定されます。
  2. 異なるGitalyノードをまたぐクロスセルフォークをサポートすることはおそらく不可能です(Discover: How this works today across different Gitaly node)。