furkan<trn/>
Drone CI Kurulumu: Blog Sitem İçin Otomatik Deployment Nasıl Yaptım?

Drone CI Kurulumu: Blog Sitem İçin Otomatik Deployment Nasıl Yaptım?

Furkan Torun Furkan Torun
4 Nisan 2025
7 dakika okuma süresi
Paylaş:
İçerik
index

Selamlar herkese!

İlk blog yazımı, bu siteyi oluşturduktan sonra yaşadığım bir sorunun çözümü üzerine yazmaya karar verdim. Blog sitem için değişiklik yaptığımda sürekli manuel olarak build edip Compose güncellemem gerekiyordu. Bu süreç oldukça zaman alıcı ve zahmetliydi. Çünkü backend ve frontend ayrı containerlarda çalışıyorlar. O yüzden, bu işlemleri otomatikleştirebileceğim bir çözüm arayışına girdim. Akla gelen ilk çözümlerden biri şüphesiz Jenkins oldu. Ancak Jenkins’i sunucuma deploy etmeye çalıştığımda, imaj dosyası bile build edilemiyordu ve makine kitleniyordu. Sonunda daha hafif ve kullanışlı bir çözüm arayışına girdim. Ta-da! Drone-CI’ya rastladım. Drone’un kurulumu o kadar basit ve kullanımı o kadar kolay ki, şu an deployment’ı otomatik olarak yönetebiliyorum. Bu rehberde size de kendi CI/CD’nizi nasıl deploy edebileceğinizi göstereceğim. Şimdiden iyi okumalar!


📌 NOT : Bu rehber, elinizde hâlihazırda bir alan adı (domain) ve Linux işletim sistemi bulunduğu varsayılarak hazırlanmıştır.

Farklı işletim sistemleri ve platformlar(Gitlab, Gitea, vb.) için dökümanlara buradan ulaşabilirsiniz.

Github Ayarları

Github hesabımıza giriş yapıyoruz. Ardından ayarlar kısmından Developer Settings sekmesine geliyoruz.

Açılan sayfada, yeni bir OAuth uygulaması oluşturmak için New OAuth App butonuna tıklıyoruz.

Şimdi sırayla bu alanları dolduralım:

  • Application name : İstediğiniz ismi verebilirsiniz. Örnek olarak “Drone”

  • Homepage URL : Bu alana kendi alan adınızı girin. Örneğin: example.drone.furkantrn.com

📌 NOT : Alan adı sağlayıcınızın DNS ayarlarında drone için bir A Record eklemek daha iyi olacaktır.

  • Authorization callback URL : Bu kısma domaininiz/login şeklinde ekleme yapınız. Örnek olarak example.drone.furkantrn.com/login

Son olarak, Register application butonuna tıklayarak uygulamanızı kaydedin.

📌 NOT : Bu sayfada Client ID ve Client Secret bilgileri görüntülenecektir. Kurulum sırasında gerekli olacağı için bu bilgileri güvenli bir yere kaydedin. Eğer Client Secret görüntülenmiyorsa, Generate a new client secret butonuna tıklayarak yeni bir tane oluşturabilirsiniz.

Şimdi kuruluma geçebiliriz.

Drone Server Kurulumu

Terminali açıp şu komutu giriyoruz:

Terminal window
docker run --detach \
--volume=/var/lib/drone:/data \
--env=DRONE_GITHUB_CLIENT_ID= \
--env=DRONE_GITHUB_CLIENT_SECRET= \
--env=DRONE_RPC_SECRET= \
--env=DRONE_SERVER_HOST= \
--env=DRONE_SERVER_PROTO=https \
--env=DRONE_REGISTRATION_CLOSED=true \
--env=DRONE_USER_CREATE=username:<username>,admin:true \
--publish=80:80 \
--restart=always \
--name=drone \
drone/drone:2

Şimdi sırası ile açıklayalım:

  • --detach : Containerin arka planda çalışmasını sağlar.

  • --volume=/var/lib/drone:/data : Drone verilerinin container dışındaki /var/lib/drone dizininde saklanmasını sağlar.

  • --env=DRONE_GITHUB_CLIENT_ID : GitHub OAuth uygulamanızın Client ID’sini buraya giriyoruz.

  • --env=DRONE_GITHUB_CLIENT_SECRET : GitHub OAuth uygulamanızın Client Secret’ını buraya giriyoruz.

  • --env=DRONE_RPC_SECRET : Drone server ve runner arasındaki iletişimi güvence altına almak için bir RPC Secret belirler. Bu secreti daha sonra kullanmak üzere bir yere not ediniz.

Random bir secret üretmek için terminalde şu komutu girebilirsiniz:

Terminal window
openssl rand -hex 16
  • --env=DRONE_SERVER_HOST : Drone serverin ana bilgisayar adını (domain) belirtir. Örneğin, example.drone.furkantrn.com.

  • --env=DRONE_SERVER_PROTO=https: Drone sunucusunun protokolünü belirtir. Burada HTTPS kullanıyoruz.

  • --env=DRONE_REGISTRATION_CLOSED=true : Kayıt işlemlerinin kapalı olduğunu belirtir, yani sadece manuel olarak eklenmiş kullanıcılar Drone’a erişebilir.

  • --env=DRONE_USER_CREATE=username:<username>,admin:true : Drone’da ilk kullanıcıyı oluşturur. <username> kısmını github username ile aynı yapmanız önemlidir.

  • --publish=10256:80 : Docker konteynerinin çalışacağı portu belirtir. Bu, Drone UI’nin web üzerinden erişilebilir olmasını sağlar. İstediğiniz portu verebilirsiniz.

📌 NOT : 443 portunu publish etmememizin sebebi, Nginx ile reverse proxy yaparak alan adımızı uygulamamıza bağlayacak olmamızdır. Nginx konfigurasyonunu rehberin devamında göstereceğim.

  • --restart=always : Docker containerin her zaman yeniden başlatılmasını sağlar, container kapanırsa otomatik olarak tekrar başlatılır.

  • --name=drone : Docker containera bir isim verir. Opsiyoneldir.

📌 Tüm konfigurasyon seçenekleri için burayı ziyaret edebilirsiniz.


Bilgileri girdikten sonra containeri başlatıyoruz.


Nginx Kurulumu

Şimdi sırada alan adımızı uygulamamıza bağlamamız gerekiyor. Bunun için nginx kullanacağız. Peki nedir bu nginx?

🟢 Nginx, yüksek performanslı bir web sunucusu ve reverse proxy yazılımıdır. Özelliklerinden kısaca bahsedecek olursak:

  • Statik İçerik Sunma ve Yüksek Performans 🚀 : Hızlı ve verimli şekilde statik içerik sunar, aynı anda çok sayıda bağlantıyı yönetebilir.
  • Reverse Proxy ve Yük Dengeleme 🔄 : Gelen trafiği yönlendirerek backend sunuculara yük dengelemesi yapar ve uygulamanın ölçeklenebilirliğini artırır.
  • Güvenlik ve HTTPS Desteği 🔐 : SSL/TLS şifreleme ile güvenli bağlantılar sağlar ve uygulamanın güvenliğini artırır.

İlk olarak eğer sunucunuzda nginx yoksa şu komut ile yükleyebilirsin:

Terminal window
sudo apt install nginx

Yükleme işlemi tamamlandıktan sonra konfigurasyon dosyamızı oluşturalım:

Terminal window
nano /etc/nginx/sites-available/example.drone.furkantrn.com // Kendi alan adınızı giriniz.
server {
listen 80;
server_name example.drone.furkantrn.com; # Buraya alan adımızı giriyoruz.
location / {
return 301 https://$host$request_uri;
}
}
server {
location / {
proxy_pass http://localhost:10256;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

📌 NOT : Eğer Drone Server’ı Docker’da varsayılan olarak çalıştırdıysanız, 80 portunu kullanabilirsiniz. Ancak farklı bir port belirlediyseniz docker ps komutuyla hangi portun eşlendiğini kontrol edin.

Kaydedip editörden çıkıyoruz. Aşağıdaki komut ile config dosyamızı sites-enabled klasörüne taşımamız gerekiyor. Bunun için gereken komut:

Terminal window
sudo ln -s /etc/nginx/sites-available/example.drone.furkantrn.com /etc/nginx/sites-enabled/
sudo systemctl restart nginx

Alan adımıza Lets Encrypt ile ücretsiz SSL sertifikası eklemek için cerbot paketini yükleyelim:

Terminal window
sudo apt install certbot python3-certbot-nginx

SSL sertifikası almak için şu komutu giriyoruz:

Terminal window
sudo certbot --nginx -d example.drone.furkantrn.co // Kendi alan adınızı giriniz.

Bu komut oluşturduğumuz config dosyamız artık şöyle görükecektir:

server {
if ($host = example.drone.furkantrn.com) {
return 301 https://$host$request_uri;
}
listen 80;
server_name example.drone.furkantrn.com;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name example.drone.furkantrn.com;
ssl_certificate /etc/letsencrypt/live/example.drone.furkantrn.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.drone.furkantrn.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384';
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://localhost:10256;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

Config dosyanızın kontrolünü nginx -t komutu ile doğrulayabilirsiniz. Ardından nginx’i yeniden başlatalım:

Terminal window
sudo systemctl restart nginx

Böylelikle Drone server’ı başarı ile kurmuş olduk.



Drone Runner Kurulumu

Kısaca Drone Runner şu işe yarar:

  • CI/CD işlemlerini yürütür.
  • Docker, Kubernetes, SSH veya Exec Runner türleri vardır.
  • Bu rehberde Docker tabanlı runner kuracağız.

Terminale aşağıdaki kodu giriyoruz:

Terminal window
docker run --detach \\
--volume=/var/run/docker.sock:/var/run/docker.sock \\
--env=DRONE_RPC_PROTO=https \\
--env=DRONE_RPC_HOST=drone.example.com \\
--env=DRONE_RPC_SECRET=your_rpc_secret \\
--env=DRONE_RUNNER_CAPACITY=2 \\
--env=DRONE_RUNNER_NAME=runner \\
--publish=3000:3000 \\
--restart=always \\
--name=example-drone-runner \\
drone/drone-runner-docker:1
  • --detach : Containerin arka planda çalışmasını sağlar.
  • --volume=/var/run/docker.sock:/var/run/docker.sock : Runner’ın yeni Docker containerleri başlatmasına izin verir. Drone Runner, pipeline aşamalarını kendi içinde çalıştıracağı için Docker’a erişmesi gerekir.

📌 NOT : Eğer bu ayar eklenilmezse Drone pipeline’ları çalıştıramaz!

  • --env=DRONE_RPC_PROTO=https : Drone Server ile HTTPS üzerinden iletişim kurulmasını sağlar.
  • --env=DRONE_RPC_HOST= : Drone Server’ın çalıştığı domaini giriyoruz.
  • --env=DRONE_RPC_SECRET= : Buraya Drone server kurarkenki ürettiğimiz secret’i giriyoruz. Drone Server kurulumu sırasında belirlenen DRONE_RPC_SECRET ile aynı olmalıdır.
  • --env=DRONE_RUNNER_CAPACITY=2 : Aynı anda en fazla 2 tane pipeline çalıştırılmasına izin verir. Daha fazla kapasite isteniliyorsa bu sayıyı artırabilirsiniz.
  • -publish=3000:3000 : Runner, genellikle doğrudan HTTP bağlantısına ihtiyaç duymaz. Pipeline’ları yürütmek için sadece Drone Server ile haberleşir. Bu yüzden port açmak zorunlu değildir.

📌 Tüm konfigurasyon seçenekleri için burayı ziyaret edebilirsiniz.

Gerekli bilgileri ekleyerek containeri başlatıyoruz. Drone server ile bağlantısını kontrol etmek için şu komutu çalıştırabilirsiniz:

Terminal window
docker logs -f example-drone-runner

Sağlıklı şekilde çalışıyor ise şöyle bir çıktı alırsınız:

time=2025-04-02T20:21:29Zlevel=infomsg=starting the serveraddr=:3000

time=2025-04-02T20:21:29Zlevel=infomsg=successfully pinged the remote server

time=2025-04-02T20:21:29Zlevel=infomsg=polling the remote server arch=amd64 capacity=4 endpoint=https://example.drone.furkantrn.com kind=pipeline os=linux type=docker

Artık tarayıcımıza alan adımızı girerek Drone arayüzüne giriş yapabiliriz. Eğer kurulum doğru ise şöyle bir ekran gelecektir:

drone-web-ui

Continue diyerek devam edelim.

Authorize diyerek devam edelim.

Sistem bize user registration disabled mesajı verecektir. Continue diyerek devam edelim.

Hiçbir kutucuğu doldurmadan submit butonuna tıklayarak devam edelim. Böylelikle giriş yaparken direk github bilgilerinizi kullanarak sizi yetkilendirecek ve sisteme github hesabınız olmadan kimse giremeyecek.

Artık kurulum başarılı ile tamamlanmış olup kendi CI/CD süreçlerinizi yönetebileceğiniz self-hosted bir platformunuz oldu. Bir sonraki yazımda görüşmek üzere…

Paylaş: