Percabangan merusak integrasi berkelanjutan?

18

Saya pikir artikel ini, A Successing Git Branching Model , sangat terkenal di kalangan pengguna DVCS yang berpengalaman.

Saya menggunakan hgsebagian besar, tapi saya berpendapat diskusi ini baik untuk DVCS.

Alur kerja kami saat ini adalah setiap pengembang mengkloning master repo. Kami menulis kode pada repo lokal kami sendiri, menjalankan tes, dan jika semuanya berjalan dengan baik mendorong ke master.

Jadi kami ingin mengatur server CI seperti Jenkins dan meningkatkan alur kerja kami dengan sistem penyediaan di masa depan (koki, boneka, boneka, dll.).

Bagian nyata

Nah, model yang disajikan di atas berfungsi dengan baik tetapi cabang dapat merusak CI. Cabang fitur harus disinkronkan dengan sumber (menurut artikel, itu akan menjadi developmentcabang) untuk membuat CI dan menggabungkan dengan lancar, bukan?

Say Alice dan Bob sedang mengerjakan dua fitur. Tetapi Alice selesai pada hari berikutnya. Fitur Bob memakan waktu seminggu. Pada saat Bob selesai, perubahannya sudah ketinggalan zaman (mungkin Alice refactored / mengganti nama beberapa kelas).

Salah satu solusinya adalah setiap pagi pengembang harus menarik master/originuntuk memeriksa apakah ada perubahan. Jika Alice berkomitmen, Bob harus menarik dan menggabungkan ke dalam ruang kerjanya sehingga cabang fitur-fiturnya up-to-date.

  1. Apakah ini cara yang baik?
  2. Haruskah cabang-cabang ini ada di master repo (bukan klon lokal?) Berarti haruskah setiap pengembang memiliki hak istimewa untuk master repo pada GitHub / Bitbucket sehingga mereka dapat membuat cabang baru? Atau ini dilakukan secara lokal?
  3. Terakhir, model yang disajikan oleh artikel harus merusak CI jika cabang tidak disinkronkan dengan origin/master. Karena kami ingin melakukan pembangunan malam, haruskah pengembang menarik dan menggabungkan sebelum mereka meninggalkan pekerjaan, dan memiliki CI berjalan pada setiap cabang fitur juga?
CppLearner
sumber

Jawaban:

12

Pertama-tama, penggunaan cabang fitur (untuk mengisolasi pekerjaan yang dilakukan pada fitur) dan CI (untuk menemukan masalah integrasi segera setelah mereka berkomitmen) sedikit berselisih.

Menurut pendapat saya, menjalankan CI pada cabang fitur adalah buang-buang waktu. Karena cabang fitur sering datang dan pergi, perkakas CI harus dikonfigurasi ulang berulang kali. Dan untuk cabang yang kemungkinan besar hanya mendapat pembaruan dari satu atau dua sumber yang mengoordinasikan check-in mereka untuk menghindari masalah, sistem CI dimaksudkan untuk mendeteksi.
Jadi, tidak ada gunanya memiliki cabang fitur pada server repositori master.

Adapun pertanyaan 1 dan 3: Adalah tanggung jawab pengembang untuk memastikan pembangunan di cabang pengembangan utama tidak rusak ketika mereka menggabungkan cabang fitur mereka ke dalamnya. Bagaimana mereka melakukan itu adalah masalah mereka, tetapi dua cara yang mungkin adalah:

  • Tarik perubahan yang dilakukan ke cabang pengembangan utama ke cabang fitur secara teratur (mis. Setiap hari)
  • Saat fitur selesai, gabungkan cabang pengembangan utama ke cabang fitur dan dorong hasil gabungan ke cabang pengembangan utama.

Dalam kedua kasus, masalah integrasi yang jelas (mis. Kelas / file berganti nama) ditemukan dan diperbaiki terlebih dahulu pada cabang fitur. Masalah yang lebih halus kemungkinan besar hanya ditemukan ketika membangun malam berjalan dan harus diperbaiki di sana dan kemudian.

Bart van Ingen Schenau
sumber
Saya setuju bahwa penggunaan cabang fitur (sedikit) bertentangan dengan konsep CI. Namun, adalah mungkin untuk membuat sistem CI yang tidak memerlukan konfigurasi ulang untuk berjalan di cabang fitur. (Saya telah melakukan ini di masa lalu dengan beberapa skrip python sederhana), dan ini bisa berguna ketika cabang "fitur" Anda benar-benar digunakan sebagai rilis cabang stabilisasi, di mana CI benar - benar diperlukan.
William Payne
1
Sebenarnya, saya berpikir bahwa kita memerlukan dua cabang "sentral" - satu sebagai cabang "throwaway_integration" yang ada murni sebagai pemeriksaan gabungan dan uji cepat untuk fitur yang sedang dikembangkan, dan cabang "master" atau "stabil" lainnya yang mengandung fitur setelah mereka mencapai tingkat stabilitas / kematangan tertentu. Pengembang menarik kode stabil untuk bekerja dari cabang "stabil" / "master" kedua, dan sering menggabungkan & mendorong perubahan ke cabang "tidak stabil" / "throwaway_integration" pertama. Tes CI harus dijalankan pada kedua cabang, tentu saja.
William Payne
@ WillillPayne: Saya percaya bahwa cabang "tidak stabil" seperti itu sering disebut "berkembang"
Bart van Ingen Schenau
5

Menanggapi 1)

Cara apa pun yang berhasil adalah cara yang baik. Namun : seluruh premis Integrasi Berkelanjutan adalah untuk berintegrasi terus menerus . Idenya adalah untuk menangkap bug integrasi tidak hanya sedini mungkin, tetapi dalam siklus umpan balik pengembangan - yaitu sementara semua rincian untuk kode yang diuji berada dalam memori jangka pendek pengembang membuat perubahan. Ini berarti bahwa, dalam keadaan normal sehari-hari, pekerjaan harus diintegrasikan di seluruh cabang fitur pada setiap komit - mungkin sekali setiap 15 menit atau lebih. Untuk mengulangi: Tujuan utama integrasi berkelanjutan adalah untuk mengekspos bug integrasi sementara semua detailnya ada dalam memori jangka pendek pengembang (s) membuat perubahan.

2)

Sebagian besar, cabang dibuat dalam Mercurial dengan mengkloning repositori, sehingga Anda tidak perlu memberikan setiap hak istimewa komit pengembang ke master repo. Namun, Anda mungkin ingin memberi pengembang kemampuan untuk membuat repo yang dikloning pada server integrasi berkelanjutan, karena tidak selalu layak untuk menjalankan tes secara lokal. (Saya pernah memiliki sistem CI di mana unit test memakan waktu 8 jam untuk berjalan pada 128 core cluster) - Tidak perlu dikatakan, pengembang tidak, tidak dapat menjalankan tes secara lokal.

3)

Jika Anda memiliki sumber daya komputasi untuk itu, ya, pengembang harus sepenuhnya mengikuti perkembangan garis utama setiap saat, terutama sebelum mereka meninggalkan pekerjaan, dan Anda harus menjalankan tes semalam di semua lini pengembangan (Meskipun sebagian besar sistem CI jangan membuat ini mudah).

William Payne
sumber
1
"Sebagian besar, cabang dibuat dalam Mercurial dengan mengkloning repositori" - ini mungkin benar pada tahun 2013, tetapi hari ini, bookmark Mercurial secara fungsional setara dengan cabang Git dengan semua kecuali nama.
Kevin
@ Kevin: Anda kemungkinan besar benar. Saya telah menggunakan git (hampir) secara eksklusif sejak Februari '13 - sekitar satu bulan setelah saya menulis respons di atas ... jadi saya tidak begitu tahu tentang perubahan yang terjadi pada Mercurial sejak saat itu.
William Payne
1

Berikut ini cara melakukannya: bercabang fitur.

  1. Untuk tugas baru apa pun (perbaikan bug, fitur, dll.) Mulai cabang baru (mis. Bugfix-ticket123-the_thingie_breaks)
  2. Saat Anda bekerja, terus perbarui dan gabungkan default (atau master in git) ke dalam cabang fitur Anda . Ini membantu Anda memperbarui cabang tanpa harus bekerja di cabang default
  3. Ketika fitur Anda siap dan unit test Anda lulus , lalu tarik dan gabungkan default ke cabang Anda sekali lagi, tutup cabang Anda dan dorong tanpa menggabungkan , integrator Anda akan melihat kepala baru dan itu adalah cabang tertutup, jadi dia akan mengurus mengintegrasikannya. Jika Anda tidak memiliki integrator, alihkan ke default dan gabungkan cabang fitur Anda menjadi default .

Yang penting di sini adalah bahwa Anda akan memiliki 0 konflik di cabang default ketika Anda menggabungkan cabang fitur Anda ke dalamnya, dan semua tes Anda lulus .

Dengan alur kerja sederhana ini Anda akan selalu memiliki cabang default yang asli dan stabil, sekarang melakukan hal yang sama untuk cabang rilis, tetapi mengintegrasikan dari default . Jika Anda perlu mengintegrasikan perbaikan terbaru langsung ke cabang rilis Anda masih bisa melakukan ini dengan melewatkan cabang default, tetapi sekali lagi, hanya memilih cabang yang baru saja diperbarui dari cabang target dan tidak memiliki konflik dan tes unit mereka lulus.

dukeofgaming
sumber
Anda mencampur dan mengganti hal-hal yang agak ortogonal. 0 gabungkan konflik! = 0 unit-test salah, gabungkan berhasil! = Kode sukses
Malas Badger
Menambahkan beberapa klarifikasi, lupa menyebutkan bahwa unit test harus lulus juga :)
dukeofgaming