CI & CD Süreçleri (SSH ile Deployment) 🚀 | GitLab

Kürşat Şimşek
5 min readOct 23, 2024

--

GitLab, kod depolamanın ötesinde, sorun takibi, paket yönetimi ve CI/CD gibi özellikler sunan açık kaynaklı bir platformdur. Bu makalede, GitLab ile Docker image’i oluşturup, GitLab container kaydına yükleyerek ve SSH ile sunucuya dağıtarak sürekli dağıtım (CD) hattı kurmayı öğreneceğiz. Her kod gönderiminde bu süreç otomatik çalışacak.

gitlab ci cd
Image source: https://youtu.be/PCKDICEe10s

Ön Koşullar

Bu makaleyi tamamlamak için şunlara ihtiyacınız olacak:

  • Ubuntu yüklü bir sunucu ve sudo yetkilerine sahip bir kullanıcı.
  • Sunucuda Docker kurulmuş olmalı.
  • GitLab üzerinde bir kullanıcı hesabı ve etkin bir container kaydı.

GitLab Üzerinde Deployment Hattı Kurulumu

  1. GitLab Runner Kaydetme
  2. Deployer Kullanıcısı Oluşturma
  3. SSH Anahtarı Kurulumu
  4. SSH Anahtarını GitLab’da Saklama
  5. GitLab CI/CD Hattını Yapılandırma
  6. Deploymentı Doğrulama

GitLab Runner Kaydetme

Sunucunuzu GitLab runner olarak kaydedin ki deployment sırasında SSH ile giriş yapılabilsin. Private key’i GitLab CI/CD değişkeni olarak saklayarak sunucunuza güvenli erişim sağlayabilirsiniz. Kendi runner’ınızı kullanarak, anahtarın kontrolünüzde olmayan sistemlere gitmesini önleyin.

ssh sammy@your_server_IP

curl -L "<https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh>" | sudo bash

sudo apt-get install gitlab-runner

systemctl status gitlab-runner

Runner’ı kaydetmek için proje token’ını ve GitLab URL’sini almanız gerekiyor:

  1. GitLab projenizde Settings > CI/CD > Runners > Expand yolunu izleyin.
  2. Project runners bölümünde New project runner seçeneğine tıklayın ve projeniz için yeni bir runner oluşturmak için formu doldurun.
  3. Runner oluşturulduktan sonra kayıt token’ını ve GitLab URL’sini bulacaksınız. İkisini de bir metin editörüne kopyalayın; sonraki komut için bunlara ihtiyacınız olacak. Bunlar, https://your_gitlab.com ve project_token olarak anılacaktır.

Terminalinize dönün ve projeniz için runner’ı kaydedin:

sudo gitlab-runner register -n --url https://your_gitlab.com --registration-token project_token --executor docker --description "Deployment Runner" --docker-image "docker:stable" --tag-list deployment --docker-privileged

Bu komut, belirtilen URL ve token ile yeni bir runner kaydedecek ve “Deployment Runner” olarak adlandıracaktır.

Deployment Kullanıcısı Oluşturma

Deployment işlemleri için özel bir kullanıcı oluşturacaksınız. Daha sonra CI/CD hattını bu kullanıcı ile sunucuya giriş yapacak şekilde yapılandıracaksınız.

sudo adduser deployer

sudo usermod -aG docker deployer

SSH Anahtarı Kurulumu

Deployment kullanıcısı için bir SSH anahtarı oluşturacaksınız. GitLab CI/CD, bu anahtarı sunucuya giriş yapmak ve deployment işlemini gerçekleştirmek için kullanacaktır.

su deployer

ssh-keygen -t rsa

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

SSH Anahtarını GitLab’da Saklama

SSH private key’inizi GitLab CI/CD dosya değişkeni olarak saklayacaksınız, böylece pipeline bu anahtarı kullanarak sunucuya giriş yapabilir.

cat ~/.ssh/id_rsa

Çıktıyı kopyalayın. -----END RSA PRIVATE KEY----- satırından sonra bir satır sonu eklemeyi unutmayın.

GitLab projenizde Settings > CI / CD > Variables yolunu izleyin ve Add Variable butonuna tıklayın. Formu aşağıdaki şekilde doldurun:

  • Key: ID_RSA
  • Value: Panonuzdan SSH private key’inizi yapıştırın (sonunda bir satır sonu ile birlikte).
  • Type: File
  • Environment Scope: All (varsayılan)
  • Protect variable: Seçili
  • Mask variable: Seçili değil

Her CI/CD işi için runner üzerinde private key içeren bir dosya oluşturulacak ve bu dosyanın yolu $ID_RSA ortam değişkeninde saklanacaktır.

Sunucu IP adresinizi saklamak için başka bir değişken oluşturun. Add Variable butonuna tıklayın ve formu aşağıdaki gibi doldurun:

  • Key: SERVER_IP
  • Value: your_server_IP
  • Type: Variable
  • Environment Scope: All (varsayılan)
  • Protect variable: Seçili
  • Mask variable: Seçili

Son olarak, giriş kullanıcısını saklamak için bir değişken daha oluşturun. Add Variable butonuna tıklayın ve formu aşağıdaki gibi doldurun:

  • Key: SERVER_USER
  • Value: deployer
  • Type: Variable
  • Environment Scope: All (varsayılan)
  • Protect variable: Seçili
  • Mask variable: Seçili

Artık private key’i GitLab CI/CD değişkeni olarak sakladınız; bu, anahtarın pipeline çalışması sırasında kullanılabilir olmasını sağlar.

GitLab CI/CD Hattını Yapılandırma

GitLab CI/CD hattını yapılandıracaksınız. Bu hat, Docker image’i oluşturacak ve container kaydına yükleyecek. En son adım, sunucunuza giriş yapıp en güncel Docker image’ini çekmek, eski container’ı kaldırmak ve yeni bir container başlatmaktır.

.gitlab-ci.yml dosyasını oluşturmak için GitLab’da Proje genel görünüm sayfasına gidin, + butonuna tıklayın ve New file seçeneğini seçin. Dosya adını .gitlab-ci.yml olarak ayarlayın.

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 update && apk add openssh-client
- ssh -i $ID_RSA -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_IP "docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY"
- 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 container 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://your_server_IP
only:
- master
  • CI_REGISTRY_IMAGE: Belirli bir projeye bağlı container kaydının URL’sini temsil eder. Bu URL, GitLab örneğine bağlıdır. Örneğin, gitlab.com projeleri için kayıt URL’leri şu deseni takip eder: registry.gitlab.com/your_user/your_project. Ancak GitLab bu değişkeni sağladığı için tam URL'yi bilmenize gerek yoktur.
  • CI_COMMIT_REF_NAME: Projenin oluşturulduğu dal veya etiket adıdır.
  • CI_COMMIT_SHORT_SHA: Projenin oluşturulduğu commit’in ilk sekiz karakteridir.
  • TAG_LATEST: Image’in en son etiketini ekler. Bu, her zaman en son sürümü temsil eden bir etiket sağlamak için yaygın bir stratejidir. Her deployment’da, en son image container kaydında yeni oluşturulan Docker image ile güncellenecektir.
  • TAG_COMMIT: Dağıtılan commit’in SHA’sının ilk sekiz karakterini image etiketi olarak kullanır, böylece her commit için benzersiz bir Docker image’i oluşturur. Bu, Docker imagelerinin geçmişini Git commit’lerine kadar takip etmenizi sağlar. Sürekli deployment yaparken bu, hatalı bir dağıtım durumunda kodun daha eski bir sürümünü hızlıca dağıtmanıza olanak tanır.

Deployment’ı Doğrulama

Artık deployment’ı GitLab’da, sunucunuzda ve bir tarayıcıda doğrulayacaksınız.

Bir .gitlab-ci.yml dosyası repoya yüklendiğinde, GitLab bunu otomatik olarak algılar ve bir CI/CD pipeline’ı başlatır. .gitlab-ci.yml dosyasını oluşturduğunuzda, GitLab ilk pipeline’ı başlatmış oldu.

GitLab projenizde Build > Pipelines bölümüne giderek pipeline’ın durumunu görebilirsiniz. Eğer işler hala çalışıyorsa/bekliyorsa, tamamlanmasını bekleyin. Başarıyla tamamlanan publish ve deploy işlerini gösteren iki yeşil onay işareti ile birlikte Passed pipeline göreceksiniz.

Sonuç

Böylelikle, GitLab CI/CD ile bir sürekli dağıtım (CD) pipeline’ı yapılandırdınız. Bir proje oluşturdunuz. Ardından .gitlab-ci.yml dosyasını şu şekilde yapılandırdınız:

  • Docker image’i oluşturmak.
  • Docker image’ini container kaydına yüklemek.
  • Sunucuya giriş yapmak, en son image’i çekmek, mevcut container’ı durdurmak ve yeni bir container başlatmak.

Artık GitLab, her repository güncellemesinde web sayfanızı sunucunuza dağıtacaktır.

Burada olduğunuz için teşekkür eder keyifli geliştirmeler dilerim. 😇

Kaynakça

how-to-set-up-a-continuous-deployment-pipeline-with-gitlab-on-ubuntu

--

--

Kürşat Şimşek
Kürşat Şimşek

No responses yet