GitLab CI/CD Pipeline Oluşturma Rehberi

GitLab CI/CD Pipeline Oluşturma Rehberi

Modern yazılım geliştirme süreçlerinde hız, güvenilirlik ve otomasyon vazgeçilmezdir. Bu bağlamda Sürekli Entegrasyon (CI) ve Sürekli Teslimat/Dağıtım (CD) pratikleri, ekiplerin daha hızlı ve daha az hatayla yazılım teslim etmelerini sağlar. GitLab, bu süreçleri tek bir platformda sunarak geliştiricilere uçtan uca bir çözüm sağlar. Bu rehberde, GitLab CI/CD pipeline’larını nasıl oluşturacağınızı ve yöneteceğinizi adım adım öğreneceğiz.

GitLab CI/CD Nedir?

GitLab CI/CD, GitLab depolarınızla entegre çalışan, yazılım geliştirme yaşam döngüsünüzü otomatikleştirmenizi sağlayan güçlü bir araçtır. Projenizin kök dizinindeki .gitlab-ci.yml adlı YAML dosyasını kullanarak pipeline’larınızı tanımlarsınız. Bu pipeline’lar, kodunuzda yapılan her değişiklikte (veya belirlediğiniz tetikleyicilerle) otomatik olarak çalışır ve projenizi test eder, derler, paketler ve hatta dağıtır.

  • Continuous Integration (CI): Geliştiricilerin kodlarını sık sık paylaşılan bir depoya entegre etme pratiğidir. Her entegrasyonda otomatik derleme ve testler çalıştırılır.
  • Continuous Delivery (CD): Yazılımın her an yayınlanmaya hazır olmasını sağlayan bir yaklaşımdır. CI’ın üzerine inşa edilir ve başarılı testlerden geçen kodun otomatik olarak bir ortamda (örneğin test veya hazırlık) dağıtılmasını içerir.
  • Continuous Deployment (CD): Sürekli Teslimat’ın bir adım ötesidir. Başarılı olan her değişiklik, herhangi bir insan müdahalesi olmadan otomatik olarak canlı ortama dağıtılır.

Temel Kavramlar ve Bileşenler

Bir GitLab CI/CD pipeline’ı oluşturmadan önce bazı temel kavramları anlamak önemlidir:

  • Pipeline: Bir projenin yaşam döngüsündeki tüm otomatik adımların (derleme, test, dağıtım vb.) bir koleksiyonudur. Genellikle bir dizi aşamadan (stage) oluşur.
  • Stage (Aşama): Pipeline içindeki mantıksal bir iş grubudur. Örneğin, build (derleme), test (test etme) ve deploy (dağıtım) aşamaları olabilir. Aşamalardaki tüm işler paralel çalışır ve bir sonraki aşama ancak önceki aşamadaki tüm işler başarılı olursa başlar.
  • Job (İş): Bir aşama içinde çalıştırılan en küçük birimdir. Bir iş, belirli bir görevi (örneğin, bir test paketi çalıştırma, bir derleme oluşturma) yerine getirir.
  • Runner: GitLab CI/CD işlerini yürüten sanal veya fiziksel bir makinedir. İşler, Runner üzerinde tanımlanan Docker imajları içinde veya doğrudan Runner’ın ortamında çalışır.

İlk Pipeline’ınızı Oluşturmak: .gitlab-ci.yml

Pipeline’ınızın tanımı, projenizin kök dizininde bulunan .gitlab-ci.yml adlı bir YAML dosyasına yazılır. Bu dosya, GitLab’ın pipeline’ınızı nasıl çalıştırması gerektiğini belirtir. İşte basit bir .gitlab-ci.yml dosyasının temel yapısı:


stages:
  - build
  - test
  - deploy

build_job:
  stage: build
  script:
    - echo "Uygulama derleniyor..."
    - # Derleme komutları buraya gelir (örneğin, npm run build, mvn package)

test_job:
  stage: test
  script:
    - echo "Testler çalıştırılıyor..."
    - # Test komutları buraya gelir (örneğin, npm test, mvn test)

deploy_job:
  stage: deploy
  script:
    - echo "Uygulama dağıtılıyor..."
    - # Dağıtım komutları buraya gelir (örneğin, ssh ile sunucuya kopyalama)
  only:
    - main # Sadece 'main' branch'ında çalıştır

Yukarıdaki örnekte:

  • stages anahtar kelimesi, pipeline’ınızın aşamalarını sırasıyla tanımlar.
  • Her bir iş (build_job, test_job, deploy_job) benzersiz bir isme sahiptir.
  • stage anahtar kelimesi, işin hangi aşamaya ait olduğunu belirtir.
  • script anahtar kelimesi, iş tarafından yürütülecek komutları listeler.
  • only anahtar kelimesi, işin hangi branch’lerde veya tag’lerde çalışacağını kısıtlar.

Sık Kullanılan Anahtar Kelimeler ve Yapılandırmalar

GitLab CI/CD, pipeline’larınızı daha güçlü ve esnek hale getirmek için birçok anahtar kelime sunar:

  • image: Bir işin çalıştırılacağı Docker imajını belirtir. Bu, her iş için tutarlı bir ortam sağlar.
    
    image: node:16-alpine
            
  • before_script, after_script: script bölümü çalışmadan önce veya sonra yürütülecek komutlardır. Genellikle kurulum veya temizleme işlemleri için kullanılır.
    
    before_script:
      - npm install
    
    script:
      - npm test
            
  • variables: Pipeline genelinde veya belirli bir iş içinde kullanılacak özel değişkenler tanımlar.
    
    variables:
      APP_VERSION: 1.0.0
      CI_DEBUG_TRACE: "false" # Debugging için
            
  • cache: İşler arasında bağımlılıkları veya derleme çıktılarını önbelleğe alarak pipeline çalışma sürelerini hızlandırır.
    
    cache:
      key: "$CI_COMMIT_REF_SLUG" # Branch'e özel önbellek anahtarı
      paths:
        - node_modules/
      policy: pull-push # Önbelleği indir ve yükle
            
  • artifacts: Bir iş tarafından oluşturulan dosyaları (örneğin derlenmiş uygulama paketi, test raporları) sonraki aşamalara veya indirmek üzere kaydeder.
    
    artifacts:
      paths:
        - dist/ # Derlenmiş dosyaların yolu
      expire_in: 1 week # Ne kadar süre saklanacağı
            
  • only / except: Bir işin hangi branch’lerde, tag’lerde veya olaylarda çalışacağını (only) veya çalışmayacağını (except) kontrol eder.
    
    deploy_production:
      # ...
      only:
        - main
      except:
        - branches@feature/*
            
  • when: Bir işin ne zaman yürütüleceğini belirler (örneğin, on_success, on_failure, always, manual).
    
    deploy_production:
      # ...
      when: manual # Manuel tetikleme
            
  • needs: İşler arasındaki bağımlılıkları açıkça tanımlar. Bir işin başka bir işin tamamlanmasını beklemesini sağlar, hatta farklı aşamalarda olsalar bile.
    
    test_integration:
      stage: test
      script:
        - run_integration_tests.sh
      needs: ["build_backend", "build_frontend"] # Bu iş, belirtilen diğer işler bittikten sonra çalışır
            

Örnek Bir Tam Pipeline: Node.js Uygulaması

Şimdi, bir Node.js uygulamasını derleyen, test eden ve dağıtan daha kapsamlı bir .gitlab-ci.yml örneği oluşturalım:


# Tüm işler için varsayılan Docker imajı
image: node:16-alpine

# Pipeline'ın aşamalarını tanımla
stages:
  - install_dependencies
  - build
  - test
  - deploy

# Ortak değişkenler tanımla
variables:
  APP_NAME: my-nodejs-app
  BUILD_DIR: dist

# Bağımlılıkları yükleme aşaması
install_dependencies:
  stage: install_dependencies
  script:
    - echo "npm bağımlılıkları yükleniyor..."
    - npm ci # package-lock.json kullanarak güvenli kurulum
  cache:
    key: "$CI_COMMIT_REF_SLUG" # Branch'e özel önbellek
    paths:
      - node_modules/ # node_modules dizinini önbelleğe al
  artifacts:
    paths:
      - node_modules/ # Diğer aşamalara node_modules'i aktar
    expire_in: 1 day # 1 gün sonra otomatik sil

# Uygulamayı derleme aşaması
build_app:
  stage: build
  script:
    - echo "Uygulama derleniyor..."
    - npm run build # React, Vue, Angular gibi frontend uygulamaları için
  cache:
    key: "$CI_COMMIT_REF_SLUG"
    paths:
      - node_modules/
    policy: pull # Sadece önbelleği indir, yükleme
  artifacts:
    paths:
      - "$BUILD_DIR/" # Derlenmiş çıktıları artifact olarak kaydet
    expire_in: 1 week # 1 hafta sonra otomatik sil
  needs: ["install_dependencies"] # Bu işin, install_dependencies bittikten sonra başlamasını sağlar

# Uygulamayı test etme aşaması
test_app:
  stage: test
  script:
    - echo "Testler çalıştırılıyor..."
    - npm test
  cache:
    key: "$CI_COMMIT_REF_SLUG"
    paths:
      - node_modules/
    policy: pull
  needs: ["install_dependencies"] # Bağımlılıklar yüklü olmalı

# Geliştirme ortamına dağıtım aşaması (otomatik)
deploy_staging:
  stage: deploy
  image: alpine/git # Dağıtım için daha hafif bir imaj
  script:
    - echo "Uygulama 'staging' ortamına dağıtılıyor..."
    - # Burada sunucuya SSH ile bağlanıp dağıtım komutlarını çalıştırabilirsiniz
    - # Örneğin: ssh user@staging.yourdomain.com "cd /var/www/$APP_NAME && git pull && npm install && npm run build && systemctl restart $APP_NAME"
    - echo "Staging dağıtımı tamamlandı!"
  environment:
    name: staging
    url: https://staging.yourdomain.com
  only:
    - develop # Sadece 'develop' branch'ında çalıştır
  needs: ["build_app"] # Derleme başarılı olmalı

# Üretim ortamına dağıtım aşaması (manuel)
deploy_production:
  stage: deploy
  image: alpine/git
  script:
    - echo "Uygulama 'production' ortamına dağıtılıyor..."
    - # Üretim dağıtım komutları, genellikle daha karmaşık ve onay gerektirir
    - # Örneğin: kubectl apply -f kubernetes/production.yaml
    - echo "Üretim dağıtımı başlatıldı. Lütfen kontrol edin."
  environment:
    name: production
    url: https://your.production.url
  only:
    - main # Sadece 'main' branch'ında çalıştır
  when: manual # Bu dağıtımın manuel olarak tetiklenmesi gerekir
  allow_failure: false # Manuel dağıtımda başarısızlığa izin verme
  needs: ["build_app"] # Derleme başarılı olmalı

İpuçları ve En İyi Uygulamalar

  • Küçük Başlayın ve Genişletin: İlk pipeline’ınızı basit tutun (örneğin sadece derleme veya basit bir test). Daha sonra ihtiyaç duydukça aşamaları ve işleri ekleyin.
  • Docker İmajlarını Kullanın: Her iş için belirli bir Docker imajı kullanarak bağımlılık sorunlarını minimize edin ve tutarlı bir ortam sağlayın.
  • Önbellekleme (Caching) Kullanın: node_modules, Maven repository’leri gibi bağımlılıkları veya derleme çıktılarını önbelleğe alarak pipeline sürelerini önemli ölçüde azaltın.
  • Artifacts Kullanın: İşler arasında veri aktarmak veya derlenmiş çıktıları kaydetmek için artifacts’i kullanın. Özellikle derleme aşamasının çıktısını dağıtım aşamasına aktarırken faydalıdır.
  • Pipeline’ları İzleyin: GitLab arayüzündeki CI/CD sekmesinden pipeline’larınızın durumunu, loglarını ve performansını düzenli olarak takip edin.
  • Değişkenleri Güvenli Yönetin: Hassas bilgiler (API anahtarları, şifreler) için GitLab CI/CD Değişkenlerini (Settings -> CI/CD -> Variables) kullanın ve bunları maskeleyin.
  • İşleri İzole Tutun: Her işin tek bir görevi olmalı ve diğer işlerden bağımsız çalışabilmelidir. Bu, hataları teşhis etmeyi kolaylaştırır.
  • Yerel Runner’ları Test Edin: Karmaşık pipeline’ları sunucuya göndermeden önce yerel ortamınızda GitLab Runner ile test etmek, zaman kazandırır.

Sonuç

GitLab CI/CD, yazılım teslim süreçlerinizi otomatikleştirerek ekibinizin daha verimli çalışmasını sağlar. Bu rehberde öğrendiğiniz temel bilgilerle, kendi pipeline’larınızı oluşturmaya başlayabilir ve uygulamanızın kalitesini ve dağıtım hızını artırabilirsiniz. Unutmayın, CI/CD sürekli bir öğrenme ve iyileştirme sürecidir. GitLab dokümantasyonunu ve topluluğunu keşfederek daha gelişmiş özellikler ve stratejiler hakkında bilgi edinebilirsiniz.