GitLab CI: pipeline'lar ve sürekli entegrasyon

Yazar: IT Sectr Yayınlanma: 2026-04-13 Okuma süresi: 8 dk

GitLab CI, YAML yapılandırmalı pipeline'lar aracılığıyla mobil uygulamaların derlenmesini, test edilmesini ve dağıtımını otomatikleştiren, GitLab'a entegre bir sürekli entegrasyon ve teslimat sistemidir. GitLab, 2024'e göre, platform aylık 300 milyondan fazla pipeline işler ve hem bulut hem de kendi kendine barındırılan runner'ları destekler.

Ana Noktalar

  • GitLab CI — mobil projelerin derleme ve testini otomatikleştirmek için GitLab'a entegre CI/CD sistemi
  • Pipeline — .gitlab-ci.yml'de tanımlanan, runner'lar üzerinde yürütülen stage'lerin sırası
  • Runner — pipeline işlerini yürüten ajan, bulut veya kendi kendine barındırılabilir
  • Stage — bir stage içinde paralel olarak yürütülen işlerin (build, test, deploy) mantıksal grubu
  • Artifact — bir işin sonucu (APK, IPA, raporlar), stage'ler arasında iletilir

GitLab CI Nedir?

GitLab CI, sürekli entegrasyon, teslimat ve dağıtımı kapsayan birleşik DevSecOps GitLab uygulamasının bir parçasıdır. Sistem 2012'de ayrı bir proje olarak başladı ancak daha sonra doğrudan GitLab'a entegre edildi. Temel prensip, depo kökündeki .gitlab-ci.yml dosyası aracılığıyla kod olarak yapılandırmadır (Configuration as Code). GitLab CI hem bulut SaaS sürümünde hem de kendi kendine yönetilen kurulumda mevcuttur.

Mobil geliştirme için GitLab CI, APK ve IPA derlemelerinin otomasyonunu, araçlı testlerin çalıştırılmasını, statik kod analizini, uygulama imzalamayı ve mağaza yayınlamayı sunar. Platform özel ortamlar için Docker görüntülerini destekleyerek Android SDK, NDK, Xcode ve diğer araçların önceden yüklenmesine olanak tanır. Yerleşik Container Registry, ekip içinde görüntülerin depolanmasını ve dağıtılmasını basitleştirir.

GitLab CI Mimarisi: Runner'lar, Pipeline'lar ve Stage'ler

GitLab CI mimarisi üç temel bileşenden oluşur. GitLab Runner, işleri yürüten bir ajandır. Runner'lar paylaşımlı (GitLab tarafından sağlanan), grup (bir proje grubu için) veya belirli (tek bir proje için) olabilir. Her runner bir yürütücü (executor) ile kaydedilir: Shell, Docker, Kubernetes veya VirtualBox. GitLab Runner, yoğun yükleri yönetmek için otomatik ölçeklendirmeyi destekler.

Pipeline, sırayla yürütülen stage'lerin bir koleksiyonudur. Bir stage içinde işler paralel olarak çalışır. Mobil proje için tipik bir yapı şöyledir: build → test → deploy. Test stage'inde bir iş başarısız olursa deploy tetiklenmez. Dağıtım için manuel tetikleme (when: manual) yapılandırılabilir. Depolar arasındaki karmaşık CI/CD senaryoları için çoklu proje pipeline tetikleyicileri de desteklenir.

GitLab Runner Yürütücüleri

Docker yürütücüsü, mobil uygulama CI/CD'si için en popüler olanıdır. Her iş temiz bir Docker kapsayıcısında çalışır ve yalıtım ile tekrarlanabilirlik sağlar. Android derlemeleri için önceden yüklenmiş SDK ile android-sdk görüntüsü kullanılır; iOS için Shell yürütücülü macOS runner kullanılır.

Mobil Projeler için .gitlab-ci.yml Yapılandırması

.gitlab-ci.yml dosyası, YAML formatında bir pipeline tanımlar. Ana bölümler şunları içerir: image (Docker görüntüsü), stages (aşama listesi), variables (ortam değişkenleri), before_script (her işten önceki komutlar) ve script, artifacts, cache bölümleri olan işler. GitLab CI, projeler arasında ortak yapılandırmaları yeniden kullanmak için harici YAML dosyalarının dahil edilmesini (include) destekler.

GitLab CI'de değişkenler birden çok düzeyde ayarlanabilir: kullanıcı arayüzünde genel olarak, yapılandırma dosyasında, grup ve proje ayarlarında. Değişken önceliği bir hiyerarşi izler: tetikleyici değişkenleri en yüksek önceliğe sahiptir, ardından arayüzden CI/CD değişkenleri ve sonra .gitlab-ci.yml'den gelen değişkenler gelir. Değişkenler korunabilir ve yalnızca korunan dallar ve etiketler için erişilebilir hale gelir.

Temel Değişkenler ve Görüntü

yaml
image: openjdk:17-jdk-slim

variables:
  ANDROID_SDK_VERSION: "35"
  GRADLE_OPTS: "-Dorg.gradle.daemon=false"

stages:
  - build
  - test
  - deploy

cache:
  key: $CI_COMMIT_REF_SLUG
  paths:
    - .gradle/

Yapıt İçeren Derleme İşi

generate-apk işi bir Gradle projesi oluşturur ve APK'yı bir yapıt (artifact) olarak kaydeder. Yapıtlar stage'ler arasında iletilir — deploy işi, build stage'inden APK'yı kullanabilir. Yapıtların saklama süresi expire_in ile yapılandırılır.

yaml
generate-apk:
  stage: build
  script:
    - ./gradlew assembleRelease
  artifacts:
    paths:
      - app/build/outputs/apk/release/
    expire_in: 1 day

GitLab CI vs GitHub Actions: Temel Farklar

Mobil bir proje için GitLab CI ile GitHub Actions arasında seçim yaparken ekip altyapısı önemli bir faktördür. GitLab CI, Android SDK ile Docker görüntülerini depolamak için yerleşik bir Container Registry sağlar. GitHub Actions, GitHub Packages veya harici kayıtlara bağımlıdır. GitLab ayrıca kod güvenlik açığı analizi için yerleşik SAST (Statik Uygulama Güvenlik Testi) özelliğine sahiptir.

GitLab CI daha esnek bir runner modeli sunar — Kubernetes yürütücüsünü, otomatik ölçeklendirmeyi ve özel görüntüleri destekler. GitHub Actions, GitHub ekosistemi entegrasyonu ve eylem pazarında öne çıkar. GitLab CI, GitHub Actions'ın hazır eylemlerle çözdüğü birçok görev için manuel yapılandırma gerektirir.

Mobil CI/CD perspektifinden: GitLab CI, halihazırda GitLab Self-Managed kullanan ve Docker/Kubernetes ile kendi kendine barındırılan runner'lara ihtiyaç duyan şirketler için daha uygundur. GitHub Actions, hazır eylemlere ve kurulum kolaylığına değer veren bulut GitHub'daki küçük ekipler için daha uygundur.

Özellik Karşılaştırması

ÖzellikGitLab CIGitHub Actions
Yapılandırma.gitlab-ci.yml.github/workflows/*.yml
RunnerKendi barındırılan + paylaşımlıBarındırılan + kendi barındırılan
YürütücüDocker, K8s, ShellVM (Ubuntu, macOS, Win)
Eylem PazarıHayır (CI şablonları)Pazar (15k+ eylem)
iOS DerlememacOS runner veya K8smacOS barındırılan runner

Android Projesi için Pipeline Örneği

Tam bir Android pipeline'ı şunları içerir: lint, birim test, derleme ve Firebase App Distribution'a dağıtım. Pipeline şunları kullanır: Android SDK içeren bir Docker görüntüsü, Gradle önbellekleme ve aynı stage'de lint ve test'in paralel yürütülmesi. Bu yaklaşım, lint ve test görevleri birbirinden bağımsız olduğu için toplam pipeline süresini azaltır.

iOS projeleri için pipeline yapısı, macOS runner ve kod imzalama gereksinimi nedeniyle farklılık gösterir. Tipik bir iOS pipeline'ı şunları içerir: CocoaPods veya SPM kurulumu, simülatörde test çalıştırma, Xcode projesini arşivleme, IPA dışa aktarma ve TestFlight'a yükleme. GitLab CI for iOS, macOS runner'ları kullanır — zaman sınırlamaları olan GitLab SaaS macOS runner'ları veya Mac Mini veya MacStadium üzerinde kendi kendine barındırılan runner.

yaml
image: androidsdk/android-35:latest

stages:
  - lint
  - test
  - build
  - deploy

lint-check:
  stage: lint
  script: ./gradlew lint

unit-tests:
  stage: test
  script: ./gradlew test

assemble-release:
  stage: build
  script: ./gradlew assembleRelease
  artifacts:
    paths: [app/build/outputs/apk/release/]

deploy-firebase:
  stage: deploy
  script:
    - firebase appdistribution:distribute
    --app $FIREBASE_APP_ID
    --token $FIREBASE_TOKEN
    --groups testers

GitLab CI'de Derleme Süresini Optimize Etme

GitLab CI'de mobil derleme pipeline'larını optimize etmek ayrıntılara dikkat gerektirir. Önbellek ve yapıtların doğru yapılandırması derleme süresini birkaç kat azaltabilir. Performans analizi için GitLab, CI/CD Analytics sağlar — pipeline süresi metrikleri, runner yükü ve darboğazları gösteren bir gösterge paneli. Optimizasyon fırsatları bulmak için bu metrikleri düzenli olarak analiz edin. resource_group yapılandırması paralel pipeline çalıştırmalarını engeller — dağıtım çakışmalarını önlemek için kullanışlıdır.

CI için dal stratejisi de önemlidir. Önerilen, tam pipeline'ı yalnızca main ve release dalları için çalıştırmak ve özellik dalları için yalnızca lint ve birim testleri çalıştırmaktır. Bu, runner dakikalarından tasarruf sağlar ve geliştirici geri bildirimini hızlandırır. GitLab CI, workflow:rules'ı destekler — dal, değiştirilen dosyalar veya ortam değişkenlerine göre işleri dahil etme veya hariç tutma için koşullu kurallar.

Bağımlılık önbelleğe alma birincil hızlandırma yöntemidir. GitLab CI, çalıştırmalar arasında .gradle, Pods ve node_modules'u önbelleğe alır. Önbellek anahtarı $CI_COMMIT_REF_SLUG veya bir kilit dosyası karması içerir. Doğru önbellekleme ile Android projesi derleme süresi 10–15 dakikadan 2–4 dakikaya düşer. Önbellek dağıtılabilir — GitLab, önceki anahtarlara geri dönüşlü cache:key'i destekler.

Önceden yüklenmiş araçlara sahip bir Docker görüntüsü kurulum süresinden tasarruf sağlar. Önerilen, Android SDK, NDK ve gerekli API düzeyi ile özel bir görüntü oluşturmaktır. Farklı stage'lerde işlerin (lint, test, assemble) paralel yürütülmesi toplam pipeline süresini azaltır. Görüntüler için çekme politikaları (if-not-present) iş başlatmayı hızlandırır. GitLab örneği düzeyinde görüntüleri önbelleğe almak için bağımlılık proxy'si de kullanılabilir.

Optimizasyonun bir diğer önemli yönü, aşamalar arasında yapıtların kullanılmasıdır. APK ve IPA gibi ağır dosyalar, her işte yeniden oluşturulmak yerine bağımlılık (dependency) aracılığıyla iletilmelidir. Düzinelerce modülü olan büyük projeler için, pipeline düzeyinde Gradle Build Cache'in etkinleştirilmesi ve paylaşılan depolamada uzak bir önbellek yapılandırılması önerilir. Her iş için zaman aşımı, beklenen derleme süresine göre ayarlanmalıdır — bu, askıda kalan işlemleri önler.

Önbellekleme ve Çekme Politikası Örneği

yaml
cache:
  key: $CI_COMMIT_REF_SLUG
  paths:
    - .gradle/
    - app/build/

image:
  name: registry.example.com/android-builder:3.5
  pull_policy: if-not-present

Sıkça Sorulan Sorular

GitLab CI'nin maliyeti nedir?

GitLab.com'da ücretsiz plan aylık 400 CI/CD dakikası ve 5 kullanıcı içerir. Premium (aylık $29) 10.000 dakika ve daha fazla paralel iş sağlar. Kendi kendine yönetilen GitLab'ın dakika sınırı yoktur.

GitLab CI'de Android SDK nasıl kurulur?

Hazır Docker görüntüsü androidsdk/android-35'i kullanın veya before_script'te sdkmanager aracılığıyla SDK'yı yükleyin. Değişkenlerde, Gradle'ın doğru çalışması için ANDROID_SDK_ROOT ve ANDROID_NDK_HOME'u belirtin.

GitLab CI, GitHub Actions'tan nasıl farklıdır?

GitLab CI yerleşik Container Registry, Kubernetes entegrasyonu ve kendi kendine barındırılan otomatik ölçeklendirme sunar. GitHub Actions, hazır eylemlerin sayısı ve küçük ekipler için basitlik açısından öndedir.

GitLab CI iOS derlemeleri için kullanılabilir mi?

Evet, ancak iOS bir macOS runner gerektirir. GitLab SaaS macOS runner'larını (sınırlı) kullanabilir veya bir Mac Mini'de kendi kendine barındırılan bir runner kurabilirsiniz. GitLab'ın kendisi bulut macOS altyapısı sağlamaz.

GitLab CI'de işler arasında dosyalar nasıl iletilir?

Artifact'ler aracılığıyla — bir işin dosyaları pipeline içinde başka bir işe iletilir. Önbellek aracılığıyla — çalıştırmalar arasındaki bağımlılıklar için. CI/CD değişkenleri aracılığıyla — dize değerleri ve token'lar için.

Özet

  • GitLab CI — mobil uygulama derleme, test ve dağıtımını otomatikleştirmek için GitLab'a entegre CI/CD sistemi
  • Pipeline, her stage içinde paralel işlerle sırayla yürütülen stage'lerden oluşur
  • Runner, farklı ortamlar için Docker, Shell, Kubernetes ve VirtualBox yürütücülerini destekler
  • Yapılandırma, depo kökündeki .gitlab-ci.yml ile image, variables, cache ve iş bölümleri içerir
  • Önbelleğe alma, cache ile bağımlılıkları ve artifacts ile yapıtları önbelleğe alarak derlemeleri 3–5 kat hızlandırır
  • iOS için bir macOS runner gereklidir — kendi kendine barındırılan veya sınırlı GitLab SaaS
  • GitLab CI, GitLab Self-Managed ve Kubernetes altyapısı kullanan kuruluşlar için en uygunudur

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun