Penjelasan sederhana tentang Integrasi Berkelanjutan

32

Bagaimana Anda mendefinisikan Integrasi Berkelanjutan dan komponen spesifik apa yang terkandung dalam server CI?

Saya ingin menjelaskan kepada seseorang di departemen pemasaran apa itu Continuous Integration. Mereka memahami kontrol Sumber - yaitu mereka menggunakan Subversion. Tapi saya ingin menjelaskan kepada mereka apa itu CI. The Wikipedia Pasal tidak pernah benar mendefinisikan hal itu, artikel Martin Fowler hanya memberikan berikut, yang pada dasarnya merupakan tautologi diikuti dengan penjelasan samar 'integrasi':

Continuous Integration adalah praktik pengembangan perangkat lunak di mana anggota tim sering mengintegrasikan pekerjaan mereka, biasanya setiap orang mengintegrasikan setidaknya setiap hari - yang mengarah ke beberapa integrasi per hari. Setiap integrasi diverifikasi oleh build otomatis (termasuk pengujian) untuk mendeteksi kesalahan integrasi secepat mungkin.

Pembaruan : Saya mengirimi mereka gambar ini, saya tidak dapat menemukan yang lebih sederhana.

masukkan deskripsi gambar di sini

Pembaruan 2 : Umpan balik dari bab pemasaran (untuk saat ada 3 pertanyaan):

Saya sebenarnya suka semua 3 jawaban - untuk alasan yang berbeda. Saya merasa ingin masuk hanya untuk berterima kasih kepada mereka semua!

Jelas dia tidak bisa - jadi terima kasih atas namanya :)

Pembaruan 3 : Saya menyadari melihat artikel Wikipedia yang memuat prinsip - prinsip yang, ketika Anda hanya mengambil judul, adalah daftar yang cukup bagus:

  1. Menyimpan repositori kode
  2. Otomatis pembuatan
  3. Buat pengujian mandiri build
  4. Setiap orang berkomitmen pada garis dasar setiap hari
  5. Setiap komit (ke baseline) harus dibangun
  6. Pertahankan build dengan cepat
  7. Uji di klon lingkungan produksi
  8. Permudah untuk mendapatkan kiriman terbaru
  9. Semua orang dapat melihat hasil build terbaru
  10. Penerapan otomatis
icc97
sumber
3
oO Departemen pemasaran Anda menggunakan Subversion? Tergoda untuk memilih untuk ditutup sebagai "Terlalu Lokal" ... ;-)
Jeroen
@ Joen Yep, sungguh, untuk file di situs web. Saya membuat mereka tombol merah besar yang bagus di halaman web yang mengatakan 'Lakukan' untuk memperbarui subversi di server. :)
icc97

Jawaban:

27

Ketika seseorang mengubah file yang membentuk produk perangkat lunak dan kemudian mencoba untuk memeriksanya (dengan kata lain, upaya untuk mengintegrasikan perubahan ke dalam kode produk utama) Anda ingin memastikan bahwa produk perangkat lunak masih dapat berhasil dibuat.

Biasanya ada sistem eksternal, yang disebut server CI , yang baik secara berkala atau pada setiap perubahan, akan mengambil file sumber dari kontrol versi, dan berusaha untuk membangun produk (kompilasi / uji / paket). Jika server CI berhasil melakukan pembangunan, perubahan telah berhasil diintegrasikan.

Server CI juga harus dapat menyiarkan jika build gagal atau berhasil, sehingga sistem seperti Jenkins (salah satu server CI yang paling banyak digunakan saat ini) akan memiliki cara untuk mengirim email / teks serta antarmuka web seperti dashboard dengan sekelompok informasi tentang bangunan saat ini dan yang lalu, yang kode check-in, ketika semuanya rusak, dll. (Pada gambar Anda di atas, ini akan menjadi Mekanisme Umpan Balik .)

CI penting, karena memastikan bahwa secara berkelanjutan, Anda memiliki produk yang berfungsi. Ini penting untuk semua pengembang yang bekerja pada produk perangkat lunak serta untuk semua orang yang ingin memiliki akses ke rilis harian produk perangkat lunak, seperti QA.

c_maker
sumber
1
Integrasi berkelanjutan peduli tentang status pembangunan, tetapi juga tentang tes.
Quentin Pradet
1
dan penyebaran, itu tidak cukup untuk mengkompilasi, dan menjalankan tes, tetapi Anda juga harus mengirim binari ke lingkungan sehingga dapat diuji oleh orang-orang (atau alat otomatis) juga.
gbjbaanb
1
Karena pertanyaan itu meminta penjelasan sederhana, saya meninggalkan banyak (sebagian besar waktu spesifik proyek / tim) yang mungkin masuk ke sistem CI.
c_maker
Apakah ini tergantung pada pengembangan yang digerakkan oleh tes? Kode yang mengkompilasi tidak selalu kode yang berfungsi dengan benar? Tanpa tes gagal ketika kode tidak siap, bagaimana sistem CI tahu jika kode tersebut benar-benar berhasil diintegrasikan?
mowwwalker
1
@ user828584: Dalam jawaban saya, saya menyiratkan bahwa 'tes' adalah bagian dari build. Dan sebagai catatan, TDD berbeda dari tes untuk memeriksa kualitas. Sebagai efek samping dari TDD, Anda akan memiliki tes yang ditulis dengan baik, tetapi Anda dapat memiliki tes tanpa melakukan TDD sama sekali.
c_maker
33

Saya kira untuk departemen pemasaran Anda tidak penting bagaimana CI bekerja , tetapi apa artinya CI untuk rilis baru perangkat lunak Anda .

Idealnya CI akan berarti bahwa Anda dapat menghasilkan versi perangkat lunak Anda yang berpotensi dapat dirilis setiap hari, siap untuk disajikan atau dijual kepada pelanggan Anda, dengan beberapa fitur baru, fungsi atau perbaikan bug ditambahkan. Itu tidak berarti Anda harus memberikan versi baru setiap hari, tetapi Anda bisa jika mau.

Misalnya, jika Anda memiliki set fitur baru yang rencananya akan dirilis secara resmi untuk versi "2015" dari perangkat lunak Anda, dan Anda memiliki bagian-bagian dari set fitur yang sudah dikodekan dan diintegrasikan hari ini, petugas pemasaran dapat mengambil versi terbaru dari perangkat Anda. perangkat lunak dan menunjukkannya - kurang lebih aman - pada konferensi berikutnya sekarang pada tahun 2013. Tanpa CI, mereka harus meminta tim Anda untuk membekukan kode yang tidak direncanakan, setiap anggota tim harus mengintegrasikan fitur setengah matang yang sedang ia kerjakan ke dalam produk, mereka mungkin tidak memiliki tes otomatis yang cukup siap, dan coba tebak apa yang akan terjadi di konferensi - "versi alfa" dari rilis 2015er Anda akan memiliki risiko jauh lebih tinggi dari crash, terutama ketika fitur baru diperagakan.

Doc Brown
sumber
4
+1 untuk mendekatinya dari perspektif manfaat yang diberikannya.
colok
17

Anda tidak bisa tahu apa itu CI kecuali Anda tahu apa yang dulu kami lakukan. Bayangkan sebuah sistem dengan 3 bagian. Ada UI yang mengumpulkan data dan memasukkannya ke dalam basis data. Ada sistem pelaporan yang membuat laporan dari database. Dan ada semacam server yang memonitor database dan mengirimkan peringatan email jika kriteria tertentu dipenuhi.

Dulu ini akan ditulis sebagai berikut:

  1. Setuju pada skema untuk database dan persyaratan - ini akan memakan waktu berminggu-minggu karena harus sempurna karena Anda akan segera melihat alasannya
  2. Tetapkan 3 devs, atau 3 tim devs independen, ke 3 bagian
  3. Setiap pengembang akan mengerjakan karya mereka dan menguji karya mereka menggunakan salinan basis data mereka sendiri, selama berminggu-minggu atau berbulan-bulan.

Selama waktu ini para devs tidak akan menjalankan kode masing-masing, atau mencoba menggunakan versi database yang telah dibuat oleh kode orang lain. Penulis laporan hanya akan menambahkan sekumpulan data sampel. Penulis lansiran akan secara manual menambahkan catatan yang mensimulasikan acara laporan. Dan penulis GUI akan melihat database untuk melihat apa yang telah ditambahkan GUI. Seiring waktu, para pengembang akan menyadari bahwa spesifikasi itu salah dalam beberapa hal, seperti tidak menentukan indeks atau memiliki panjang bidang yang terlalu pendek, dan "memperbaikinya" dalam versi mereka. Mereka mungkin memberi tahu yang lain, yang mungkin menindaklanjutinya, tetapi biasanya hal-hal ini masuk daftar nanti.

Ketika ketiga bagian sepenuhnya dikodekan, dan diuji oleh devs mereka, dan kadang-kadang bahkan diuji oleh pengguna (menunjukkan kepada mereka laporan, layar atau peringatan email) maka akan datang fase "integrasi". Ini sering dianggarkan pada beberapa bulan tetapi masih akan berakhir. Itu perubahan panjang bidang oleh dev 1 akan ditemukan di sini, dan akan membutuhkan devs 2 dan 3 untuk membuat perubahan kode besar dan mungkin perubahan UI juga. Indeks tambahan itu akan mendatangkan malapetaka sendiri. Dan seterusnya. Jika salah satu devs diberi tahu oleh pengguna untuk menambahkan sebuah field, dan memang demikian, sekaranglah saatnya kedua lainnya harus menambahkannya juga.

Fase ini sangat menyakitkan dan sangat sulit untuk diprediksi. Maka orang-orang mulai berkata, "Kita harus lebih sering berintegrasi." "Kita harus bekerja sama sejak awal." "Ketika salah satu dari kami mengajukan permintaan perubahan [itulah cara kami berbicara kemudian] yang lain harus mengetahuinya." Beberapa tim mulai melakukan tes integrasi sebelumnya sambil terus bekerja secara terpisah. Dan beberapa tim mulai menggunakan kode dan output masing-masing setiap saat, sejak awal. Dan itu menjadi Integrasi Berkelanjutan.

Anda mungkin berpikir saya melebih-lebihkan cerita pertama itu. Saya pernah melakukan beberapa pekerjaan untuk sebuah perusahaan di mana kontak saya membuat saya keluar untuk memeriksa beberapa kode yang menderita dari kekurangan berikut:

  • layar yang tidak dikerjakannya memiliki tombol yang belum melakukan apa-apa
  • tidak ada pengguna yang menandatangani desain layar (warna dan font yang presisi; keberadaan layar, kemampuannya, dan tombol apa yang ada dalam spesifikasi 300 halaman.)

Pendapatnya bahwa Anda tidak memasukkan hal-hal ke dalam kontrol sumber sampai selesai. Dia biasanya melakukan satu atau dua checkin setahun. Kami memiliki sedikit perbedaan filosofi :-)

Juga, jika Anda merasa sulit untuk percaya tim akan terputus di sekitar sumber daya bersama seperti database, Anda benar-benar tidak akan percaya (tapi itu benar) bahwa pendekatan yang sama diambil untuk kode. Anda akan menulis fungsi yang bisa saya panggil? Itu hebat, silakan dan lakukan itu, saya hanya akan hardcode apa yang saya butuhkan sementara itu. Berbulan-bulan kemudian saya akan "mengintegrasikan" kode saya sehingga memanggil API Anda dan kami akan menemukan itu meledak jika saya lulus nol, saya meledak jika mengembalikan nol (dan itu banyak) ia mengembalikan hal-hal yang terlalu besar bagi saya, itu tidak dapat menangani tahun kabisat, dan ribuan hal lainnya. Bekerja secara mandiri dan kemudian memiliki fase integrasi adalah normal. Sekarang kedengarannya seperti kegilaan.

Kate Gregory
sumber
2
Kami memiliki kisah serupa di mana kami memutakhirkan aplikasi khusus yang dibangun pada SP 2003 ke SP 2007. Menggunakan VSS (ya, VSS :), setiap pengembang memeriksa sebagian dari file mereka, dikodekan selama satu dan dua minggu, lalu ketika kami mengintegrasikan kode kami, boom, bahwa ketika masalah dimulai sejak kode kami menyimpang secara signifikan. Kami memperbaiki masalah integrasi selama satu bulan, dan proyek menyewa sebuah hotel untuk mengakomodasi mereka yang tinggal sangat jauh di hari kerja. Pada hari itu, saya belajar mengintegrasikan kode setiap hari :-)
OnesimusUnbound
@OnesimusUnbound Saya ingat ditabrak dari VSS ke Clearcase ... keluar dari panci ke api. Bertahun-tahun kemudian setelah kembali ke perusahaan yang sama untuk minum-minum, saya ingat seseorang menertawakan sesama pengembang karena menyebutkan kendali sumber baru ini yang disebut 'Git', "Untuk apa kita membutuhkan sistem kendali sumber lain ??".
icc97
1
Terima kasih - saya telah berjuang untuk memahami CI sebelumnya hanya karena saya tidak tahu apa alternatifnya
Rhys
Menarik. Bagi saya, ini lebih seperti membandingkan CI dengan air terjun. Tetapi Anda dapat menggunakan metodologi non-air terjun yang menghindari masalah ini (seperti pengembangan berulang) dan tidak menggunakan CI.
Dan Moulding
@DanMoulding jika saya lincah dan berulang dan yang lain di bagian saya dari hal yang lebih besar yang tidak terintegrasi dengan apa yang dilakukan orang lain, saya tidak melakukan CI. Heck, Anda bisa air terjun dan CI. Rancang semuanya, kode semuanya, uji semuanya jika Anda mau - jika semua orang menggunakan tata letak kode / skema / file orang lain setiap saat, itu CI bahkan jika Anda menggunakan air terjun. Hubungannya adalah bahwa tanpa CI Anda hidup dan mati oleh BDUF karena itu satu-satunya harapan Anda (dan ternyata menjadi harapan samar) untuk memiliki fase integrasi dengan panjang yang masuk akal. Mengadopsi CI memungkinkan kami melepaskan BDUF.
Kate Gregory