Continuous Integration (CI) — bu, hər bir komanda üzvünün öz dəyişikliklərini ümumi repozitoriya gündə ən azı bir dəfə inteqrasiya etdiyi və hər inteqrasiyanın avtomatik qurğu və testlərlə yoxlandığı təcrübədir. CI kod konfliktlərini və reqressiv səhvləri erkən mərhələdə aşkarlayır, onların düzəldilmə xərclərini azaldır. Puppet State of DevOps Report, 2025 məlumatlarına görə, CI olan komandalar səhvləri avtomatlaşdırması olmayan komandalardan 4 dəfə tez düzəldir.
Əsas məqamlar
Continuous Integration (CI) — bu, bir neçə iştirakçıdan kodun vahid kod bazasına inteqrasiya prosesini avtomatlaşdıran inkişaf metodologiyasıdır. Termin Martin Fowler tərəfindən 2000-ci illərin əvvəlində „inteqrasiya cəhənnəminin“ qarşısını alan təcrübələr toplusu kimi təqdim edilmişdir — tərtibatçıların həftələrlə təcrid olunmuş şəkildə işlədiyi və dəyişiklikləri birləşdirərkən günlərlə əl ilə həll tələb edən çoxsaylı konfliktlərin yarandığı vəziyyət.
CI olmadan tərtibatçı funksiyanı bitirir, dəyişikliklərini main budağı ilə birləşdirməyə çalışır və həmkarlarının eyni faylları dəyişdirdiyini aşkarlayır. Konfliktlərin həlli saatlar çəkir və tez-tez işləyən kodu sındırır. CI bu problemi gündə bir neçə dəfə məcburi inteqrasiya ilə həll edir: inteqrasiya nə qədər tez-tez olarsa, konfliktlər bir o qədər az və onların həlli bir o qədər asan olar. Təcrübə göstərir ki, gündəlik inteqrasiyada konfliktin həlli dəqiqələr, həftəlik inteqrasiyada isə saatlar çəkir.
IBM Systems Sciences Institute məlumatlarına görə, kod yazma mərhələsində səhvin düzəldilməsi xərci $25, test mərhələsində — $100, istehsal mərhələsində — $2 500 təşkil edir. CI qüsurların aşkarlanmasını mümkün qədər sola (shift left) sürüşdürür, səhvləri commit mərhələsində aşkarlayır, onların düzəldilməsi praktiki olaraq pulsuzdur. CI olan komandalar debug-a orta hesabla 15% vaxt sərf edir, CI olmayan komandalar isə 35%.
Martin Fowler texnologiya yığınından asılı olmayaraq aktual qalan CI-nın əsas təcrübələrini müəyyən etmişdir. Bu prinsiplərə riayət etmək CI-nin fayda gətirməsini təmin edir, bürokratik yükə çevrilmir. Mobil inkişaf əlavə tələblər qoyur, lakin əsas dəyişməz qalır.
Layihənin bütün kodu vahid versiya idarəetmə sistemi (Git) ilə bir repozitoriyada saxlanılır. Vahid həqiqət mənbəyi funksiyanın fork-da işlənib həftələrlə əsas kod bazası ilə sinxronizasiya olunmadığı vəziyyəti istisna edir. Mobil layihələrdə bu o deməkdir ki, Android, iOS və backend hissələri bir repozitoriyada (monorepozitoriya) və ya ümumi versiyalama sxemi ilə ayrı repozitoriyalarda ola bilər.
Layihənin qurulması bir əmrlə yerinə yetirilməlidir. Android üçün ./gradlew assembleDebug, iOS üçün — xcodebuild və ya fastlane build. Qurğu skripti təkrarlanma qabiliyyətini yoxlayır: CI serverində qurğu tərtibatçı maşınındakı ilə eyni nəticəni verməlidir. Mühitdəki hər hansı fərqlər konteynerləşdirmə və ya IaC (Infrastructure as Code) ilə aradan qaldırılır.
Qurğudan sonra bütün test səviyyələri yerinə yetirilir: modul, inteqrasiya və UI. Testlər uğursuz olarsa — commit etibarsız sayılır. Yaşıl statusun saxlanılması komandanın ümumi məsuliyyətidir. Mobil layihələrdə tez-tez sürətli testlər (hər commit-də 5 dəqiqəyə qədər) və yavaş testlər (real cihazlarda UI testləri, daha az işə salınır) ayrılır.
// CI-friendly hesabatı ilə vahid test nümunəsi
class LoginViewModelTest {
private val repository = mock<AuthRepository>()
private val viewModel = LoginViewModel(repository)
@Test
fun loginWithValidCredentials_success() {
val email = "test@example.com"
val password = "ValidPass123"
whenever(repository.login(email, password))
.thenReturn(Result.success(User("token-xyz")))
val result = viewModel.login(email, password)
assertEquals(LoginState.Success, result)
verify(repository).login(email, password)
}
}
CI nəticələri bütün komanda üçün açıqdır: hər kəs kimin commit-inin qurğunu sındırdığını görür. Şəffaflıq məsuliyyət mədəniyyəti yaradır: tərtibatçılar push-dan əvvəl dəyişikliklərini yoxlayır və sındırılmış qurğunu növbədən kənar düzəldirlər. CI serveri qurğu statusu dəyişdikdə Slack və ya Telegram vasitəsilə bildirişlər göndərir.
Tam hüquqlu CI sistemi bir-biri ilə qarşılıqlı əlaqədə olan bir neçə komponentdən ibarətdir. Hər bir komponent boru kəmərinin öz hissəsinə cavabdehdir: işə salınmadan hesabata qədər. CI arxitekturasını başa düşmək problemləri diaqnoz etməyə və performansı optimallaşdırmağa kömək edir.
Qurğu növbəsini, resurs bölgüsünü və nəticələrin dərcini idarə edən mərkəzi komponent. CI serveri bulud (GitHub Actions, GitLab CI, CircleCI) və ya self-hosted (Jenkins, TeamCity) ola bilər. Server repozitoriyadakı dəyişiklikləri webhook və ya polling vasitəsilə izləyir və hər push və ya pull request-də pipeline işə salır.
Runner-lar — qurğu tapşırıqlarını yerinə yetirən virtual və ya fiziki maşınlardır. Bulud CI-lərdə runner-lar provayder tərəfindən təmin edilir və istifadə vaxtına görə ödənilir. Self-hosted runner-lar öz infrastrukturunda quraşdırılır və texniki xidmət tələb edir. iOS qurğuları üçün macOS runner-ları, Android üçün — Linux və ya Windows lazımdır.
Qurğudan sonra CI sistemi artefaktları (APK, IPA, test hesabatları) anbarda saxlayır — onlar endirmə və yerləşdirmə üçün əlçatandır. Keşləmə asılılıqların (Gradle keşi, CocoaPods keşi) işə salmalar arasında saxlanması sonrakı qurğuları 3–5 dəfə sürətləndirir.
| Komponent | Təyinat | Nümunə |
|---|---|---|
| CI serveri | Qurğuların orkestrasiyası | Jenkins, GitHub Actions |
| Runner | Tapşırıqların yerinə yetirilməsi | iOS üçün macOS runner |
| Repozitoriya | Kodun saxlanması | GitHub, GitLab |
| Artifact storage | Artefaktların saxlanması | AWS S3, Artifactory |
| Notification | Komandaya bildiriş | Slack, Telegram, email |
Mobil inkişaf CI-yə web və ya backend layihələrindən fərqli xüsusi tələblər qoyur. Uzun qurğu (Android üçün 3–15 dəqiqə, iOS üçün 5–20 dəqiqə), bir neçə növ artefakt (APK, AAB, IPA), imzalama və obfuskasiya ehtiyacı — bunların hamısı CI pipeline-nın fərdi konfiqurasiyasını tələb edir.
Android üçün tipik CI daxildir: lintinq (ktlint, detekt) və statik analiz, vahid testlər JUnit və MockK ilə, debug və release APK/AAB qurğusu, CI daxilində emulatorda instrumental testlər və artefaktların dərci. Gradle keşi təkrar qurğuları sürətləndirir — onsuz hər qurğu asılılıqları yenidən endirərək 3–5 dəqiqə itirir.
iOS CI Swift/Objective-C kodunun kompilyasiyası üçün macOS runner tələb edir. Pipeline daxildir: CocoaPods və ya SPM asılılıqlarının quraşdırılması, stil yoxlaması üçün SwiftLint, XCTest ilə vahid testlər, IPA qurğusu, Fastlane match vasitəsilə sertifikatlarla imzalama və TestFlight-a yükləmə. Məlumat mərkəzində Mac mini və ya Mac-da self-hosted runner — bulud macOS runner-larına alternativdir.
Flutter və React Native hər iki platforma üçün native build-lərə kompilyasiya olunur. CI iki runner dəstəkləməlidir: Android qurğusu üçün Linux və iOS qurğusu üçün macOS. Optimal strategiya — ayrılmış pipeline: Linux runner-da Android qurğusu, macOS runner-da iOS qurğusu, bundan sonra hər iki artefakt vahid release-də birləşdirilir.
CI alətinin seçimi komandanın ölçüsündən, tələb olunan performansdan, büdcədən və texnologiya yığınından asılıdır. Aşağıda mobil inkişafa vurğu ilə məşhur həllərin müqayisəsi verilmişdir. Self-hosted həllər nəzarət verir, lakin administrasiya tələb edir, bulud həllər — rahatlıq verir, lakin konfiqurasiyanı məhdudlaşdırır.
İctimai repozitoriyalar üçün pulsuzdur (2000 dəqiqə/ay). GitHub Actions Android (gradle/actions) və iOS (apple-actions) üçün hazır action-lar ekosistemi təklif edir. Minus — macOS runner-ları yalnız ödənişli tariflərdə mövcuddur. Open Source və artıq GitHub istifadə edən kiçik komandalar üçün idealdır.
Açıq mənbə kodu olan self-hosted CI serveri. Jenkins Groovy Pipeline vasitəsilə konfiqurasiya edilir, yüzlərlə plagin dəstəkləyir və istənilən avadanlıqda işləyir. Quraşdırma və dəstək üçün DevOps mühəndisi tələb edir. İnfrastruktur üzərində nəzarətin kritik olduğu enterprise seqmentində məşhurdur.
GitLab-da açıq runner arxitekturası ilə quraşdırılmış CI/CD. GitLab CI pulsuz tarifdə öz runner-larınızdan (macOS daxil) istifadə etməyə imkan verir. YAML konfiqurasiyası GitHub Actions-dan güclüdür, lakin mənimsənilməsi daha çətindir. GitLab-ı vahid DevOps platforması kimi istifadə edən komandalar üçün uyğundur.
Sürətə vurğu edən bulud CI. CircleCI Docker, macOS və Android image-lərini dəstəkləyir, asılılıqları avtomatik keşləyir. Qiymətləndirmə kredit əsaslıdır — kiçik komandalar üçün GitHub Actions-dan bahadır, lakin optimallaşdırılmış runner-lar sayəsində daha sürətlidir. Sürət tələb edən istehsal layihələri üçün tövsiyə olunur.
GitHub Actions istifadə edərək Android layihəsi üçün CI qurulmasını nəzərdən keçirək. Pipeline hər push və main budağına pull request-də statik analiz, qurğu və testləri yerinə yetirir. Minimum konfiqurasiya 15 dəqiqə çəkir və xarici xidmətlər tələb etmir.
name: Android CI
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
java-version: 17
distribution: temurin
- run: ./gradlew ktlintCheck detekt
unit-tests:
needs: lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
java-version: 17
distribution: temurin
- uses: gradle/actions/setup-gradle@v4
- run: ./gradlew testDebugUnitTest
- uses: actions/upload-artifact@v4
with:
name: test-results
path: app/build/reports/tests/
Pipeline iki paralel job-dan ibarətdir: lint (statik analizi yerinə yetirir) və unit-tests (lint-dən asılıdır — lintinq keçməzsə, testlər işə salınmır). Unit-tests job-u test hesabatını artefakt kimi yükləyir — komanda faylları yerli olaraq endirmədən GitHub Actions interfeysində baxa bilər.
CI-nin sadə səhvlərə görə uğursuz olmasının qarşısını almaq üçün Git-də pre-push hook və ya eyni yoxlamaları yerli olaraq işə salan Gradle tapşırığı qurun. Məsələn: ./gradlew ktlintCheck detekt testDebugUnitTest. Yerli yoxlamalar 3 dəqiqədən çox çəkirsə — onları sürətli (linter) və yavaş (testlər) olaraq ayırın, sürətliləri hər commit-dən əvvəl, yavaşları isə yalnız push-dan əvvəl işə salın.
Tez-tez verilən suallar
CI kodun inteqrasiyası və yoxlanmasına (qurğu + testlər) fokuslanır, CD isə yerləşdirmə avtomatlaşdırmasını əlavə edir. CI kodun düzgün olduğunu yoxlayır; CD bu düzgün kodun istifadəçilərə çatdırıla biləcəyini təmin edir. CI CD üçün ilkin şərtdir, lakin CD CI olmadan işləmir.
Minimum tezlik — hər tərtibatçı üçün gündə bir dəfə. İdeal təcrübə — hər tamamlanmış məntiqi iş vahidində (hər 1–4 saatda) repozitoriyaya push etməkdir. İnteqrasiya nə qədər tez-tez olarsa, konfliktlər bir o qədər az və onların həlli bir o qədər asandır. İnteqrasiyalar arasında 2 gündən çox keçirsə — CI istifadə etmirsiniz.
Android üçün GitHub Actions (pulsuz, asan qurulur) və ya GitLab CI (öz runner-ları) optimaldır. iOS üçün — CircleCI (ən yaxşı macOS dəstəyi) və ya Bitrise (mobil layihələr üçün ixtisaslaşmış CI). Cross-platform üçün — iki runner ilə GitLab CI (Linux + macOS).
Bəli, lakin qeyd-şərtlərlə. UI testləri yavaş (10–30 dəqiqə) və qeyri-sabitdir (flaky). Optimal strategiya: sürətli testləri (vahid + inteqrasiya) hər push-da, UI testlərini isə pull request-də, gecə və ya release-dən əvvəl işə salmaq. UI testləri üçün Device Farm və ya CI-da emulatorlardan istifadə edin.
Effektiv CI metrikaları: qurğu vaxtı 15 dəqiqədən az, yaşıl qurğular faizi 85%-dən çox, qəzadan sonra orta bərpa müddəti 30 dəqiqədən az. Qurğu tez-tez uğursuz olarsa — CI kömək etmir, əksinə mane olur. Testləri nəzərdən keçirin: flaky testləri silin, asılılıqları optimallaşdırın, qurğu vaxtını qısaldın.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun