GitLab CI/CD ile Ubuntu Üzerinde Sürekli Dağıtım (CD) Kurulumu
Bu rehberde ne öğreneceksiniz?
Bu rehberde
Her commit sonrası Docker imajı üretme, registry’ye gönderme ve SSH ile canlıya alma sürecini öğreneceksiniz.
Rollback (geri alma) dahil, gerçek hayatta kullanılan production-ready bir CD yapısı kuracağız.
Kısaca: push at → site otomatik güncellensin. Reis işi 😎
🧠 Aşama 1 – Teknik Analiz (Özet)
Ana konu: GitLab CI/CD ile Continuous Deployment kurulumu
Çözülen problem: Manuel deploy, insan hatası ve zaman kaybı
İzlenen adımlar:
- GitLab reposu oluşturma
- GitLab Runner kurma
- SSH ile güvenli deploy
- Docker imajı üretme ve çalıştırma
- Rollback (geri alma)
📦 Ön Gereksinimler
- Ubuntu 18.04 veya üzeri bir sunucu
- En az 1 GB RAM, 1 CPU
- Sunucuda Docker kurulu olmalı
- Container Registry açık bir GitLab hesabı
sudoyetkili, root olmayan kullanıcı
1️⃣ GitLab Projesi Oluşturma
GitLab’te New Project → Blank Project seçin.
Proje adını belirleyin ve görünürlüğü ihtiyaca göre ayarlayın.
index.html oluşturma
<html>
<body>
<h1>My Personal Website</h1>
</body>
</html>
- Bu dosya, deploy sonrası tarayıcıda görüntülenecek örnek web sayfasıdır.
2️⃣ Dockerfile Oluşturma
- Dockerfile
COPY index.html /usr/share/nginx/html
- Bu Dockerfile, Nginx imajı üzerine statik site ekler. Sabit sürüm kullanmak, ileride sürpriz yaşamamak için iyi pratiktir.
3️⃣ GitLab Runner Kurulumu
- Sunucuya bağlanın:
ssh deployer@SUNUCU_IP
- GitLab Runner’ı kurun:
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash
sudo apt install gitlab-runner
- Bu servis CI/CD job’larını çalıştırır.
- Runner’ı projeye kaydedin:
sudo gitlab-runner register -n \
--url https://gitlab.com \
--registration-token PROJE_TOKEN \
--executor docker \
--docker-image docker:stable \
--tag-list deployment \
--docker-privileged
- Bu runner yalnızca bu proje için deploy işlemi yapar. Shared runner derdi yok, güvenlik bizde. 💪
4️⃣ Deployment Kullanıcısı Oluşturma
sudo adduser deployer
sudo usermod -aG docker deployer
- Bu kullanıcı sadece dağıtım işlemleri için kullanılır.
(Evet, Docker grubu root kadar yetkili — bilerek yapıyoruz.)
5️⃣ SSH Anahtarı Oluşturma
su deployer
ssh-keygen -b 4096
- cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
- CI/CD pipeline bu anahtar ile sunucuya bağlanır.
Parola boş bırakılır; pipeline interaktif değildir.
6️⃣ SSH Anahtarını GitLab’e Kaydetme
- GitLab → Settings → CI/CD → Variables
| Key | Type | Açıklama |
|---|---|---|
| ID_RSA | File | SSH private key |
| SERVER_IP | Variable | Sunucu IP |
| SERVER_USER | Variable | deployer |
ID_RSA değişkeni Protected olarak işaretlenmelidir.
7️⃣ .gitlab-ci.yml Dosyası
stages:
- publish
- deploy
variables:
TAG_LATEST: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:latest
TAG_COMMIT: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:$CI_COMMIT_SHORT_SHA
publish:
image: docker:latest
stage: publish
services:
- docker:dind
script:
- docker build -t $TAG_COMMIT -t $TAG_LATEST .
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
- docker push $TAG_COMMIT
- docker push $TAG_LATEST
deploy:
image: alpine:latest
stage: deploy
tags:
- deployment
script:
- chmod og= $ID_RSA
- apk add --no-cache openssh-client
- ssh -i $ID_RSA -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_IP "docker pull $TAG_COMMIT"
- ssh -i $ID_RSA -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_IP "docker rm -f my-app || true"
- ssh -i $ID_RSA -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_IP "docker run -d -p 80:80 --name my-app $TAG_COMMIT"
environment:
name: production
url: http://SUNUCU_IP
only:
- master
- Bu yapı Docker imajını üretir ve otomatik olarak canlıya alır. Commit attın mı? Site güncel. Olay bu 😎
8️⃣ Deploy Doğrulama
- GitLab → CI/CD → Pipelines
- Pipeline durumu Passed olmalıdır.
- Tarayıcıdan kontrol edin:
http://SUNUCU_IP
- Sunucuda konteyneri doğrulayın:
docker ps
- my-app konteyneri çalışıyor olmalıdır.
🔄 Rollback (Geri Alma)
-
Eski deployment için Run Again tıklayın
-
GitLab eski imajı tekrar deploy eder
-
Canlı sistem önceki haline döner
❓ Sıkça Sorulan Sorular (SSS)
1. Bu yapı production için uygun mu? Evet, küçük ve orta ölçekli projeler için gayet uygundur.
2. SSH yerine başka yöntemler var mı? Evet, Kubernetes veya GitOps tercih edilebilir.
3. Shared Runner kullanabilir miyim? Güvenlik sebebiyle önerilmez.
4. HTTPS nasıl eklenir? Nginx + Let’s Encrypt veya Traefik kullanılabilir.
5. Rollback neden başarısız olur? Eski imaj registry’den silinmiş olabilir.
🎯 Sonuç Bu rehberle GitLab CI/CD kullanarak tam otomatik bir dağıtım zinciri kurdunuz. Her commit sonrası uygulamanız kendi kendine yayına alınır.
👉 Rabisu Bulut altyapısında bu yapıyı dakikalar içinde hayata geçirebilirsiniz.