Menjaga Sistem Integrasi Berkelanjutan Anda

22

Salah satu peran saya dalam tim saya adalah orang yang membangun . Saya bertanggung jawab untuk memelihara / memperbarui skrip bangunan kami dan memastikan kami membangun 'lancar' di server integrasi berkelanjutan. Saya biasanya tidak keberatan dengan pekerjaan ini, meskipun sering terasa seperti saya terus mengasuh server CI.

Pekerjaan ini kadang-kadang menyebalkan karena jika build rusak saya harus membatalkan cerita yang saya kerjakan dan menyelidiki kegagalan build. Kegagalan membangun terjadi setiap hari di tim kami. Terkadang pengembang tidak membangun secara lokal sebelum melakukan sehingga pengujian gagal pada server CI. Dalam situasi ini saya ingin cepat-cepat sampai ke orang yang memiliki 'komitmen buruk' sehingga bangunannya tidak rusak terlalu lama. Kadang-kadang (lebih jarang) kondisi aneh ada di server CI yang perlu di-debug.

Saya tahu bahwa banyak tim matang menggunakan Integrasi Berkelanjutan tetapi tidak ada banyak materi di luar sana tentang praktik yang baik.

Apakah masalah saya menunjukkan bahwa integrasi berkesinambungan kami tidak terlalu matang atau apakah ini hanya bagian dari pekerjaan?

Apa saja praktik baik yang harus diikuti? Apa karakteristik integrasi berkesinambungan yang matang ?

Memperbarui

Alih-alih menjawab beberapa komentar, saya malah akan melakukan pembaruan. Kami memiliki satu perintah sederhana yang melakukan persis apa yang akan dilakukan server build saat membangun aplikasi. Ini akan mengkompilasi, menjalankan semua unit / integrasi dan beberapa tes berbasis UI cepat.

Membaca jawaban semua orang, rasanya kita mungkin memiliki dua masalah besar.

  1. Server CI tidak mengeluh cukup keras ketika membangun gagal.
  2. Pengembang tidak merasa seperti tanggung jawab setiap orang untuk memastikan komitmen mereka berhasil.

Yang membuat segalanya lebih sulit di tim saya adalah kami memiliki tim besar (10+ pengembang) DAN kami memiliki beberapa anggota tim di luar negeri yang berkomitmen ketika kami bahkan tidak sedang bekerja. Karena timnya besar dan kami menetapkan bahwa sering, komit kecil lebih disukai, kami terkadang memiliki banyak aktivitas dalam sehari.

c_maker
sumber
16
Wow, saya pernah mendengar pengembang tidak menguji kode pada mesin lokal mereka sebelum melakukan, tetapi tidak membangunnya ? Itu bisa dibilang kriminal .
Aaronaught
2
@Alison: Mungkin begitu, meskipun "melanggar build" bagi saya berarti melakukan kode yang tidak membangun . Tes yang gagal adalah masalah yang jauh lebih tidak kritis; biasanya tidak akan mencegah pengembang lain menyelesaikan pekerjaan mereka.
Aaronaught
1
@Aronaught secara pribadi saya akan melihatnya sebagai kebalikan - kode yang mengkompilasi mungkin masih gagal pengujian otomatis dan karena itu "hancurkan build".
Armand
2
Mengutip soundbite dari Martin Fowler: jika sakit, lakukan lebih sering.
rwong
1
Seseorang (jika saya ingat dengan benar, itu Ward Cunningham) selama kuliah memberi tahu saya tentang latihan timnya: orang yang melanggar bangunan harus mengenakan kaos untuk hari itu, dengan kata-kata "Saya merusak bangunan" di atasnya . Dia juga menyebutkan bahwa kaos tidak pernah dicuci.
Doc Brown

Jawaban:

29

Pertama dan terpenting: setiap orang bertanggung jawab atas proses pembangunan . Kedengarannya seperti anggota dalam tim Anda tidak matang ... Tidak ada yang lolos dengan menulis kode dan membawanya ke server CI berharap itu berfungsi. Sebelum melakukan kode, harus diuji pada mesin lokal mereka. Anda harus yakin bahwa kode yang Anda periksa tidak akan merusak build. Tentu saja, ada beberapa kasus ketika build rusak secara tidak sengaja (mis. Jika file config telah diubah atau sloppy commit dibuat secara tidak sengaja).

Sebagian besar server CI (saya hanya menggunakan Hudson) akan mengirim email otomatis merinci komitmen yang dibuat yang menyebabkan build rusak. Satu-satunya bagian dari peran Anda adalah berdiri di belakang mereka tampak tangguh sampai tersangka memperbaiki apa pun yang mereka rusak.

JK
sumber
3
Apa yang terjadi jika hari sudah larut dan mereka pulang kerja? Haruskah ada aturan yang tidak bisa Anda lakukan kecuali Anda bisa memastikan itu menghasilkan build yang sukses?
c_maker
4
Saya takut ancaman akan mendorong komitmen besar yang menyeluruh daripada yang kecil yang lebih disukai.
c_maker
3
@c_maker: Bukankah komit yang kecil dan terfokus lebih kecil kemungkinannya untuk merusak build? Bagi saya kedengarannya seperti masalah disiplin, bukan masalah proses.
Aaronaught
6
Siapa pun yang melanggar bangunan adalah untuk mendapatkan kopi / kue / apa pun permen pilihan tim Anda untuk semua orang. Atau minum kopi untuk semua orang sepanjang hari, atau ... Ada banyak langkah yang dapat Anda lakukan untuk membuat bangunan yang tidak disukai itu diterima, sementara tidak terlalu mengancam sehingga membuat orang menghindari pengiriman. Yang terakhir juga dapat diatasi dengan meminta semua orang untuk setidaknya mengirimkan perubahan mereka seminggu sekali. (Sekali sehari terlalu sering ketika mengerjakan sesuatu yang lebih substansial.)
Marjan Venema
5
Siapa yang peduli siapa yang merusak bangunan, selama mereka MEMPERBAIKInya?
21

Tim Anda salah satu hal:

Bertanggung jawab atas build server tidak sama dengan bertanggung jawab atas build .

Adalah tanggung jawab orang yang memeriksa kode untuk membuatnya "berfungsi" (untuk beberapa nilai pekerjaan). Satu-satunya alasan untuk memiliki server build adalah untuk menangkap kesalahan dalam proses ini. Server build apa pun yang bernilai garam dapat memberi tahu orang yang telah memeriksa kode sejak build terakhir (dan juga siapa pun yang tertarik) dengan informasi berikut:

  • Bangun rusak!
  • Apa yang salah saat membangun!
  • Apa yang telah berubah sejak pembangunan terakhir!

Ini sangat sering terjadi melalui email. Penting bahwa ini terjadi cukup cepat setelah setiap kali check-in.

Orang tersebut kemudian dapat melihat apa yang salah, dan memperbaikinya, dan server build kemudian memberi tahu siapa pun yang tertarik bahwa build sudah kembali normal. Ini harus terjadi dengan sendirinya tanpa keterlibatan orang lain kecuali penjahat check-in.

Jadi untuk menjawab pertanyaan Anda: Lingkungan CI dewasa TIDAK memerlukan keterlibatan petugas kebersihan dalam operasi normal.

Juga, jika "kondisi aneh ada" terjadi sangat sering maka cari tahu apa penyebabnya, dan buat sistem lebih kuat.


sumber
9

Ubah prosesnya. Jika komit merusak build, secara otomatis kembalikan komit itu dan beri tahu pengembang yang melanggarnya. Adalah konyol untuk membiarkan kesalahan oleh satu anggota tim untuk memperlambat anggota tim lainnya. Atau alih-alih melakukan pembangunan integrasi dilakukan secara otomatis, minta pengembang memeriksa mesin integrasi, dan jika pembangunan berhasil, maka mereka dapat melakukan. Integrasi berkelanjutan tidak berarti "memeriksa sampah apa pun yang Anda suka dan seseorang akan memperbaikinya untuk Anda".

Strategi "cabang emas" tidak bekerja kecuali ada penjaga gerbang untuk cabang emas.

DVCS seperti Git mungkin membantu; alih-alih melakukan, pengembang hanya bisa mengirimkan perubahan untuk integrasi ke server CI, dan server kemudian dapat mencoba untuk mengintegrasikan perubahan tersebut. Jika integrasi berhasil, perubahan tersebut digabungkan, dan jika tidak ditolak.

kevin cline
sumber
8

Satu masalah yang sering saya lihat adalah bahwa pengembang tidak dapat melakukan pembangunan lokal yang memiliki langkah yang persis sama dengan pembangunan CI. Artinya, server CI dikonfigurasi untuk menyertakan langkah-langkah tambahan seperti tes unit / integrasi, cakupan, dll yang tidak dapat dilakukan secara lokal. Tidak dapat dihindari, pengembang akan digigit oleh salah satu langkah yang tidak dapat mereka lakukan secara lokal dan akan mulai mempertanyakan mengapa mereka repot-repot membuat rilis secara lokal sama sekali sebelum check-in.

Saya menjaga seluruh build saya mandiri dan memiliki server CI cukup memulai rilis build tanpa konfigurasi / langkah-langkah yang tidak jelas didefinisikan. Pengembang dapat menjalankan rilis build secara lokal sebelum check-in yang mencakup semua langkah yang akan dilakukan oleh CI build dan jauh lebih percaya diri bahwa tidak ada yang akan merusak ketika mereka melakukan check-in.

Manfaat tambahan untuk pendekatan ini meliputi:

  • mudah untuk beralih di antara server CI karena Anda belum menginvestasikan banyak waktu untuk mengonfigurasi langkah-langkah asing
  • semua perkakas build-time berada di bawah kendali sumber, yang berarti semua pengembang menggunakan perkakas yang sama persis untuk membangun sistem Anda
  • selain poin di atas, mudah untuk mengubah tool build secara terkontrol

PS. keseluruhan konsep pengasuh anak dibuat konyol, tetapi yang lain telah membahasnya.

Kent Boogaart
sumber
Amin. hanya karena sesuatu dapat dilakukan, tidak berarti selalu harus dilakukan.
gbjbaanb
7

Pertama, pengembang tidak boleh melanggar pembangunan secara teratur - mereka harus membangun dan menjalankan tes secara lokal sebelum mereka berkomitmen untuk cabang CI. Seharusnya itu tanda malu untuk menghancurkan bangunan itu, dan penting untuk menegakkannya. Saya telah melakukannya melalui memposting statistik, dan saya telah melihat tim lain memiliki "tas bawaan" di mana Anda memasukkan dolar setiap kali Anda melanggar bangunan. Pada akhir proyek, uang mengalir ke bir.

Jika rasa malu / kebanggaan pribadi tidak berhasil, Anda mungkin harus pindah ke hal-hal yang lebih berat (misalnya mengancam pemutusan hubungan kerja). Melanggar bangunan sebelum berangkat hari itu harus menjadi pelanggaran besar. Dan setiap pengembang harus memiliki pemberitahuan status bangunan di desktop mereka. Bagian terbaik dari semua ini adalah mendorong komitmen yang lebih kecil, yang lebih disukai.

Yang mengatakan, build kadang-kadang akan rusak (alasan konfigurasi CI, misalnya). Dan kadang-kadang orang akan mengacau dan pergi untuk hari itu dengan tubuh rusak. Itu sebabnya Anda harus bertujuan untuk proses yang memungkinkan untuk mengembalikan cepat dan mudah ke versi yang dikenal baik. Jika Anda selalu dapat kembali ke bangunan bagus terakhir (dan memiliki versi yang digulirkan dikerahkan ke semua tempat yang diperlukan), maka dalam skenario terburuk dari bangunan rusak di mana pelakunya telah pergi untuk malam hari Anda dapat menggulung kembali ke versi bagus terakhir dan berteriak padanya di pagi hari.

Saya tidak bisa merekomendasikan buku Pengiriman Berkelanjutan cukup. Jika Anda mencari panduan tentang cara mendewasakan proses CI Anda, cobalah.

EZ Hart
sumber
2
Setuju tentang melanggar bangunan sebelum pergi. Anda melakukan perubahan, Anda menunggu build selesai sehingga Anda tahu itu berhasil. Tidak berhasil? Kembalikan perubahan Anda atau perbaiki, sebelum Anda pergi. Tidak mau melakukan itu? Jangan lakukan perubahan hal terakhir pada hari itu.
Carson63000
1
"harus" bagus tetapi faktor manusia mana pun adalah peluang yang tidak nol untuk terjadi. Jika build itu penting maka punya satu atau lebih staging build server.
3

Saya mendengar tentang sesuatu yang Microsoft (mungkin?) Lakukan, yaitu memiliki peran membangun pengasuh anak di sekitar tim. Cara mereka melakukan ini adalah ketika seseorang merusak bangunan (yang mungkin harus mencakup memeriksa sesuatu yang gagal dalam pengujiannya), mereka mengambil peran itu. Ini membuat orang bertanggung jawab atas konsekuensi tindakan mereka dengan cara yang sangat langsung. Dan mengingat itu adalah pekerjaan yang agak menyebalkan untuk dilakukan, itu mendorong mereka untuk tidak merusak bangunan lagi.

Orang yang saat ini bertanggung jawab untuk pembangunan dapat memiliki topi khusus. Mungkin ada upacara untuk menyerahkannya.

Perhatikan bahwa seperti yang dikatakan Thorbjørn, bertanggung jawab atas build tidak sama dengan bertanggung jawab atas build server. Tanggung jawab untuk server dapat beristirahat secara permanen dengan satu atau lebih anggota tim yang cenderung memiliki infrastruktur sementara tanggung jawab untuk pembangunan bergerak.

Sekarang, detail dari proses samping, saya akan bergabung dengan paduan suara orang-orang yang menyatakan cemas pada pengembang memeriksa tanpa harus menjalankan membangun dan menguji. Tidak bisa diterima

Jika Anda memiliki beberapa anggota tim yang lebih cenderung merusak pembangunan (dan berdasarkan pengalaman saya sendiri, saya sebagian besar memikirkan anggota di negara lain), dan jika Anda menggunakan kontrol sumber modern yang bagus seperti Mercurial atau Git, Anda dapat meminta mereka check-in ke cabang lain ke seluruh tim, menjalankan proses CI terpisah untuk itu, dan secara otomatis menggabungkan perubahan dari cabang itu ke bagasi setelah pembangunan yang berhasil (perhatikan bahwa Anda harus jalankan build kedua dan uji setelah penggabungan sebelum memeriksa penggabungan!). Karena penggabungan otomatis tidak selalu berhasil, ini pada akhirnya akan meninggalkan cabang yang membutuhkan perhatian manual, yang bisa jadi sangat menyebalkan. Namun, mungkin tidak terlalu menyakitkan daripada kode yang rusak diperiksa untuk anggota tim lainnya.

Tom Anderson
sumber
2

Seperti yang dikatakan Jonathan Khoo, Anda semua harus bertanggung jawab atas server build dan skrip build. Ada tiga alasan:

  1. Saat ini Anda memiliki case "Bus of 1" yang berarti bahwa jika Anda ditabrak oleh bus maka seluruh pengetahuan tentang build server dan skrip build hilang.
  2. Skrip yang telah Anda tulis (benar atau salah) hanya mendapat masukan dari Anda. Sama seperti kode apa pun, semakin banyak orang yang terlibat, semakin luas basis pengetahuan yang dapat diterapkan padanya.
  3. Akhirnya ketika ada yang salah hanya Anda yang merasakan sakitnya. Rasa sakit adalah hal yang baik tetapi tidak ketika itu diisolasi. Saat ini Anda sedang berurusan dengan rasa sakit tetapi jika semua orang mengalami rasa sakit maka Anda akan menemukan mereka pada akhirnya akan lebih ketat dalam menguji kode sebelum melakukan.

Saya sangat terlibat dengan CI sendiri dan jatuh ke dalam perangkap menjadi orang yang memelihara skrip tetapi di sini ada beberapa hal yang dapat Anda lakukan untuk mengurangi itu.

  1. Skrip pembuatan seharusnya tidak hanya berjalan di server CI tetapi pada mesin pengembangan lokal juga. Mereka harus menghasilkan output yang sama, menjalankan tes yang sama dan gagal karena alasan yang sama. Ini memungkinkan pengembang untuk menjalankan skrip sebelum melakukan kode mereka.
  2. Jika ada yang melanggar pembangunan, buat publik melalui penggunaan baki tugas, email, lampu kilat, suara, dll. Ini berfungsi tidak hanya untuk mempermalukan anggota tim tetapi juga memberikan kesempatan bagi semua orang di tim untuk melompat dan membantu.
  3. Untuk sementara hindari memperbaiki build. Dapatkan orang lain untuk melakukannya. Jika tidak ada orang yang melompat menunggu hal buruk terjadi dan menggunakannya sebagai titik pembelajaran bagi seluruh tim untuk memahami mengapa server CI penting.
  4. Coba dan jaga server build dan mesin pengembangan Anda tanpa komponen pihak ketiga yang terpasang sebanyak mungkin, terutama menjaga kebersihan GAC. Mengandalkan komponen pihak ketiga berada di folder perpustakaan proyek. Ini membantu mengidentifikasi komponen yang hilang lebih cepat.
Bronumski
sumber
Saya sangat tidak setuju dengan memalukan siapa pun. Apakah Anda ingin kompiler Anda mem-flash alarm ketika Anda memiliki kesalahan sintaksis?
@ Thorbjørn Ini adalah server CI bukan kotak pengembangan lokal Anda. Intinya adalah tim harus melakukan segala daya mereka untuk mencegah memeriksa kode yang merusak build. Semoga orang-orang bekerja di lingkungan ramah yang menyenangkan dan rasa malu yang saya bicarakan bukan berarti bersemangat tetapi itu membuat orang berpikir lain kali sebelum mereka berkomitmen. Tapi kami memiliki suara lucu yang diputar ketika server rusak.
Bronumski
Saya masih tidak setuju. Server bangunan hanyalah server bangunan dan semua orang bisa membuat kesalahan. Beri tahu pelakunya dan biarkan dia memperbaikinya. Jika dia tidak memperbaikinya, maka kita dapat mulai mempertimbangkan apakah orang lain harus tahu.
@ Thorbjørn. Sempurna berhak untuk tidak setuju dan tidak setuju sampai batas tertentu adalah baik karena memungkinkan kita untuk mendiskusikan berbagai ide. Berharap untuk tidak setuju dengan Anda lagi, sekarang saya harus kembali ke pengembang junior yang meremehkan :)
Bronumski
1

Visibilitas akan membantu Anda. Semua anggota tim perlu tahu bahwa ada masalah aktif yang harus mereka perbaiki. Pemberitahuan email berguna, tetapi jika pengembang sibuk dan tidak langsung bereaksi, ia mungkin akan melupakannya dan email akan berakhir di tumpukan pemberitahuan yang sangat besar.

Anda dapat mencoba menggunakan alat seperti Catlight atau BuildNotify . Mereka menunjukkan status bangunan penting saat ini di area baki. Setiap kali pengembang melihat jam, ia akan melihat bahwa ada bangunan rusak yang perlu diperbaiki.

Catlight build status peringatan di baki

Catlight juga akan menunjukkan siapa yang melanggar bangunan pertama, memberikan tekanan sosial pada orang ini, karena seluruh tim akan melihatnya pada setiap kegagalan pembangunan berturut-turut.

masukkan deskripsi gambar di sini

alex
sumber
0

Salah satu strategi adalah menggunakan banyak cabang kecil untuk banyak proyek kecil. Kemudian ketika seseorang merusak gedung, mereka hanya merusak gedung sendiri. Jadi mereka mendapatkan email yang terganggu dari build server dan terserah mereka untuk mengkhawatirkannya.

Cara lainnya adalah meningkatkan tingkat tanggung jawab masyarakat. Misalnya jika Anda menggunakan sesuatu seperti Rietveld maka orang tidak dapat melakukan tanpa melewati peer review. (Proses dalam praktiknya jauh lebih ringan daripada yang Anda pikirkan. Tapi itu memang memaksa orang untuk "menyalurkan" dan mengerjakan banyak hal sekaligus.) Memelihara bangunan adalah tanggung jawab komuter dan pengulas. Jika ada orang yang secara teratur melanggar bangunan atau menyetujui hal-hal yang melanggar bangunan, maka jangan biarkan mereka memberikan persetujuan akhir untuk melakukan. Gabungkan dengan proses di mana siapa pun dapat dengan mudah mengembalikan perubahan apa pun, dan build tidak akan sering rusak, dan tidak akan tetap rusak begitu perubahan dilakukan.

btilly
sumber
'Banyak cabang kecil' tidak berfungsi dengan baik ketika Anda memiliki satu aplikasi besar yang disumbangkan semua orang.
c_maker
2
tidak, itu bekerja dengan baik. Namun Anda memindahkan rasa sakit dari waktu pengembangan ke menggabungkan waktu. Jika Anda menggabungkan paket kerja kecil secara teratur, maka ini tidak banyak merugikan sama sekali.
gbjbaanb
@ gbjbaanb: Benar, itu sebabnya saya menetapkan cabang kecil dan proyek kecil. Sebagai bonus lebih lanjut, jika bangunan utama rusak selama satu jam, kemungkinan besar orang lain akan dapat terus bekerja karena bangunan mereka belum rusak.
btilly
@c_maker: Setiap strategi dilengkapi dengan serangkaian pertukaran, dan tidak ada yang tepat untuk semua situasi. Namun baik yang saya berikan kepada Anda sedang digunakan sekarang dengan cukup sukses di banyak organisasi.
btilly
0

Saya akan memutuskan hubungan dengan paduan suara di sini, dan mengatakan bahwa sebenarnya, mematahkan bangunan sesekali bukanlah hal yang buruk, karena itu menunjukkan bahwa pekerjaan yang sebenarnya sedang dilakukan. Ya, pengembang harus membuat dan menguji sebelum melakukan, tetapi beban utama pengujian harus ditanggung oleh alat otomasi pengembangan, termasuk server integrasi berkelanjutan. Alat-alat itu ada di sana untuk digunakan, dan kecuali bangunannya rusak terus-menerus, maka tidak jelas bahwa Anda mendorong sekeras yang Anda bisa. Namun, saya berpikir bahwa bangunan tidak boleh pernah rusak selama jangka waktu yang signifikan, dan bahkan akan lebih suka rollback otomatis atau proses komitmen multi-tahap jika itu membantu mendukung tujuan kembar umpan balik cepat dari fasilitas pengujian terpusat dan otomatis, ditambah batang "hijau".

William Payne
sumber
0

Hal-hal yang perlu diingat pasangan:

  1. Tim Anda membutuhkan serangkaian standar untuk diikuti
  2. Anda perlu mengatur manajemen dengan ide kode bersih dan berusaha keras untuk meningkatkan praktik kode.
  3. Tes tes tes! Selalu uji sebelum Anda masuk.
  4. Meskipun saya setuju itu tidak masalah untuk membangun, itu langka dan maksud saya kesempatan yang sangat langka yang dapat diterima. Jika ini setiap hari, saya akan mencari pintu atau berbicara dengan bos saya tentang standar.

Secara keseluruhan kalian perlu menetapkan, menulis standar berdasarkan praktik terbaik dan bukan praktik Anda secara individual (jelas itu tidak berhasil). Setelah semua orang menyetujui standar, mulailah proses peninjauan kode dan menegakkan standar. Itu hampir terdengar seperti manajemen pergi berlibur dan tidak pernah kembali. Ini adalah hal-hal yang sejujurnya sangat mendasar untuk setiap toko. dasar kode yang baik dimulai dengan standar yang baik untuk menentukan kode tim dan bagaimana kode itu ditulis. Hanya pikiran saya saja. Saya baru-baru ini memasuki situasi yang sama di pekerjaan baru saya dan saya berbicara dengan bos saya. Dijelaskan kepadanya bahwa kita perlu menyelesaikan XYZ karena itu mempengaruhi ABC. Dua minggu kemudian saya menulis daftar standar kode untuk diikuti dan disajikan. Diikuti oleh rekan kerja saya yang memberi masukan di sana dan sekitar 2 bulan kemudian kami memiliki standar yang menyelesaikan banyak masalah.

Holmes
sumber