GitLab CI/CD && Kubernetes Üzerine Uygulamaları

halil bozan
5 min readOct 6, 2019

Merhabalar bugün Gitlab üzerinde CI/CD süreçlerini bir pipeline mekanizması ile nasıl otomatize edilmiş bir biçimde development yapabiliceğimiz hakkında konuşacağız.

Öncelikler CI/CD süreçlerinden bahsedecek olursak ;

Continuous Integration(Sürekli Entegrasyon) ve Continuous Delivery (Sürekli Teslimat) geliştirilen yazılımımızın bazı süreçlerden geçmesi anlamına gelmektedir. Yani geliştirilen yazılımın derlenmesi, test aşamaları, versiyonlanması, deploy edilmesi gibi süreçlerden geçerek tıpkı bir yaşam döngüsünü tamamlanması ve bunun sürekliliği ile ilgilidir.

Pipeline ?

Pipeline ile devam edelim. Pipeline geliştirdiğimiz yazılımın bu döngüden daha hatasız daha kolay ve otomatize edilmiş bir şekilde geçmesi için uygulanan bir yöntem diye nitelendirebiliriz. Bir tuşa basarak bu döngüyü sağlayabiliriz.

GitLab Pipeline ?

Bahsettiğimiz pipeline yönteminin birçok sağlayıcısı olduğu gibi GitLab da versiyon kontrol sistemi olmasının yanında bu hizmetide kullanıcılarına sunmaktadır.

GitLab Pipeline CI/CD süreçlerini gitlab-runner adı verilen bir araçla sağlamaktadır. GitLab Runner kendi localinizde, herhangi fiziksel server vaya cloud üzerinde ve bir kubernetes cluster üzerinde bu hizmeti kullanabilirsiniz. Ayrıca Gitlab kendiside shared runnerlar kullanmanıza olanak sağlamaktadır.Gitlabın CI/CD yönetimi ile yazımıza devam edip ilk olarak Gitlab Runnerların çalışma şekli ve akabinde pipeline döngüsünden bahsedeceğiz.

GitLab Runner ?

GitLab runner gitlab üzerinde pipeline yönetebilmek için kullanılması gerekli bir araçtır. GitLab ile iletişimi GitLab API üzerinden yapar ve böylece pipeline üzerinde yapılacak bütün işlemleri runnerlara iletmiş oluyor.

GitLab Runner ve Pipeline işleyiş süreci

Gelen commit runnerlar ve gitlabın iletişimi ile çeşitli süreçlere göre bir pipeline gerçekleştirmemize olanak sağlar.

Runnerlarımız ayakta şimdi bir pipeline yaratmalıyız;

Gitlab üzerinde pipeline oluşturmak için yaml formatında bir dosya oluşturmalıyız.Bu dosya gitlab pipeline ayarlarında .gitlab-ci.yml olarak tanımlıdır ve isteğe göre değiştirilebilir.Bu dosyada runnerın pipelinemızı hangi işletim sisteminde çalıştıracağı ve pipelinemızı çeşitli ortamlara (staging, dev, test, prod vb.) bölebiliriz.

DEMO

Teknik anlamdaki bilgimizi edindik şimdi bir örnek yapalım ve daha iyi anlayalım 😉 👇

Öncelikle bir runnera ihtiyacımız var. Bu örnek için runnerları kubernetes üzerinde host edeceğiz.

GitLab Admin Service Account

Yukarıda gitlab, kubernetes üzerindeki service tokenlarını kullanarak kubernetes cluster ile arasında bir kimlik doğrulama sağlamış olur. Bu doğrulamadan sonra clusterımızı gitlab üzerinde operations/kubernetes sekmesi altına var olan clusterımız eklemeliyiz

Clusterımızı eklememiz için gerekli olan bilgilerimizi;

  • CLUSTER NAME;

kubectl cluster-info

  • API URL; (kubernetes API’ye erişmek için gereken url)

kubectl cluster-info | grep ‘Kubernetes master’ | awk ‘/http/ {print $NF}’

  • CA Certificate; (kubernetes clustera erişmek için gereken kubernetes certificate)

kubectl get secret <default-secret-name> -o jsonpath=”{[‘data’][‘ca\.crt’]}” | base64 — decode

  • Service Token;(gitlab admin service account token)

kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep gitlab-admin | awk ‘{print $1}’)

gerekli yerleri cluster üzerinde bu komutları çalıştırarak karşılıklarını bulabilirsiniz.

Clusterımızı ekledikten sonra helm charts üzerinden gitlab-runnerı clusterımıza kurabiliriz.

helm chartda values.yaml üzerinde registration token ve gitlab url parametrelerini girerek aşağıdaki komutu çalıştırabiliriz.

helm install — namespace “gitlab-runner” — name “gitlab-runner” -f values.yml gitlab/gitlab-runner

Gitlab runner podumuz running durumada iken uygulamamız için kuracağımız pipelinedaki bütün joblar bu gitlab-runner podu üzerinde çalışacaktır.

Şimdi bir python uygulamasının CI/CD süreçlerini gösteren bir örnek yapacağız. Developerlarımız uygulamamızı çalışır hala getirdi ve bundan sonraki süreç içerisinde kolay ve hatasız deploylar için sıra bize geldi.

İlk olarak gitlab üzerinde bir pipeline koşulabilmesi için ihtiyacımız olan .gitlab-ci.yml dosyası , bu dosyada pipeline stageler, joblar ve pipeline için çeşitli kuralları burada belirtebiliriz.

image: kloiadocker/docker-compose:v1 services:  
- docker:dind
stages:
- prepare
- install
- push
- deploy
before_script:
- export DOCKER_HOST=127.0.0.1:2375
- apk add --no-cache make bash
- mkdir -p ~/.aws /root/.aws
- echo -e "[<profile-name>]\nregion=eu-central-1" > ~/.aws/credentials
- export COMMIT_TIME=$(git show -s --format=%ct $CI_COMMIT_SHA)
- eval $(aws ecr get-login --profile=<profile-name> --no-include-email)
- export CI_REGISTRY_IMAGE="<account-id>.dkr.ecr.eu-central-1.amazonaws.com/deneme"
prepare:
stage: prepare
script:
- docker-compose stop
- docker-compose rm -v
tags:
- run
install:
stage: install
script:
- docker build -t deneme .
- docker tag deneme <account-id>.dkr.ecr.eu-central-1.amazonaws.com/deneme:<tag>
tags:
- run
push:
stage: push
script:
- docker push <account-id>.dkr.ecr.eu-central-1.amazonaws.com/deneme:<tag>
allow_failure: true
tags:
- run
deploy:
stage: deploy
script:
- docker-compose up only:
- master tags:
- run when: manual
tags:
- run
push:
stage: push
script:
- docker push <account-id>.dkr.ecr.eu-central-1.amazonaws.com/deneme:<tag>

tags:
- run
deploy:
stage: deploy
script:
- docker-compose up only:
- master tags:
- run when: manual

Yukarıdaki .gitlab-ci.yaml üzerinde bir docker compose ile python app deploy edeceğiz. Bu pipeline üzerinde dind(docker in docker) mantığı ile kloiadocker/docker-compose imajı üzerinde kendi uygulamamızı deploy edeceğiz. Burada gerçekleştireceğimiz pipeline 4 aşamadan(stages) oluşuyor;

  • Prepare
  • Install
  • Push
  • Deploy

Pipeline üzerinde gerçekleştireceğimiz aşamalar hakkında biraz konuşalım. Öncelelikle before_script tüm aşamalar için gerekli olacak bağımlılıkların tanımlandığı kısımdır. Prepare aşaması ile var olan composeları durdurup siliyoruz. Bunu daha sonra yapacağımız deployment tarafında herhangi bir çakışma locklanma yaşamamak için yapıyoruz. Install aşamasında build ve imajın taglanması işlemlerini gerçekleştiriyoruz. Push ve Deploy işlemlerinde imajın before_script tarafında login olunan repoya pushluyoruz ve daha sonra deployment işlemini gerçekleştiriyoruz.

GitLab sunduğu arayüzde bize pipelineları takip edebileceğimiz bir ortam sunmaktadır.Ayrıntı olarak .gitlab-ci.yaml 'da verdiğimiz allow_failure parametresi ile Push aşamasının başarısız olması halinde bile pipelinenın sürdürülebilir olmasını sağlamaktadır. Deploy aşamasında verdiğimiz when:manual parametresi ile deployment’ın manual olarak yapılmasını sağlamaktadır. Pipeline tarafında daha bir çok parametrelerle çeşitli işler yapabiliriz.

SONUÇ

Sonuç olarak var olan uygulamalarımız bir çok aşamadan geçmektedir ve bu aşamaların insan gücü ile manual bir şekilde yapılması bir çok hatalar ve paralel olarak çözümleri için harcanan vakiteleride beraberinde getirmektedir. Bu sebeple bu tür aşamaların otomatize edilmiş bir şekilde gerçekleştirilmesi hataların azalmasından ve zamandan ciddi oranda iyileşme sağlamaktadır. Son olarak artık gitlab üzerinde bulunan uygulamamızın CI/CD süreçlerini atılan her comitte tetiklenecek ve otomatize edilecek şekilde yönetebilmekteyiz.

Kaynakça

--

--