CI/CD nədir və hər komandaya niyə lazımdır
CI/CD ifadəsi tək bir dəbli söz kimi işlədilir, amma əslində bir-birinə «yapışdırılmış» iki ayrı ideyadır: davamlı inteqrasiya (continuous integration) və davamlı çatdırılma (continuous delivery) və ya yerləşdirmə (deployment). Onları ayrı-ayrılıqda başa düşmək bütün anlayışı xeyli az mücərrəd edir.
Davamlı inteqrasiya kodu tez-tez birləşdirmək deməkdir — həftədə bir dəfə yox, gündə bir neçə dəfə — və hər dəfə kimsə dəyişiklik göndərəndə avtomatik yığım və testlər dəstini işə salmaq. Məqsəd tezliyin özü deyil. Məsələ ondadır ki, kiçik, tez-tez edilən birləşdirmələri izləmək asandır, üç həftədir main-dən uzaqlaşan nəhəng budaq isə baş verməyə hazır birləşmə konfliktidir. CI konflikti, sınmış testi və ya təsadüfi yazı səhvini yarandıqdan bir neçə dəqiqə sonra tutur, iki həftə sonra yox — o vaxt artıq heç kim həmin sətrin orada niyə olduğunu xatırlamır.
Davamlı çatdırılma daha bir addım irəli gedir: kod CI-dan keçdikdən sonra avtomatik paketlənir və buraxılışa hazır vəziyyətə gətirilir — bəzən test mühitinə (staging), bəzən isə birbaşa canlı mühitə (production). Davamlı yerləşdirmə daha «aqressiv» variantdır: bütün avtomatik yoxlamalardan keçmək kodun heç bir insan düyməni basmadan canlı mühitə çıxması deməkdir. Əksər komandalar bunların arasında bir yerdə dayanır: test mühitinə qədər avtomatik, canlı mühitdən əvvəl isə əl ilə təsdiq.
Real konveyer əslində nə edir
CI/CD konveyeri kod hər dəfə dəyişəndə icra olunan avtomatik addımlar ardıcıllığından ibarətdir. Tipik konveyer təxminən belə görünür:
- Yeni kodu götürmək və asılılıqları quraşdırmaq
- Açıq-aşkar səhvləri tez tutmaq üçün linterləri və statik analizi işə salmaq
- Avtomatik testlər dəstini icra etmək — əvvəlcə ucuz başa gələn unit testləri, sonra daha yavaş inteqrasiya testləri
- Yerləşdirilə bilən artefaktı yığmaq — Docker imici, kompilyasiya olunmuş binar fayl, statik sayt paketi
- Onu test və ya canlı mühitə yerləşdirmək
- Yerləşdirmənin həqiqətən sağlam işə düşdüyünü təsdiqləmək üçün canlı versiyaya qarşı smoke test icra etmək
İstənilən addımda baş verən hər hansı nasazlıq konveyeri dayandırır və dəyişikliyi göndərən şəxsə bildiriş göndərir. Bütün sirr bundadır: testləri, yığımı və yerləşdirməni hər dəfə düzgün və ardıcıllıqla işə salmağı insanın yadında saxlaması əvəzinə, bunu maşın hər dəfə eyni şəkildə edir.
Bu, göründüyündən niyə daha vacibdir
CI/CD olmadan yerləşdirmələr «hadisəyə» çevrilir. Kimsə «yerləşdirmə günü» təyin edir, hamı bir az həyəcanlanır və nəsə sınarsa, son yerləşdirmədən bəri edilmiş iyirmi dəyişiklikdən hansının buna səbəb olduğunu tapmaq əsl əzaba çevrilir. CI/CD ilə hər dəyişiklik kiçikdir, təcrid olunmuş şəkildə test edilir və ayrıca yerləşdirilir — beləliklə, nəsə sınanda bunu hansı beş sətirlik dəyişikliyin etdiyini dəqiq bilirsiniz, çünki buraxılan yeganə şey odur.
O, həmçinin konkret bir insan xətasını da aradan qaldırır: hansısa incə mühit fərqi üzündən bir mühəndisin noutbukunda işləyən, canlı mühitdə isə işləməyən yerləşdirmə və ya kiminsə əvvəlcə miqrasiyaları işə salmağı unutduğu buraxılış. Konveyer hər dəfə eyni addımları eyni ardıcıllıqla icra edir, ona görə də «əl ilə edəndə işləyirdi» bəhanəsi canlı mühitin niyə «yandığını» izah etmək üçün keçərli olmaqdan çıxır.
Komandalar harada səhv edir
Ən çox rast gəlinən səhv CI/CD-dən tamamilə imtina etmək deyil — əksər komandaların artıq hansısa konveyeri var. Səhv konveyerə zəif, etibarsız testlər dəstinin «yapışdırılmasıdır» və nəticədə «testlər keçdi» əslində çox şey ifadə etmir. Real xətaları tutmayan «yaşıl» konveyer heç konveyerin olmamasından da pisdir, çünki yanlış əminlik yaradır. Digər geniş yayılmış səhv qırx dəqiqə icra olunan konveyerdir: o, mühəndisləri səssizcə yenidən dəyişiklikləri toplamağa və daha az birləşdirməyə sövq edir — bu isə davamlı inteqrasiyanın bütün mənasını heçə endirir.
CI/CD-ni düzgün qurmaq seçdiyiniz alətdən — GitHub Actions, GitLab CI, Jenkins, CircleCI hamısı bacarıqlıdır — daha çox sürətli, etibarlı testlərə real investisiya qoymaqdan və konveyerin özünü insanların ondan yan keçməyə çalışmayıb ona etibar edəcəyi qədər sadə saxlamaqdan asılıdır.
Bu, Burncode-da gördüyümüz infrastruktur işlərinin əsas hissəsidir: mühəndislərin həqiqətən arxalanacağı qədər sürətli CI/CD konveyerləri qurmaq və konveyerin özünün tutmadığı nasazlıqları aşkar etmək üçün monitorinqi yerində təmin etmək.