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) vedeploy(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:
stagesanahtar 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. stageanahtar kelimesi, işin hangi aşamaya ait olduğunu belirtir.scriptanahtar kelimesi, iş tarafından yürütülecek komutları listeler.onlyanahtar 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-alpinebefore_script,after_script:scriptbö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 testvariables: 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çincache: İş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ükleartifacts: 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 tetiklemeneeds: İş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.