Satu baris yang membuat kloning 100 kali lebih cepat

Tim pengoptimalan kinerja kami menemukan perubahan kecil yang berdampak besar pada kecepatan build di semua pipeline. Kami menemukan bahwa pengaturan parameter refspecpada waktu git fetchmempercepat langkah klon dengan faktor 100.



Grup Produktivitas Teknik bertanggung jawab untuk mendukung teknisi yang membangun dan menerapkan perangkat lunak di Pinterest. Tim kami mendukung berbagai layanan infrastruktur dan sering kali mengerjakan proyek besar - memigrasi semua perangkat lunak ke Bazel , menciptakan platform pengiriman berkelanjutan yang disebut Hermez . Mereka juga mendukung mono-repositori , di mana mereka mengirim beberapa ratus komit setiap hari, dan itu tidak semua tugas mereka.



Kami bekerja keras untuk membuat pengembangan dan pengiriman perangkat lunak di Pinterest menjadi cepat dan mudah. Baru-baru ini, kehidupan sekali lagi telah menunjukkan betapa besar dampak yang dapat ditimbulkan bahkan pada detail terkecil. Kami menemukan detail kecil di Git yang secara dramatis mengurangi waktu build di pipeline integrasi berkelanjutan kami. Untuk memahami bagaimana perubahan kecil ini berdampak besar, kami perlu membagikan beberapa informasi tentang monorepositories dan pipeline kami.



Monorepositori dan konveyor



Kami memiliki enam repositori utama di Pinterest: Pinboard, Optimus, Cosmos, Magnus, iOS, dan Android. Ini semua adalah mono-repositori dengan berbagai layanan khusus bahasa. Pinboard adalah tempat penyimpanan tunggal terbesar yang dikelola sejak berdirinya perusahaan. Ini memiliki lebih dari 350k komit dan berukuran 20GB saat dikloning sepenuhnya.



Menggandakan repositori mono dengan banyak kode dan riwayat yang panjang membutuhkan banyak waktu, dan dalam pipeline integrasi berkelanjutan kami, kami harus melakukannya sangat sering sepanjang hari. Untuk Pinboard saja, di hari biasa kami membuat lebih dari 60 ribu item.git pull... Kebanyakan skrip konfigurasi pipeline Jenkins (ditulis di Groovy) dimulai dengan langkah Checkout, tempat kami menggandakan repositori, yang akan dibuat dan diuji di langkah selanjutnya. Berikut tampilan tahapan Checkout pada umumnya:







Jika Anda menggunakan Git CLI secara langsung:







``

Bahkan dengan kloning yang tidak lengkap / dangkal, tanpa mengekstrak tag apa pun dan hanya untuk 50 komit terakhir, operasi masih tidak berjalan secepat mungkin. Ini karena kami tidak menyetel parameter refspec . Perhatikan bahwa tidak adanya parameter ini berarti perintah untuk mengambil semua refspecs: + refs / heads / *: refs / remotes / origin / * . Dalam kasus Pinboard, lebih dari 2.500 cabang diproses.



Dengan hanya menambahkan opsi refspec dan menentukan tautan mana yang kami minati (dalam kasus kami, hanya dari master), Anda dapat membatasi cakupan pemrosesan ke cabang yang diinginkan dan menghemat banyak waktu. Berikut tampilannya di pipeline kami:







Perubahan satu baris sederhana mengurangi waktu kloning hingga 100x dan, sebagai hasilnya, waktu build berkurang secara signifikan. Waktu kloning untuk penyimpanan Pinboard terbesar telah dikurangi dari 40 menit menjadi 30 detik. Hal ini menunjukkan bahwa terkadang upaya sekecil apa pun membuat perbedaan besar.



All Articles