Tim saya saat ini menggunakan proses percabangan / penyebaran yang cukup sederhana yang terlihat seperti ini:
┌────────┐ ┌────┐ ┌──────┐
Environments: │ DEV │ │ QA │ │ PROD │
└────────┘ └────┘ └──────┘
▲ ▲ ▲
│ │ │
┌────────┐ ┌────┐ ┌──────┐
Builds: │ DEV │ │ QA │ │ PROD │
└────────┘ └────┘ └──────┘
▲ ▲ ▲
│ │ │
┌────────┐ ┌────┐ ┌──────┐
Branches: │ master │ │ qa │ │ prod │
└────────┘ └────┘ └──────┘
Setiap lingkungan memiliki cabang sendiri (kami menggunakan git ) dan bangunannya sendiri yang menggunakan cabang itu. Ketika kami ingin mempromosikan dari satu lingkungan ke lingkungan lain, misalnya, dari DEV ke QA, kami menggabungkan master
cabang ke dalam qa
dan memulai bangunan QA baru (yang kemudian secara otomatis digunakan untuk lingkungan QA).
Kami sedang mempertimbangkan untuk pindah ke proses baru yang akan dilakukan dengan memiliki cabang khusus dan membangun untuk setiap lingkungan. Sebagai gantinya, satu rilis build akan menciptakan "paket penempatan" yang kemudian dapat digunakan untuk lingkungan apa pun. Kami membayangkan alur kerja yang khas akan terlihat seperti ini:
┌────────┐ ┌────┐ ┌──────┐
Environments: │ DEV │ ──► │ QA │ ──► │ PROD │
└────────┘ └────┘ └──────┘
▲
\
┌───────────────┐
Builds: │ release build │
└───────────────┘
▲
│
┌────────┐ ┌─────────┐
Branches: │ master │ │ release │
└────────┘ └─────────┘
Promosi dari satu lingkungan ke lingkungan yang lain tidak akan lagi ditangani dalam kendali sumber; alih-alih, kami hanya akan mengambil binari yang sudah dibangun ("paket penempatan") dan meletakkannya di lingkungan baru.
Sistem baru ini akan memungkinkan kami untuk menyebarkan bangunan apa pun ke lingkungan apa pun, yang memiliki beberapa keunggulan. Misalnya, sangat mudah untuk menguji perbaikan bug PROD di DEV dan QA. Sistem kami saat ini tidak menyediakan cara mudah untuk melakukan ini tanpa memutar kembali cabang, yang jelas ingin kami hindari.
Kelemahan terbesar dengan sistem baru ini adalah kita tidak lagi memiliki cara otomatis untuk melacak kode apa yang ada di lingkungan mana. Jika kami perlu memperbaiki di PROD, kami tidak lagi memiliki cabang khusus yang disinkronkan dengan basis kode produksi saat ini. Hal yang sama berlaku untuk QA - jika kita ingin mendorong perubahan cepat ke QA tanpa mengeruk pekerjaan dalam proses darimaster
, kita tidak lagi memiliki cabang yang mencerminkan keadaan lingkungan QA saat ini.
Bagaimana kita bisa melacak kode apa yang ada di setiap lingkungan?
Beberapa opsi yang kami pertimbangkan:
- menggunakan tag git untuk melacak komit di lingkungan mana
- menanamkan komit git yang digunakan oleh build ke dalam setiap paket penempatan