Integrasi berkelanjutan: frekuensi mana?

20

Saya selalu meluncurkan build setelah setiap komit, tetapi pada proyek baru ini, arsitek hanya meminta saya untuk mengubah frekuensi menjadi "satu build setiap 15 menit", dan saya tidak bisa mengerti mengapa itu akan menjadi alasan yang bagus vs " membangun pada setiap komit ".

Pertama, beberapa detail:

  • Proyek Objective-C (iOS 5)
  • 10 pengembang
  • setiap build sebenarnya membutuhkan ~ 1 menit, dan termasuk pengujian build dan unit.
  • server integrasi adalah Mac Mini, jadi daya komputasi tidak terlalu menjadi masalah di sini
    • kami menggunakan Jenkins dengan plugin XCode

Argumen saya adalah bahwa jika Anda membangun di setiap komit, Anda dapat melihat sekarang apa yang salah, dan memperbaiki kesalahan Anda secara langsung, tanpa terlalu sering mengganggu para dev lainnya. Ditambah tester kami kurang terganggu oleh kesalahan UT dengan cara ini. Argumennya adalah bahwa devs akan dibanjiri oleh "build error" mail (yang tidak sepenuhnya benar, karena Jenkins dapat dikonfigurasi untuk mengirim email hanya untuk build yang rusak pertama), dan metrik tidak dapat dilakukan dengan benar jika frekuensinya build terlalu tinggi.

Jadi, apa pendapat Anda tentang ini?

Valentin Rocher
sumber
Yakin waktu build Anda akan ~ 1 menit dalam 2 atau 3 bulan, dengan 10 dev terus menambahkan kode termasuk unit test untuk proyek Anda?
Doc Brown
Akan menarik untuk mengeksplorasi alasan arsitek untuk meminta perubahan; poin Anda baik, tetapi apakah mereka mengatasi masalah yang sebenarnya?

Jawaban:

32

Gagal cepat adalah prinsip yang baik - semakin cepat Anda tahu build rusak, semakin cepat komit yang melanggar dapat diidentifikasi dan build diperbaiki.

Membangun setiap komitmen adalah hal yang benar untuk dilakukan.

Membangun setiap 15 menit bisa sia-sia jika proyek memiliki volume komitmen yang tinggi dalam jangka waktu seperti itu - melacak komit yang buruk akan memakan waktu lebih lama dan mungkin sulit untuk ditentukan (satu mungkin juga berada dalam situasi di mana banyak komit memiliki hal yang berbeda yang istirahat build). Ada juga kemungkinan bahwa di waktu tenang (waktu malam?) Anda akhirnya membangun kembali meskipun tidak ada perubahan yang dilakukan.

Jika build sering rusak sehingga menjadi masalah, jawablah untuk mendidik kembali tim tentang pentingnya tidak melanggar build dan dalam teknik yang memastikan hal ini tidak terjadi (sering mengambil, checkin dance, menyusun dan menjalankan unit test secara lokal dll ...).

Oded
sumber
16
+1. Jawaban untuk pesan "build gagal" yang sering menjengkelkan adalah untuk tidak merusak build secara sering.
suszterpatt
3
Di saat sunyi - pilihan ketiga Jenkins, "Poll SCM", dimaksudkan hanya untuk itu. Itu hanya akan memperbarui / menjalankan tes ketika perubahan ditemukan di repositori. Sebagai contoh, kami memiliki satu pekerjaan yang diatur untuk dijalankan setiap 5 menit jika ada perubahan (unit test), dan yang kedua ditetapkan untuk berjalan setiap 3 jam jika ada perubahan (tes integrasi). Keduanya sunyi di malam / akhir pekan karena tidak ada yang melakukan apa pun.
Izkata
5

Tidak ada gunanya melakukan build setiap 15 menit jika tidak ada yang berubah. Tetapi sama-sama tidak ada downside, afaik, jenkins hanya akan mengirim email tentang gagal dan kemudian berhasil dan tidak semuanya di antaranya (misalnya 10 gagal).

Kami melakukannya pada setiap komitmen. Namun kami melakukan polling repositori setiap lima belas menit dan memeriksa perubahan, mungkin itulah yang dirujuk oleh rekan kerja Anda.

Anda berharap 10 dev Anda melakukan lebih dari sekali setiap lima belas menit? Kedengarannya seperti estimasi yang tinggi. 10 dev berarti bahwa setelah setiap 150 menit orang yang sama berkomitmen lagi, jadi 2,5 jam. Jadi dalam hari rata-rata Anda setiap dev melakukan 3 kali. Secara pribadi saya melakukan satu komit ~ 2 hari ... kadang-kadang lebih kadang kurang.

NimChimpsky
sumber
1
Sebenarnya, komit cukup cepat di sekitar sini, jadi ini sangat mungkin, tapi ya, saya mengerti maksud Anda.
Valentin Rocher
3
@NimChimpsky: Anda melakukan satu komit setiap 3 hari? Jika itu benar, saya sarankan Anda serius mempertimbangkan kembali strategi komit Anda. Setiap kali Anda akan mengatur ulang sesuatu ke keadaan sebelumnya, Anda akan kehilangan hingga 3 hari kerja! Bagaimana Anda menggambarkan perubahan 3 hari penuh dalam beberapa kata di log perubahan Anda? Itu terdengar sangat absurd. Secara pribadi, saya melakukan komit setiap kali saya menambahkan irisan fitur kerja ke program saya, biasanya beberapa kali sehari.
Doc Brown
2
@DocBrown jauh dari tidak masuk akal. Saya mungkin berkomitmen untuk berbagai proyek dan repositori yang berbeda tiga kali dalam satu menit. Di sisi lain saya mungkin tidak menulis kode sama sekali selama seminggu penuh. Saya sarankan Anda serius mempertimbangkan strategi komentar Anda.
NimChimpsky
1
@NumChimpsky: Saya berasumsi Anda berbicara tentang situasi yang sebanding dengan yang dijelaskan oleh OP. Kita berbicara tentang 10 devs yang mengerjakan proyek yang sama. Jika median waktu antara komit per dev adalah 3 hari, maka ada yang sangat, sangat salah dalam proyek itu.
Doc Brown
2
@DocBrown wtf? Anda tidak tahu apa yang Anda bicarakan ... Saya kira Anda tidak bekerja pada banyak proyek secara bersamaan.
NimChimpsky
3

Ini akan membanjiri pengembang dengan email lebih banyak jika setiap 15 menit saja. Itu karena tidak akan tahu pasti siapa yang melanggar pembangunan dan dengan demikian mengirim lebih banyak orang.

Sedangkan untuk metrik, jika itu benar-benar masalah — yang tidak bisa saya katakan karena saya tidak tahu apa metrik yang menurut mereka ada masalah dengan—, Anda selalu dapat membuat pekerjaan lain untuk mengumpulkan metrik.

Jan Hudec
sumber
2

Mungkin persyaratannya harus "membangun paling banyak sekali per 15 menit". Ini bisa masuk akal untuk proyek dengan aktivitas komit yang sangat sering (yaitu beberapa komit dalam beberapa menit) dan mungkin waktu pembangunan yang lama. Tentu saja itu tergantung juga pada bagaimana membangun digunakan. Untuk penguji mungkin agak membingungkan untuk mendapatkan beberapa build dalam waktu 15 menit ...

Tetapi saya setuju bahwa tidak masuk akal untuk membangun jika tidak ada yang berubah.

MartinStettner
sumber
2

Beberapa pengembang ingin diizinkan melakukan komitmen dengan cara di mana file milik satu perubahan fungsional tidak dilakukan dalam satu prosedur atom. Mereka memerlukan dua atau tiga menit untuk melakukan "komitmen logis", yang terdiri dari beberapa "komitmen fisik". Ini biasanya terjadi ketika devs Anda langsung berkomitmen ke repositori pusat, tidak menggunakan DVCS.

Untuk kasus ini, mungkin ide yang baik untuk membiarkan server CI Anda menunggu beberapa saat setelah komit terakhir sebelum memulai membangun baru. Tetapi 15 menit tampaknya merupakan angka yang sangat tinggi, 5 menit atau kurang seharusnya sudah cukup.

Atau, lebih baik (!), Cobalah untuk membimbing devs Anda untuk bekerja hanya dalam porsi kecil, hanya satu hal pada satu waktu, membuatnya lebih mudah untuk melakukan hanya komitmen fisik "fungsional lengkap". Kemudian build setelah setiap commit akan bekerja tanpa terlihat.

Doc Brown
sumber
0

Bahkan jika Anda memiliki Jenkins yang didirikan untuk membangun di atas kontrol sumber yang dikomit ke proyek atau salah satu dari dependensinya, ini tidak mencegah pengembang dari penggelaran ke repositori artefak tanpa terlebih dahulu berkomitmen untuk kontrol sumber. Jika mereka menggunakan perubahan API yang tidak terkoordinasi atau bug dalam ketergantungan ke repositori artefak, ini dapat merusak bangunan Anda tanpa memicu pekerjaan Jenkins. Saya pribadi ingin tahu tentang ASAP ini.

Idealnya Anda akan membangun untuk setiap komit dan juga pada jadwal untuk memeriksa situasi seperti yang baru saja saya jelaskan. Secara konseptual ini berarti Anda membangun setidaknya setiap 15 menit sekali .

Jika Anda memiliki pekerjaan Jenkins yang diatur untuk dijalankan pada penyebaran artefak dependensi (dan jika Anda melakukannya ... Bravo), Anda dapat memeriksa kap bangunan yang dijadwalkan jika unit test Anda solid (artinya mereka tidak menguji dependensi) dan Anda tes integrasi / fungsional bukan bagian dari pekerjaan Jenkins.

Sejauh masalah "banjir dengan email", saya katakan dibanjiri dengan email pada bangunan yang rusak adalah hal yang baik. Pastikan Anda memaksa pengembang untuk merespons email dengan deskripsi dan Anda akan melihat bangunan Anda yang rusak turun, percayalah.

smp7d
sumber
0

Kamu bilang kamu tidak bisa mengerti alasan mereka, jadi kamu harus bertanya pada mereka. Jangan hanya menebak apa yang mereka inginkan dan mencoba mengimplementasikannya, dan tentu saja tidak hanya mengimplementasikan apa yang mereka minta tanpa memahami mengapa mereka memintanya.

Yang mengatakan, untuk menjawab pertanyaan umum, itu tergantung pada filosofi pengembangan yang Anda gunakan. Jika setiap komit diharapkan berfungsi, maka setiap komit harus diuji. Jika Anda menggunakan DVCS dengan filosofi bahwa setiap dorongan harus bekerja, maka uji setiap dorongan.

Secara umum, lebih baik memberi tahu orang sesuatu yang tidak mereka ketahui, kemudian mengulangi apa yang mereka tahu. Misalnya, jika mereka ingin mengurangi jumlah email berlebihan yang mereka dapatkan, atur pengaturan email, bukan frekuensi build.

Paul Biggar
sumber