1行の変更でクローン時間が99%減少した方法%

(Pinterest Engineering)(2020年10月23日)

UrvashiReddy |ソフトウェアエンジニア、エンジニアリング生産性チーム
Adam Berry |技術リーダー、エンジニアリング生産性チーム
Rui Li |ソフトウェアエンジニア、エンジニアリング生産性チーム

Pinterestのエンジニアリング生産性チームは、パイプライン全体のビルド時間の短縮に大きな影響を与える小さな変更に遭遇しました。 git fetch中にrefspecオプションを設定すると、クローン作成の手順が99%削減されることがわかりました。

Pinterestのエンジニアリング生産性チームは、会社でソフトウェアを構築およびデプロイするエンジニアをサポートする責任があります。私たちのチームは多くのインフラストラクチャサービスを維持しており、多くの場合、Pinterestのすべてのソフトウェアを(Bazelに)移行し、 Hermez と呼ばれる継続的デリバリープラットフォームを作成するなど、大規模な取り組みに取り組んでいます。いくつか例を挙げると、1日に数百回コミットされる()monoreposを維持します。

私たちのより大きな努力はすべて、Pinterestでのソフトウェア開発と配信を高速化するという目標に向かって前進するように設計されています。そして痛みのない経験。最近、細部がその目標に大きな影響を与える可能性があることを思い出しました。継続的インテグレーションパイプラインのビルド時間を大幅に短縮する、見落とされていたGitオプションを発見しました。この小さな変更がどのように大きな影響を与えたかを理解するには、モノリポジトリとパイプラインに関する情報を少し共有する必要があります。

モノレポとパイプライン

Pinterestには、Pinboard、Optimus、Cosmos、Magnus、iOS、Androidの6つの主要なリポジトリがあります。それぞれがモノレポであり、言語固有のサービスの大規模なコレクションを収容しています。ピンボードは会社と同じくらい古く、最大のモノレポです。 Pinboardには350Kを超えるコミットがあり、完全に複製するとサイズは20GBになります。

コードと履歴が多いモノリポジトリの複製には時間がかかり、継続的インテグレーションでは1日を通して頻繁に行う必要があります。パイプライン。 Pinboardだけでも、営業日に60K以上のgitプルを実行します。 Jenkinsパイプライン構成スクリプト(Groovyで記述)のほとんどは、「チェックアウト」ステージから始まります。このステージでは、後のステージで構築およびテストするリポジトリのクローンを作成します。一般的な「チェックアウト」ステージは次のようになります。

Git CLIを直接使用している場合は、次のように変換されます。

“ `

Gitに浅いクローンを実行し、タグをフェッチせず、最後の50コミットをフェッチするように指示していますが、まだこの操作をできるだけ速く実行していません。これは、 refspec オプションを設定していないためです。パイプライン構成スクリプトで設定しないことで、すべてのrefspecをフェッチするようにGitに指示していることに注意してください: + refs / heads / *:refs / remotes / origin / *。 Pinboardの場合、その操作は2,500を超えるブランチをフェッチします。

refspecオプションを追加し、関心のある参照を指定するだけです(マスター、この場合)、参照を関心のあるブランチに制限して、多くの時間を節約できます。パイプラインコードでは次のようになります。

この単純な1行の変更により、クローン時間が99%短縮され、その結果、ビルド時間が大幅に短縮されました。最大のリポジトリのクローンを作成すると、Pinboardは40分から30秒になりました。小さな努力が大きな影響を与えることもあることを示しています。

学習

ほとんどの開発者生産性チームと同様に、私たちは日々の経験に大きな影響を与える大規模なサービスに取り組んでいます。ただし、大きな違いを生むのは1行の修正である場合があります。私たちの仕事はそれを理解することです。

開発者の生産性を向上させることに情熱を持っているなら、私たちのチームに参加してください!エンジニアリング生産性チームのエンジニアリングの役割を採用しています。

Pinterestでエンジニアリングの詳細については、 を確認し、 Pinterest Labs サイト。オープンオポチュニティを表示して応募するには、 採用情報 ページにアクセスしてください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です