refspecを時間に設定git fetchすると、クローンステップが100倍高速化されることがわかりました。
Engineering Productivityグループは、Pinterestでソフトウェアを構築および展開するエンジニアをサポートする責任があります。私たちのチームは、インフラストラクチャサービスの数をサポートし、多くの場合、大規模なプロジェクトに取り組んでいます-にすべてのソフトウェアを移行Bazel、と呼ばれる連続配信プラットフォーム作成Hermezを。また、モノリポジトリもサポートしており、毎日数百のコミットを送信しますが、それだけではありません。
私たちは、Pinterestでのソフトウェアの開発と配信を迅速かつ簡単にするために懸命に取り組んでいます。最近、人生は、細部にさえ大きな影響を与えることができることをもう一度示しました。Gitには、継続的な統合パイプラインのビルド時間を劇的に短縮する小さな詳細が見つかりました。この小さな変更がどのように大きな影響を与えたかを理解するには、モノリポジトリとパイプラインに関するいくつかの情報を共有する必要があります。
モノリポジトリとコンベヤ
Pinterestには、Pinboard、Optimus、Cosmos、Magnus、iOS、Androidの6つの主要なリポジトリがあります。これらはすべて、幅広い言語固有のサービスを備えたモノリポジトリです。 Pinboardは、会社の設立以来維持されている最大の単一リポジトリです。 350kを超えるコミットがあり、完全にクローン化された場合のサイズは20GBです。
大量のコードと長い履歴を持つモノリポジトリのクローン作成には多くの時間がかかり、継続的な統合パイプラインでは、日中に頻繁にそれを実行する必要があります。ピンボードだけでも、平日は6万点以上の商品を作っています。
git pull..。ほとんどのJenkinsパイプライン構成スクリプト(Groovyで記述)は、チェックアウトステップから始まります。ここで、リポジトリのクローンを作成します。リポジトリは、後のステップで構築およびテストされます。これは典型的なチェックアウト段階のように見え
ます:Git CLIを直接使用する場合:
「
タグを抽出せず、最後の50コミットのみの不完全/浅いクローン作成でも、操作はそれまでの速度ではありませんでした。これは、refspecパラメーターを設定しなかったためです。このパラメーターがないということは、すべてのrefspecを取得するコマンドを意味することに注意してください:+ refs / heads / *:refs / remotes / origin / *。ピンボードの場合、2,500を超えるブランチが処理されます。
refspecオプションを追加し、関心のあるリンク(この場合はマスターからのみ)を指定するだけで、処理の範囲を目的のブランチに制限し、時間を大幅に節約できます。パイプラインの外観は次のとおりです
。1行の変更を行うだけで、クローン作成時間が100分の1に短縮され、その結果、ビルド時間が大幅に短縮されました。最大のPinboardリポジトリのクローニング時間が40分から30秒に短縮されました。これは、わずかな努力でも大きな違いを生むことがあることを示しています。