2025/05/09 22:44 Using Git-upload-pack for a simpler CI integration

やあ、ロボ子。Screenshotbotがshallow cloneをサポートしたらしいのじゃ。

shallow cloneですか。それは便利になりますね、博士。以前はリポジトリへの読み取りアクセスが必要だったんですよね?

そうなんじゃ。顧客のGitHubリポジトリへの読み取りアクセス権を持つことで、製品利用への信頼性を高めていたみたいじゃな。セキュリティレビューも容易になるからの。

なるほど。でも、これからはリポジトリ全体ではなく、「グラフ」へのアクセスだけで済むようになるんですね。「利用可能なビルドの最後のコミットの特定」や「最適なマージベースの発見」に必要な情報だけを取得できる、と。

その通りじゃ! 以前は、CI実行時に`git log --all --pretty="%H %P" --max-count 100`みたいなコマンドで最新の1000コミットを収集して、サーバーにアップロードしていたのじゃ。

それだと、CIでのshallow cloneのサポートが難しかったり、大規模なモノレポでは同じグラフを何度も生成・マージする可能性があったりしたんですね。

そうそう。そこで、`git-upload-pack`の登場じゃ!

`git-upload-pack`ですか。クライアントがリモートサーバーにSSH接続してリポジトリをクローンやプルを行う際に実行されるものですね。

その通り! プロトコルとしては、まずサーバーがrefs(例:`refs/heads/main`)と関連するコミットSHA、サポートする機能を通知するのじゃ。

そして、クライアントが要求するrefsと、既に持っているオブジェクトをサーバーに通知するんですね。その後、サーバーが必要なオブジェクトをpackfile形式で送信する、と。

そういうことじゃ。Screenshotbotへの接続は、CIジョブでCLIツールがリモートの`git-upload-pack`への接続を開くことで実現するのじゃ。

Gitサーバーがrefsとコミットを通知し、CLIツールがScreenshotbotサーバーに必要なrefsとコミットを確認。そして、必要なコミットと情報をGitサーバーに伝達するんですね。

そうじゃ! Gitサーバーがコミット情報を効率的に送信し、Screenshotbotサーバーに送信可能な形式に変換するのじゃ。

なるほど。でも、注意点もあるんですね。プロトコルとPackfileの形式は複雑で、一部のGitサーバー(Phabricator)はPackfile送信後にEOFを送信しない場合がある、と。

そうなんじゃ。Azure DevOpsは`multi_ack`モードを要求するけど、Screenshotbotは未対応だったりするのじゃ。

それでも、shallow cloneが利用可能になったのは大きな進歩ですね!

まさにそうじゃ! これで、Screenshotbotユーザーはより手軽に、そして安全に利用できるようになったのじゃ!

素晴らしいですね、博士!

ところでロボ子、shallow cloneって、浅いクローンって意味だけど、ロボ子の知識もshallowだったりして…?

博士! それはセクハラ発言です!訴えます!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。