Otomatik Dağıtımı CircleCI ve GitHub ile Ubuntu 18.04 Üzerinde Gerçekleştirme
Giriş
Günümüz yazılım geliştirme dünyasında hız, güvenilirlik ve verimlilik, rekabet avantajı sağlamanın temel taşları haline gelmiştir. Sürekli Entegrasyon (CI) ve Sürekli Dağıtım (CD) pratikleri, bu hedeflere ulaşmak için vazgeçilmez araçlardır. CI/CD, yazılım geliştirme sürecini otomatikleştirerek kod değişikliklerinin daha hızlı, daha güvenli ve daha tutarlı bir şekilde test edilmesini ve canlı ortamlara dağıtılmasını sağlar. Bu makalede, popüler bir CI/CD platformu olan CircleCI’ı kullanarak GitHub’daki bir projeyi Ubuntu 18.04 sunucusu üzerine otomatik olarak nasıl dağıtabileceğinizi adım adım inceleyeceğiz.
Neden CircleCI ve GitHub? GitHub, dünya genelinde milyonlarca geliştirici tarafından kullanılan, açık kaynak ve özel projeler için lider bir sürüm kontrol sistemidir. Proje yönetimini ve işbirliğini kolaylaştıran güçlü özelliklere sahiptir. CircleCI ise, GitHub ile sorunsuz bir şekilde entegre olan, esnek ve güçlü bir CI/CD platformudur. Bulut tabanlı yapısı sayesinde altyapı yönetimi derdini ortadan kaldırır ve geliştiricilerin sadece kod yazmaya odaklanmasını sağlar.
Ubuntu 18.04, uzun süreli destek (LTS) sunan, kararlı ve yaygın olarak kullanılan bir Linux dağıtımıdır. Sunucu ortamlarında sıklıkla tercih edilmesi, bu makale için ideal bir dağıtım hedefi olmasını sağlamıştır. Her ne kadar Ubuntu 18.04’ün resmi desteği sona ermiş olsa da, birçok sistemde hala kullanılmakta olup, bu rehberdeki temel prensipler daha yeni Ubuntu sürümleri için de geçerli olacaktır.
Bu makalenin amacı, bir geliştiricinin veya DevOps mühendisinin, kodunu GitHub’a gönderdiğinde otomatik olarak bir Ubuntu sunucusuna dağıtım yapmasını sağlayacak eksiksiz bir CI/CD hattı kurmasına yardımcı olmaktır. Konunun karmaşıklığını basitleştirmek adına, adım adım bir rehber sunulacak ve her aşama detaylı bir şekilde açıklanacaktır.
Ön Koşullar
Bu rehberi takip edebilmek için aşağıdaki ön koşulların yerine getirilmiş olması gerekmektedir:
* GitHub Hesabı: Proje kodunuzu barındırmak için bir GitHub hesabınız olmalı ve bu hesaba erişiminiz bulunmalıdır.
* CircleCI Hesabı: GitHub hesabınızla ilişkilendirilmiş bir CircleCI hesabınız olmalıdır. CircleCI’a GitHub hesabınızla kaydolmak oldukça kolaydır.
* Ubuntu 18.04 Sunucusu: Dağıtım hedefi olarak kullanacağınız, internete açık bir Ubuntu 18.04 sunucunuz olmalıdır. Bu bir VPS (Virtual Private Server), bulut sunucusu (AWS EC2, Google Cloud Compute Engine, Azure VM vb.) veya kendi fiziksel sunucunuz olabilir. Sunucuya SSH erişiminizin olduğundan emin olun.
* SSH Anahtar Çifti: Sunucuya güvenli bir şekilde bağlanmak ve CircleCI’ın sunucuya erişimini sağlamak için bir SSH anahtar çifti (genellikle id_rsa ve id_rsa.pub) oluşturmuş olmanız ve genel anahtarınızı (id_rsa.pub) Ubuntu sunucunuzdaki yetkili kullanıcının .ssh/authorized_keys dosyasına eklemiş olmanız gerekmektedir.
* Temel Git Bilgisi: Git komutlarını (clone, add, commit, push) kullanma konusunda temel bilgiye sahip olmanız beklenmektedir.
* Temel Linux Komut Bilgisi: Ubuntu sunucusu üzerinde temel Linux komutlarını (cd, ls, mkdir, apt, systemctl vb.) kullanma becerisine sahip olmanız gerekmektedir.
* Örnek Uygulama: Dağıtımını yapacağımız basit bir web uygulaması (örneğin, Node.js, Python Flask veya PHP) hazır olmalıdır. Bu makalede Node.js tabanlı basit bir uygulama üzerinden ilerleyeceğiz.
Proje Yapısı ve GitHub Hazırlığı
Otomatik dağıtım sürecini başlatmadan önce, dağıtılacak bir projemizin ve bunun bir GitHub deposunda bulunması gerekmektedir.
Örnek Proje Oluşturma
Basit bir Node.js uygulaması oluşturalım. Proje dizininde app.js ve package.json dosyaları bulunacaktır.
package.json:
{
"name": "my-node-app",
"version": "1.0.0",
"description": "A simple Node.js app for CircleCI deployment",
"main": "app.js",
"scripts": {
"start": "node app.js",
"test": "echo \"No tests specified\" && exit 0"
},
"dependencies": {
"express": "^4.17.1"
},
"author": "",
"license": "ISC"
}
app.js:
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send('Merhaba Dünya! Bu CircleCI ile dağıtılan bir Node.js uygulamasıdır.');
});
app.listen(port, () => {
console.log(Uygulama http://localhost:${port} adresinde çalışıyor.);
});
Bu basit uygulama, express kütüphanesini kullanarak 3000 portunda “Merhaba Dünya!” mesajını döndüren bir web sunucusu başlatır.
GitHub Deposu Oluşturma
1. GitHub hesabınıza giriş yapın.
2. Yeni bir depo (repository) oluşturun (örneğin, circleci-deploy-demo).
3. Depoyu yerel bilgisayarınıza klonlayın:
git clone https://github.com/KULLANICI_ADINIZ/circleci-deploy-demo.git
cd circleci-deploy-demo
4. Oluşturduğunuz app.js ve package.json dosyalarını bu dizine kopyalayın.
5. Değişiklikleri commit edin ve GitHub’a gönderin:
git add .
git commit -m "Initial commit: Add simple Node.js app"
git push origin main
CircleCI ile Entegrasyon
Projemiz GitHub’da olduğuna göre, şimdi CircleCI’ı bu depoya bağlayabiliriz.
1. CircleCI’a Giriş Yapın: CircleCI web sitesine gidin ve GitHub hesabınızla giriş yapın.
2. Projenizi Ekleyin: CircleCI kontrol panelinde sol taraftaki menüden “Projects” (Projeler) seçeneğine tıklayın. GitHub depolarınızın bir listesini göreceksiniz. circleci-deploy-demo deponuzu bulun ve “Set Up Project” (Projeyi Kur) düğmesine tıklayın.
3. Yapılandırma Dosyası: CircleCI, projenizi kurmak için size bir config.yml dosyası oluşturmanızı önerecektir. “Fastest” (En Hızlı) veya “Hello World” şablonlarından birini seçebilir veya boş bir dosya ile başlayabilirsiniz. Şimdilik, “Hello World” seçeneğini seçip “Add config.yml” (config.yml ekle) düğmesine tıklayabiliriz. Bu, CircleCI’ın deponuzda .circleci/config.yml adında bir dosya oluşturmasını sağlayacaktır. Bu dosyayı daha sonra kendi gereksinimlerimize göre düzenleyeceğiz.
Dağıtım Hedefi Hazırlığı: Ubuntu 18.04 Sunucusu
Uygulamamızın dağıtılacağı Ubuntu 18.04 sunucusunu hazırlamamız gerekiyor.
1. Sunucuya SSH ile Bağlanın:
ssh KULLANICI_ADINIZ@SUNUCU_IP_ADRESINIZ
KULLANICI_ADINIZ ve SUNUCU_IP_ADRESINIZ değerlerini kendi sunucu bilgilerinizle değiştirin.
2. Gerekli Yazılımların Kurulumu: Node.js uygulamamızı çalıştırmak için Node.js ve npm’e ihtiyacımız var. Uygulamayı sürekli çalışır durumda tutmak için PM2’yi kullanacağız.
sudo apt update
sudo apt upgrade -y
# Node.js ve npm kurulumu (NodeSource deposu önerilir)
curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
sudo apt-get install -y nodejs
# PM2 kurulumu
sudo npm install -g pm2
(Not: Ubuntu 18.04 için Node.js 14.x veya daha yüksek bir sürüm önerilir. setup_14.x yerine güncel LTS sürümünü de kullanabilirsiniz.)
3. Güvenlik Önlemleri:
* UFW (Basit Güvenlik Duvarı): Sadece gerekli portlara erişime izin verin.
sudo ufw allow OpenSSH
sudo ufw allow 3000/tcp # Uygulamanızın çalıştığı port
# Eğer Nginx kuracaksanız: sudo ufw allow 'Nginx HTTP'
sudo ufw enable
sudo ufw status
* SSH Anahtar Tabanlı Kimlik Doğrulama: Şifre ile giriş yerine SSH anahtarları kullanmak daha güvenlidir. Bu adımı zaten “Ön Koşullar” bölümünde tamamlamış olmalısınız.
4. Dağıtım Klasörü Oluşturma ve İzinleri Ayarlama:
Uygulamanızın sunucuda konuşlanacağı bir dizin oluşturun. Bu dizinin doğru izinlere sahip olması önemlidir.
sudo mkdir -p /var/www/my-node-app
sudo chown -R KULLANICI_ADINIZ:KULLANICI_ADINIZ /var/www/my-node-app
KULLANICI_ADINIZ yerine SSH ile bağlandığınız kullanıcı adını yazın. CircleCI bu dizine kod dağıtımı yapacağı için, bu kullanıcının yazma iznine sahip olması gereklidir.
SSH Anahtarları ve Güvenli Değişkenler
CircleCI’ın Ubuntu sunucunuza erişebilmesi için SSH anahtarlarını doğru bir şekilde yapılandırmamız gerekiyor.
1. Yeni Bir SSH Anahtar Çifti Oluşturun:
Eğer CircleCI için özel bir SSH anahtar çifti oluşturmak isterseniz, yerel makinenizde aşağıdaki komutu çalıştırın (parola istemini boş bırakın):
ssh-keygen -t rsa -b 4096 -C "circleci-deployment-key" -f ~/.ssh/circleci_deploy_key
Bu, ~/.ssh/circleci_deploy_key (özel anahtar) ve ~/.ssh/circleci_deploy_key.pub (genel anahtar) dosyalarını oluşturacaktır.
2. Genel Anahtarı Ubuntu Sunucusuna Ekleyin:
circleci_deploy_key.pub dosyasının içeriğini Ubuntu sunucunuzdaki ~/.ssh/authorized_keys dosyasına ekleyin.
# Yerel makinenizde
cat ~/.ssh/circleci_deploy_key.pub
# Çıktıyı kopyalayın. Sonra Ubuntu sunucunuzda
ssh KULLANICI_ADINIZ@SUNUCU_IP_ADRESINIZ 'echo "KOPYALADIGINIZ_GENEL_ANAHTAR_METNI" >> ~/.ssh/authorized_keys'
Bu, CircleCI’ın bu anahtar ile sunucunuza bağlanmasına izin verecektir.
3. Özel Anahtarı CircleCI’a Ekleme:
* CircleCI kontrol panelinde projenizin ayarlarına gidin (“Project Settings”).
* Sol menüden “SSH Keys” (SSH Anahtarları) seçeneğine tıklayın.
* “Add SSH Key” (SSH Anahtarı Ekle) düğmesine tıklayın.
* Hostname: Sunucunuzun IP adresini veya alan adını girin (örneğin, SUNUCU_IP_ADRESINIZ).
* Private Key: ~/.ssh/circleci_deploy_key dosyasının içeriğini buraya yapıştırın. Bu, CircleCI’ın sunucunuza bağlanmak için kullanacağı özel anahtardır.
* “Add SSH Key” düğmesine tıklayın. CircleCI bu anahtarı güvenli bir şekilde saklayacak ve dağıtım sırasında kullanacaktır.
4. Ortam Değişkenleri Oluşturma:
Hassas bilgileri (SUNUCU_IP_ADRESINIZ, KULLANICI_ADINIZ) config.yml dosyasına doğrudan yazmak yerine, CircleCI ortam değişkenlerini kullanmak daha güvenlidir.
* CircleCI kontrol panelinde projenizin ayarlarına gidin (“Project Settings”).
* Sol menüden “Environment Variables” (Ortam Değişkenleri) seçeneğine tıklayın.
* Aşağıdaki değişkenleri ekleyin:
* SSH_USER: Ubuntu sunucusuna bağlanmak için kullanacağınız kullanıcı adı (örneğin, ubuntu veya your_username).
* SSH_HOST: Ubuntu sunucusunun IP adresi veya alan adı (örneğin, 192.168.1.100 veya example.com).
Bu adımlarla CircleCI, SSH anahtarını ve sunucu bağlantı bilgilerini kullanarak sunucunuza güvenli bir şekilde erişebilecektir.
CircleCI Yapılandırma Dosyası (config.yml) Detayları
Şimdi, dağıtım sürecini otomatikleştirecek olan .circleci/config.yml dosyasını oluşturalım veya düzenleyelim. Bu dosya, CircleCI’a projenizi nasıl derlemesi, test etmesi ve dağıtması gerektiğini anlatır.
Projenizin kök dizininde .circleci/config.yml adında bir dosya oluşturun ve aşağıdaki içeriği ekleyin:
# CircleCI yapılandırma dosyasının sürümünü belirtir.
version: 2.1
Orbs, CircleCI'da tekrarlayan yapılandırma kodlarını paketlemek için kullanılır.
Bu örnekte kullanmasak da, bilmek önemlidir.
orbs:
node: circleci/node@4.1.0
İş tanımları
jobs:
build:
# Bu işin çalışacağı ortamı tanımlar.
# Docker imajı olarak Ubuntu tabanlı bir Node.js ortamı kullanıyoruz.
docker:
- image: cimg/node:14.17.0 # Node.js 14 LTS sürümü
# Çalışma dizini
working_directory: ~/repo
# Adımlar
steps:
- checkout # GitHub deposundaki kodu çalışma dizinine klonlar.
- restore_cache: # Bağımlılıkları önbellekten geri yüklemeye çalışır.
keys:
- v1-dependencies-{{ checksum "package.json" }}
- v1-dependencies-
- run: npm install # package.json'daki bağımlılıkları yükler.
- save_cache: # Yüklenen bağımlılıkları önbelleğe kaydeder.
paths:
- node_modules
key: v1-dependencies-{{ checksum "package.json" }}
- run: npm test # Testleri çalıştırır. (Örnek uygulamamızda basit bir test var)
deploy:
docker:
- image: cimg/base:stable # Dağıtım için temel bir Linux imajı kullanıyoruz.
working_directory: ~/repo
steps:
- checkout # GitHub deposundaki kodu çalışma dizinine klonlar.
- add_ssh_keys: # CircleCI'da eklediğimiz SSH anahtarını çalışma ortamına ekler.
# Hostname değeri, CircleCI'daki SSH anahtarı ayarlarken girdiğimiz Hostname ile eşleşmeli.
# Bu genellikle sunucunun IP adresi veya alan adıdır.
# Bu adım, anahtarın SSH agent'a eklenmesini sağlar.
fingerprints:
- "xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx" # Kendi SSH anahtarınızın fingerprint'ini buraya ekleyin.
# Bunu CircleCI proje ayarlarında "SSH Keys" bölümünden bulabilirsiniz.
- run:
name: Dağıtım Yap
command: |
# SSH ile sunucuya bağlan ve komutları çalıştır.
# Ortam değişkenleri SSH_USER ve SSH_HOST kullanılır.
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null $SSH_USER@$SSH_HOST << EOF
# Sunucudaki uygulama dizinine git.
cd /var/www/my-node-app
# Eğer Git deposu daha önce klonlanmadıysa, klonla.
if [ ! -d .git ]; then
git clone https://github.com/KULLANICI_ADINIZ/circleci-deploy-demo.git .
fi
# En son kodu çek.
git pull origin main
# Bağımlılıkları yeniden yükle (eğer değiştiyse).
npm install --production
# PM2 ile uygulamayı yeniden başlat veya başlat.
# Eğer uygulama daha önce başlatılmadıysa, 'pm2 start' ile başlat.
# Eğer zaten çalışıyorsa, 'pm2 restart' ile yeniden başlat.
pm2 describe my-node-app > /dev/null
RUNNING=$?
if [ "$RUNNING" -ne 0 ]; then
pm2 start app.js --name my-node-app
else
pm2 restart my-node-app
fi
# PM2'nin sistem başlangıcında başlamasını sağla (bir kerelik kurulum).
pm2 startup systemd
pm2 save
EOF
İş akışları (Workflows)
Birden fazla işi belirli bir sırada veya koşullara göre çalıştırmak için kullanılır.
workflows:
build_and_deploy:
jobs:
- build # Önce 'build' işini çalıştır.
- deploy: # 'build' işi başarıyla tamamlandıktan sonra 'deploy' işini çalıştır.
requires:
- build
filters: # Sadece 'main' dalına yapılan push'larda dağıtım yap.
branches:
only: main
config.yml Açıklaması:
* version: 2.1: CircleCI yapılandırma dosyasının sürümünü belirtir. En son özellikler için 2.1 kullanılması önerilir.
* jobs: Yapılacak işleri tanımlar. Burada iki ana işimiz var: build ve deploy.
* build işi:
* docker: Bu işin çalışacağı Docker imajını belirtir. cimg/node:14.17.0 imajı, Node.js ve npm’i kurulu olarak gelir.
* working_directory: İşin çalışacağı dizini ayarlar.
* steps: İşin adımlarını tanımlar.
* checkout: GitHub deposundaki kodu CircleCI çalışma ortamına klonlar.
* restore_cache: Daha önce kaydedilmiş npm bağımlılıklarını önbellekten geri yüklemeye çalışır. Bu, npm install süresini kısaltır.
* run: npm install: Projenin bağımlılıklarını yükler.
* save_cache: Yüklenen bağımlılıkları bir sonraki çalıştırmalar için önbelleğe kaydeder.
* run: npm test: Projenin testlerini çalıştırır. Eğer testler başarısız olursa, pipeline durur.
* deploy işi:
* docker: Dağıtım için temel bir Linux imajı (cimg/base:stable) yeterlidir, çünkü Node.js sunucuda kurulu olacak.
* working_directory: Aynı şekilde ~/repo olarak ayarlanır.
* steps:
* checkout: Dağıtım işi de projenin koduna ihtiyaç duyduğundan tekrar klonlar.
* add_ssh_keys: CircleCI arayüzünden eklediğimiz SSH özel anahtarını çalışma ortamına ekler. fingerprints alanına kendi SSH anahtarınızın parmak izini eklemeyi unutmayın. Bu, CircleCI’ın sunucunuza bağlanmasına izin verir.
* run: name: Dağıtım Yap: Bu adım, asıl dağıtım mantığını içerir.
* ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null $SSH_USER@$SSH_HOST: SSH ile uzaktaki sunucuya bağlanır. $SSH_USER ve $SSH_HOST daha önce CircleCI’da tanımladığımız ortam değişkenleridir. -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null seçenekleri, SSH bağlantısı sırasında anahtar kontrolü istemini atlamak içindir; bu, otomatik süreçlerde yaygın bir kullanımdır ancak dikkatli olunmalıdır.
* << EOF ... EOF: SSH bağlantısı üzerinden uzaktaki sunucuda çalıştırılacak komutları içerir.
* cd /var/www/my-node-app: Uygulama dizinine geçiş yapar.
* if [ ! -d .git ]; then ... fi: Eğer dizinde bir Git deposu yoksa (ilk dağıtım), depoyu klonlar.
* git pull origin main: Depodaki en son kodu çeker.
* npm install --production: Üretim bağımlılıklarını yeniden yükler.
* pm2 describe my-node-app > /dev/null; RUNNING=$?: PM2 ile uygulamanın çalışıp çalışmadığını kontrol eder.
* if [ "$RUNNING" -ne 0 ]; then ... else ... fi: Uygulama çalışmıyorsa başlatır, çalışıyorsa yeniden başlatır.
* pm2 startup systemd ve pm2 save: PM2'nin sunucu yeniden başladığında uygulamayı otomatik olarak başlatmasını sağlar (sadece bir kerelik kurulum için).
* workflows: İş akışlarını tanımlar.
* build_and_deploy: Bu iş akışı, build ve deploy işlerini sırayla çalıştırır.
* jobs: İş akışına dahil edilecek işleri listeler.
* - build: Önce build işini çalıştır.
* - deploy: build işi başarıyla tamamlandıktan sonra deploy işini çalıştır (requires: - build).
* filters: branches: only: main: Dağıtım işini sadece main (veya master) dalına yapılan commit'lerde çalıştırır. Bu, geliştirme dallarına yapılan commit'lerin otomatik olarak canlıya dağıtılmasını engeller.
Bu config.yml dosyasını projenizin .circleci/ dizinine kaydedin ve GitHub'a gönderin:
git add .circleci/config.yml
git commit -m "Add CircleCI config for build and deploy"
git push origin main
Bu push işleminden sonra CircleCI otomatik olarak bir pipeline başlatacak ve adımları takip edecektir.
Uygulamanın Dağıtılması ve Çalıştırılması
config.yml dosyasını GitHub'a gönderdiğinizde, CircleCI pipeline'ı tetiklenecek ve build ile deploy işlerini sırasıyla çalıştıracaktır.
1. CircleCI Kontrol Panelini İzleyin: CircleCI kontrol panelinde projenizin pipeline'ını izleyin. build ve deploy işlerinin başarıyla tamamlandığını görmelisiniz. Herhangi bir adımda bir hata oluşursa, logları inceleyerek sorunu tespit edebilirsiniz.
2. Uygulamayı Kontrol Edin: Dağıtım başarılı olduktan sonra, tarayıcınızdan Ubuntu sunucunuzun IP adresini ve uygulamanızın portunu (örneğin, http://SUNUCU_IP_ADRESINIZ:3000) ziyaret ederek uygulamanızın çalıştığını doğrulayın. "Merhaba Dünya! Bu CircleCI ile dağıtılan bir Node.js uygulamasıdır." mesajını görmelisiniz.
3. PM2 Durumunu Kontrol Edin: Sunucunuza SSH ile bağlanarak PM2'nin uygulamanızı yönetip yönetmediğini kontrol edebilirsiniz:
ssh KULLANICI_ADINIZ@SUNUCU_IP_ADRESINIZ
pm2 list
my-node-app uygulamasının online durumda olduğunu görmelisiniz.
Nginx ile Reverse Proxy Yapılandırması (Önerilir)
Doğrudan port 3000 üzerinden erişim yerine, Nginx gibi bir reverse proxy kullanarak uygulamayı standart HTTP/HTTPS portları (80/443) üzerinden yayınlamak daha iyi bir uygulamadır. Bu ayrıca SSL/TLS sertifikaları eklemenize de olanak tanır.
1. Nginx Kurulumu:
sudo apt install nginx -y
sudo ufw allow 'Nginx HTTP' # Eğer HTTPS kullanacaksanız 'Nginx HTTPS' de ekleyin
2. Nginx Yapılandırması:
Yeni bir Nginx yapılandırma dosyası oluşturun:
sudo nano /etc/nginx/sites-available/my-node-app
İçeriği aşağıdaki gibi düzenleyin (alan adınızı veya IP adresinizi kullanın):
server {
listen 80;
listen [::]:80;
server_name SUNUCU_IP_ADRESINIZ; # Veya alan adınız (örneğin, example.com)
location / {
proxy_pass http://localhost:3000; # Uygulamanızın çalıştığı port
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
3. Yapılandırmayı Etkinleştirme:
sudo ln -s /etc/nginx/sites-available/my-node-app /etc/nginx/sites-enabled/
sudo nginx -t # Yapılandırma dosyasını test et
sudo systemctl restart nginx
Artık uygulamanıza doğrudan sunucunuzun IP adresi üzerinden (port belirtmeden) erişebilirsiniz.
Test ve İzleme
CI/CD pipeline'ınızın sağlığını ve performansını sürekli olarak izlemek, sorunları erken tespit etmek ve çözümlemek için kritiktir.
* Otomatik Testler: npm test gibi otomatik testler, kod değişikliklerinin mevcut işlevselliği bozup bozmadığını kontrol etmenin ilk adımıdır. config.yml dosyanızda daha kapsamlı testler (birim testleri, entegrasyon testleri) eklemek, dağıtım öncesi güvenliği artıracaktır.
* CircleCI Arayüzü: CircleCI kontrol paneli, her bir pipeline'ın durumunu, her bir adımın ne kadar sürdüğünü ve varsa hata mesajlarını gösterir. Başarısız bir pipeline durumunda, hatanın hangi adımda meydana geldiğini ve nedenini anlamak için logları dikkatlice inceleyin.
* Sunucu Logları: Uygulama veya sunucu tarafında bir sorun olduğunda, Ubuntu sunucusundaki logları kontrol edin.
* Uygulama logları için PM2: pm2 logs my-node-app
* Nginx logları: /var/log/nginx/access.log ve /var/log/nginx/error.log
* Sistem logları: journalctl -u nginx veya journalctl -u pm2-KULLANICI_ADINIZ
Gelişmiş Konular ve En İyi Uygulamalar
Bu rehber, temel bir otomatik dağıtım pipeline'ı kurmayı ele alsa da, gerçek dünya senaryolarında dikkate alınması gereken daha gelişmiş konular vardır.
* Ortamlar Arası Dağıtım (Dev, Staging, Prod): Genellikle, bir uygulamayı doğrudan üretim ortamına dağıtmadan önce geliştirme (dev) ve hazırlık (staging) ortamlarında test etmek istenir. Bunu CircleCI'da farklı workflow'lar ve filters kullanarak veya farklı ortam değişkenleri ile farklı dağıtım hedeflerini hedefleyerek yapabilirsiniz. Örneğin, dev dalına yapılan push'lar dev ortamına, main dalına yapılan ve etiketlenmiş (tagged) commit'ler staging'e, manuel onay sonrası ise prod'a dağıtılabilir.
* Docker Kullanımı: Uygulamanızı Docker konteynerleri içinde çalıştırmak, bağımlılık sorunlarını ortadan kaldırır ve ortamlar arası tutarlılığı sağlar. CircleCI, Docker imajlarını oluşturma ve konteynerleri dağıtma konusunda güçlü destek sunar. Bu durumda, sunucunuzda Docker ve Docker Compose kurulu olmalı, CircleCI ise imajı oluşturup Docker Hub gibi bir kayıt defterine göndermeli, ardından sunucuda bu imajı çekip çalıştırmalıdır.
* Rollback Stratejileri: Dağıtım sonrası ciddi bir sorun yaşandığında, hızlı bir şekilde önceki çalışan sürüme geri dönebilmek (rollback) hayati önem taşır. PM2, uygulamaların farklı sürümlerini yönetme yeteneğine sahiptir, ancak daha gelişmiş rollback stratejileri için dağıtım araçları (örneğin, Capistrano) veya konteyner orkestrasyon sistemleri (Kubernetes) kullanılabilir.
* Bildirimler: Dağıtım pipeline'ının durumu hakkında anında bildirimler almak (başarılı/başarısız) önemlidir. CircleCI, Slack, e-posta veya diğer entegrasyonlar aracılığıyla bildirim gönderme yeteneğine sahiptir.
* Güvenlik İpuçları:
* CircleCI ortam değişkenlerini hassas bilgiler için kullanın.
* SSH anahtarlarınızı sadece gerekli izinlerle sınırlayın.
* Sunucunuzda güvenlik duvarını (UFW) doğru yapılandırın.
* Sunucunuzdaki işletim sistemini ve yazılımları düzenli olarak güncelleyin.
* Minimum ayrıcalık prensibini uygulayın; CircleCI'ın sunucuda sadece ihtiyacı olan işlemleri yapmasına izin verin.
* StrictHostKeyChecking=no kullanımından kaçınmak için ssh-keyscan ile known_hosts dosyasını yapılandırabilirsiniz, ancak bu otomatik dağıtımda ek karmaşıklık getirebilir.
Sonuç
Bu makalede, CircleCI ve GitHub kullanarak bir Node.js uygulamasını Ubuntu 18.04 sunucusu üzerine otomatik olarak nasıl dağıtacağınızı adım adım öğrendiniz. CI/CD pipeline'ı kurmak, yazılım geliştirme sürecinizi önemli ölçüde hızlandırır, hataları azaltır ve ekiplerin daha verimli çalışmasını sağlar.
Sürekli Entegrasyon ve Sürekli Dağıtım, modern DevOps pratiklerinin temelidir. CircleCI'ın esnek yapılandırma yetenekleri ve GitHub'ın güçlü sürüm kontrolü ile birleştiğinde, hızlı ve güvenilir dağıtımlar gerçekleştirmek artık çok daha kolaydır. Ubuntu gibi kararlı bir sunucu işletim sistemi ise, uygulamalarınız için sağlam bir temel sunar.
Kurduğunuz bu temel pipeline, başlangıç için harika bir adımdır. Uygulamanız büyüdükçe ve gereksinimleriniz değiştikçe, Docker, çoklu ortam dağıtımları, gelişmiş test stratejileri ve daha kapsamlı izleme araçları gibi daha gelişmiş konuları entegre ederek pipeline'ınızı sürekli iyileştirebilirsiniz. Unutmayın, CI/CD bir süreçtir ve sürekli öğrenme ve adaptasyon gerektirir. Bu rehberdeki prensipleri diğer programlama dilleri ve çerçeveleri için de kolayca uyarlayabilirsiniz. Başarılı dağıtımlar dileriz!