Jenkins ile Git Kullanarak Deployment

Şöyle bir deployment akışımız olduğunu varsayalım:

  • Local ortamda projeyi ‘develop‘ branch’ında geliştiriyoruz.
  • Production’a bir release çıkmak istendiğinde develop branch’ını ‘master‘ branch’ı ile merge edip Github’a push’luyoruz.
  • Github’a güncelleme geldiğinde Jenkins tetikleniyor.
  • Jenkins build task’ini çalıştırıyor.
  • Eğer build başarılıysa Jenkins, görevi pruduction kodunu güncellemek olan başka bir işi çalıştırıyor.

(Bonus: A successful Git branching model)

Önceki yazıda Github tarafından Jenkins’in nasıl tetikleneceği mevcut.

Şimdi deployment işlemi için Jenkins üzerinde yeni bir job tanımlıyoruz. ‘Build Triggers’ sekmesi altından da ‘Build after other projects are built‘ seçeneğini seçip hangi job’dan sonra bu task’in çalışacağını belirtiyoruz.

build-triggers

‘Build’ sekmesi altından ‘Add build step’ butonuna tıklayarak ‘Execute shell‘ i seçiyoruz. Buraya mevcut production dosyalarını güncelleyecek kodu yazıyoruz:

build

Yukarıdaki koda dikkat ederseniz pull işlemini www-data kullanıcı ile çalıştırdık. Bunun nedeni, production dosyaları www-data kullanıcına ait olma, bu sayede dosya/dizin oluşturma gibi işlemlerde izin sıkıntısı çıkmayacaktır.

O yüzden yukarıdaki adımlardan önce, ilk olarak /home/www/domain.com dizinine gidip www-data kullanıcısı ile projeyi sunucuya çekelim (www-data için ssh keygen oluşturulması ve bu public key’in Github’a tanımlanması gerekiyor):

sudo -u www-data git clone git@github.com:organizasyon/repoadi.git public

Daha sonra jenkins kullanıcısına admin yetkisi verelim:

sudo adduser jenkins admin

ve jenkins kullanıcı tarafından çalıştırılan sudo komutlarında şifre sormayı kaldıralım:

sudo visudo

Bu dosyanın en alt satırına şunu ekleyelim:

jenkins ALL=(ALL) NOPASSWD: ALL

(Uyarı: jenkins kullanıcının remote ssh login’inin kapalı olduğundan emin olun.)

Şimdi bu deploy taks’inin düzgün çalışıp çalışmadığını kontrol edelim. Jenkins arayüzünden deploy task’ine girip ‘Build now‘ diyerek status’un yeşil ışık verdiğinden emin olalım. Eğer bir hata çıkarsa ‘Console Output‘ a girip hatayı tespit edebilirsiniz.