Genel Bakış
Bu kılavuz, bir API projesininmain branch’e gönderilen her değişikliği otomatik olarak test ettiği, Docker image ürettiği ve dört Kubernetes ortamına (dev → test → UAT → prod) sıralı şekilde deploy ettiği bir CI/CD altyapısının nasıl kurulduğunu gösterir. Her deployment adımı Apinizer üzerindeki API proxy ile senkronize edilir.
Kullanılan Teknolojiler ve Versiyonlar
| Teknoloji | Versiyon |
|---|---|
| Jenkins | jenkins/jenkins:lts |
| GitHub Actions | — |
| Kubernetes + Kustomize | v1.32.9 - v5.5.0 |
| Apinizer | v2026.01.5 |
Pipeline Akışı
Proje Yapısı
1. GitHub Actions — CI Pipeline
CI pipeline,main branch’e her push geldiğinde tetiklenir. İki iş (job) içerir: önce testler çalışır, testler geçmeden build başlamaz.
Workflow Dosyası
Aşağıdaki içeriği.github/workflows/ci.yaml olarak oluşturun ve reponuza push edin.
Jenkins job adı boşluk içeriyorsa
urllib.parse.quote() ile URL-encode edilmesi gerekir. Aksi hâlde curl isteği hatalı gönderilir.GitHub Secrets Yapılandırması
Repository Settings > Secrets and Variables > Actions ekranından aşağıdaki secret’ları tanımlayın:| Secret | Açıklama |
|---|---|
DOCKERHUB_USERNAME | Docker Hub kullanıcı adınız |
DOCKERHUB_TOKEN | Docker Hub access token |
JENKINS_URL | Jenkins instance URL’iniz |
JENKINS_JOB_NAME | Jenkins’teki CD job adı |
JENKINS_USER | Jenkins kullanıcı adı |
JENKINS_TOKEN | Jenkins API token |
2. Kubernetes Altyapısı
Base Manifests
k8s/base/ dizini tüm ortamların ortak kullandığı Deployment ve Service manifest’lerini içerir. ENVIRONMENT değeri her ortamda ayrı bir ConfigMap üzerinden uygulamaya iletilir.
Kustomize Overlay’leri
Her ortam içink8s/overlays/<env>/kustomization.yaml dosyası bulunur. Bu dosya ortama özgü namespace, ConfigMap değerleri ve aktif image tag’ini tanımlar. Jenkins, her başarılı deployment sonrasında newTag değerini otomatik olarak günceller.
test, uat ve prod overlay’leri için tekrarlayın; her birinde farklı namespace ve NodePort değerleri kullanın.
3. Jenkins — Ana CD Pipeline
Tetiklenme: GitHub Actions’tanbuildWithParameters çağrısıyla, VERSION_TAG parametresi ile.
Jenkins Job Kurulumu
Yeni Pipeline job oluşturun
Jenkins’te New Item > Pipeline seçin. Job adı olarak CD pipeline’ınızı temsil eden bir isim girin.
SCM yapılandırması
Pipeline sekmesinde Pipeline script from SCM seçin. SCM olarak Git seçin, repository URL’inizi girin ve branch’i
*/main olarak belirtin. Script Path alanına jenkins/Jenkinsfile yazın.Shared Library Yapılandırması
Bu pipeline shared library fonksiyonlarını kullanır (retryWithDelay, apinizerProxySync, apinizerPromoteProd, smokeTest). Library’nin Jenkins’e tanımlanması için:
Global Pipeline Libraries ekranını açın
Manage Jenkins > System sayfasında Global Pipeline Libraries bölümüne gidin.
Kütüphaneyi ekleyin
Add butonuna tıklayın. Name alanına kütüphane adını girin (örn.
shared-lib). Default version olarak main yazın. Retrieval method olarak Modern SCM seçin ve proje reponuzu gösterin.Jenkinsfile
Her Deploy stage’i şu üç işlemi teksh bloğu içinde sırayla yapar: kustomize ile image tag güncelleme → cluster’a apply → rollout tamamlandıktan sonra [skip ci] commit’i ile Git’e push. withCredentials bloğu hem kubeconfig hem de Git credential’larını aynı anda kapsar. cd k8s/overlays/<env> yapıldığından git add relative path kullanır.
Pipeline Aşamalarının Detayları
Validate Parameters:VERSION_TAG parametresinin dolu olduğu kontrol edilir. GitHub Actions bypass edilerek Jenkins manuel tetiklendiğinde boş parametre gelme ihtimaline karşı bu koruma kritiktir.
Checkout: Jenkinsfile’ın bulunduğu repo checkout edilir. Sonraki stage’lerde k8s/overlays/ altındaki Kustomize dosyaları üzerinde işlem yapılabilmesi için bu adım zorunludur.
Deploy (her ortam için): withCredentials bloğu hem kubeconfig hem de Git credential’larını aynı anda kapsar. Tek bir sh bloğu içinde sırasıyla: kustomize edit set image ile overlay’deki newTag güncellenir, kubectl apply -k . ile cluster’a uygulanır, rollout tamamlandıktan sonra git add kustomization.yaml → commit → push yapılır. [skip ci] etiketi sayesinde GitHub Actions yeniden tetiklenmez.
Apinizer Sync (dev / test / uat): apinizerProxySync shared library fonksiyonu, Apinizer’daki proxy’yi oluşturur veya günceller ve ilgili ortama deploy eder. Geçici hatalar için retryWithDelay wrapper’ı 3 deneme × 15 saniye bekleme uygular.
Apinizer Promote Prod: Production için proxy sıfırdan deploy edilmez. apinizerPromoteProd fonksiyonu, UAT’ta onaylanan konfigürasyonu Apinizer’ın promotion API’si üzerinden production’a taşır.
Approve (Test / UAT / Prod öncesi): Her ortam geçişinde Jenkins pipeline bekler; yetkili kullanıcı Jenkins UI’dan onaylayarak devam ettirir.
Smoke Test: Deployment sonrasında kubectl rollout status ve /health endpoint kontrolü yapılır. Detaylar için Shared Library — smokeTest bölümüne bakınız.
4. Jenkins — Targeted Deploy Pipeline
Belirli bir versiyonu tek bir ortama deploy etmek için kullanılır. CI/CD akışını çalıştırmadan hotfix veya rollback senaryolarında tercih edilir.Jenkins Job Kurulumu
Gerekli plugin'i yükleyin
Jenkins’te Manage Jenkins > Plugins ekranından Active Choices plugin’ini kurun. Bu plugin olmadan dinamik parametre dropdown’ları çalışmaz.
Yeni Pipeline job oluşturun
New Item > Pipeline seçin. Job adını
targeted-deploy veya tercih ettiğiniz bir isim olarak girin.SCM yapılandırması
Pipeline script from SCM seçin, aynı repo ve
*/main branch’ini kullanın. Script Path: jenkins/Jenkinsfile.targeted.Dinamik Parametreler
Targeted deploy job’ı üç dinamik parametre kullanır. Bu parametrelerin tanımlanabilmesi için Active Choices plugin kurulu olmalıdır. ENVIRONMENT (Active Choices Parameter): Kullanıcının hedef ortamı seçtiği dropdown.kustomization.yaml dosyasından newTag değeri okunarak “şu an deploy edilmiş versiyon” bilgisi gösterilir. Cache bypass için timestamp query parametresi eklenir.
Jenkinsfile.targeted
Ana pipeline’dan farklı olarak bu pipeline’da git işlemleri ayrı birUpdate Git stage’inde yapılır ve cluster’dan önce çalışır. kustomize edit ve git add/commit ayrı sh bloklarındadır; git push ise credential scope’unu daraltmak için ayrı bir withCredentials bloğuna alınmıştır. git add workspace root’unda çalıştığından full path kullanır. Deploy stage’inde git işlemi yoktur; yalnızca kubectl apply ve başarısızlık durumunda otomatik rollback çalışır.
Pipeline Aşamalarının Detayları
Validate: Parametre kontrolünün yanı sıra Docker Hub API’sine istek atarak seçilen tag’ın gerçekten mevcut olduğunu doğrular. Var olmayan bir tag’ın deploy edilmesi bu aşamada önlenir. Update Git: İki ayrısh bloğu çalışır: ilki kustomize edit set image ile overlay’i günceller; ikincisi git add → commit yapar. git add full path kullanır (k8s/overlays/${ENVIRONMENT}/kustomization.yaml) çünkü workspace root’unda çalışılır. git push ise credential scope’unu daraltmak için ayrı bir withCredentials bloğuna alınmıştır. Git değişikliği cluster’dan önce yapılır; bu sayede pipeline başarısız olsa bile Git, deployment girişimini yansıtır.
Deploy: Yalnızca kubectl apply -k . ve kubectl rollout status çalışır; bu stage’de git işlemi yoktur. Rollout başarısız olursa kubectl rollout undo ile önceki Kubernetes deployment’ına otomatik olarak geri dönülür. Rollback gerçekleştiğinde Apinizer senkronizasyonu çalışmaz; proxy önceki sürümü göstermeye devam eder.
Apinizer Sync: Hedef ortama göre doğru port ve Apinizer proje adı dinamik olarak seçilir, ardından apinizerProxySync çağrılır.
5. Shared Library Fonksiyonları
Jenkins shared libraryjenkins/shared-library/vars/ altında dört fonksiyon içerir. Library, Jenkins’te Global Pipeline Libraries altında implicit olarak yapılandırıldığından Jenkinsfile içine @Library(...) direktifi eklenmesine gerek yoktur; fonksiyonlar tüm pipeline job’larında doğrudan kullanılabilir.
apinizerProxySync
Apinizer’da proxy oluşturur veya günceller, ardından ilgili ortama deploy eder. Akış:export/ endpoint’inden ZIP alınır ve Jenkins artifact olarak arşivlenir. Bu sayede başarısız bir güncelleme sonrasında Apinizer UI’dan elle geri yükleme yapılabilir. Güncelleme sırasında mevcut relativePathList değeri API’den okunarak korunur; elle yazılmaz.
Proxy oluşturma payload’u:
Detaylı bilgi için Create API Proxy from URL ve Update API Proxy referanslarını inceleyebilirsiniz.
apinizerPromoteProd
UAT ortamındaki proxy konfigürasyonunu Apinizer’ın promotion mekanizması ile production’a taşır. Proxy sıfırdan deploy edilmez; önceden tanımlanmış mapping üzerinden kopyalanır.Promotion mapping’lerinin Apinizer UI’da önceden tanımlanmış olması gerekir.
mappingNames parametresi bu mapping’lere referans verir. Detaylı bilgi için API Mapping Oluşturma referansını inceleyebilirsiniz.smokeTest
İki adımlı doğrulama yapar: öncekubectl rollout status ile deployment tamamlandığını kontrol eder, 5 saniye bekler, ardından /health endpoint’ine en fazla 3 kez istek atar. Denemeler arasında 5 saniye beklenir. HTTP 200 dönerse başarılı kabul edilir.
retryWithDelay
Herhangi bir closure’ı belirtilen sayıda ve bekleme süresiyle yeniden dener. Tüm denemeler başarısız olursa son hata fırlatılır ve stage failure olarak işaretlenir.6. Jenkins Credentials Yapılandırması
Manage Jenkins > Credentials > System > Global credentials ekranından aşağıdaki credential’ları tanımlayın:| Credential ID | Tip | Açıklama |
|---|---|---|
apinizer-management-url | Secret text | Apinizer Management API base URL |
YOUR_APINIZER_TOKEN_CREDENTIAL_ID | Secret text | Apinizer API Bearer token |
kubeconfig | Secret file | Kubernetes cluster kubeconfig dosyası |
github-credentials | Username with password | GitHub kullanıcı adı ve Personal Access Token (repo write yetkisi gerekli) |
Apinizer API token oluşturma hakkında detaylı bilgi için Token Alma Yöntemleri dokümanını inceleyebilirsiniz.
7. Apinizer API Endpoint Referansı
Bu pipeline’da kullanılan Apinizer Management API endpoint’leri:| İşlem | Method | Endpoint |
|---|---|---|
| Proxy varlık kontrolü | GET | /apiops/projects/{project}/apiProxies/{proxyName}/ |
| Proxy export (snapshot) | GET | /apiops/projects/{project}/apiProxies/{proxyName}/export/ |
| Proxy oluşturma | POST | /apiops/projects/{project}/apiProxies/url/ |
| Proxy güncelleme | PUT | /apiops/projects/{project}/apiProxies/url/ |
| Environment’a deploy | POST | /apiops/projects/{project}/apiProxies/{proxyName}/environments/{env}/ |
| Production promotion | POST | /apiops/promotion/executions |
Apinizer Management API hakkında detaylı bilgi için API Genel Bakış dokümanını inceleyebilirsiniz.
Kendi Pipeline’ınızı Uyarlamak
Docker Hub ve image adı
IMAGE_BASE değişkenini kendi Docker Hub kullanıcı adınız ve image adınızla güncelleyin. CI workflow’undaki IMAGE_NAME değerini de aynı şekilde düzenleyin.Kubernetes yapılandırması
NODE_IP değerini cluster node IP’nizle, NodePort değerlerini her ortam için kullandığınız portlarla değiştirin. Deployment ve namespace adlarını kendi naming convention’ınıza göre düzenleyin.Apinizer projeleri
PROJECT_NAME_* değişkenlerini Apinizer’da oluşturduğunuz proje adlarıyla güncelleyin. PROXY_NAME değerini API proxy adınızla değiştirin.Apinizer promotion mapping
Production promotion için
apinizerPromoteProd çağrısındaki mappingNames listesini Apinizer UI’da tanımladığınız mapping adlarıyla güncelleyin.
