Şirkette bir müddet CI&CD süreçleri için Jenkins kullandıktan sonra altyapıyı tamamen Gitlab CI'a geçirdik. Kompleks olmayan stabil yapısı, third party pluginler ile uğraşmamak(her gün pluginlerde yaşanan güvenlik açıkları) ve job'ların Gitlab Runner ile düzgünce çalıştırılması bu değişiklikte tercih sebebimiz oldu.
Bu yazıda Golang projeleri için basit bir Gitlab CI&CD pipeline oluşturulmasını ve gitlab-ci.yml ile pipeline'ı nasıl kolayca yönetebileceğimizi ele alacağız. Bu Golang projesini nasıl Systemd servisi haline getirildiği varsayılacaktır. Not: Yapılacak işlemler için Golang 1.13.1, Debian 10.3 sürümü kullanılmış olup, en az 2 CPU core ve 4 GB RAM sistem gereksinimleri vardır.
Gitlab Üzerinde Repository Oluşturulması
Gitlab üzerinde aşağıdaki gibi Go ile yazılmış basit bir HTTP Server repo oluşturabiliriz.
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", HelloServer)
http.ListenAndServe(":8080", nil)
}
func HelloServer(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Merhaba Gitlab CI %s", r.URL.Path[1:])
}
.gitlab-ci.yml Dosyasının Oluşturulması
Oluşturduğumuz Go servisinin bulunduğu dizine Vim veya Nano gibi bir editör ile .gitlab-ci.yml dosyasını açıp aşağıdaki ifadeleri tanımlıyoruz.
stages:
- deploy-dev
variables:
GOPATH: /opt/projects
GOROOT: /usr/local/go
GIT_CLONE_PATH: $GOPATH/src/$CI_PROJECT_NAME
ARTIFACTS_DIR: $GOPATH/bin
deploy-dev:
stage: deploy-dev
image: golang:1.13.1
only:
- dev
tags:
- dev-app
before_script:
- export PATH=$GOPATH/bin:$GOROOT/bin:$PATH
script:
- echo "Dev machine"
- cd $GOPATH/src/$CI_PROJECT_NAME
- go get ./...
- go build -o $ARTIFACTS_DIR/$CI_PROJECT_NAME
artifacts:
paths:
- $ARTIFACTS_DIR
Buradaki tanımlamaları açıklayacak olursak;
stages
Job'lar tarafından kullanılan ve oluşturacağımız çoklu pipeline ları tag ler yardımıyla belirttiğimiz kısım. Burada verilen stage ler sırasıyla çalıştırılır ve eğer job'lardan biri fail olursa bir sonraki stage adımına geçilmez.
image
Gitlab Runner'ın ihtiyaç duyacağı hazır Golang araçlarının olduğu Docker image'nı belirtiyoruz.
Only
Deploy edilecek branch'i belirtiyoruz.
tags
Aşağıda bahsedeceğimiz Gitlab Runner'da tanımlayacağımız deploy edilecek makinayı belirttiğimiz kısım.
before script
Job'lar çalışmadan önce ortamı hazırlamak için kullanılacak shell script ler. Burada export komutuyla Golang'in derleneceği path'i belirtiyoruz.
script
Job'ların çalışması sırasında kullanılabilecek shell script ler. Burada Golang projesinin deploy olacağı makinada derlenip ilgili dizine kopyalanması işlemi gerçekleştiriliyor.
Artık deployment aşamasına geçebiliriz
Gitlab'da ki tanımlanan job'larının çalıştırılıp sonuçlarını Gitlab'a gönderen Runner deployment'ın gerçekleştirileceği makinaya https://bit.ly/2XbtGhl adresinden kurulduktan sonra credentials ayarları için Gitlab arayüzünün admin panelinden elde edeceğimiz token'i kaydedip, deployment makinasında komut satırında gitlab-runner register
komutunu çalıştırıyoruz. Bizden istenen url, token, tags ve executor(biz SSH kullanacağız) bilgileri girildikten sonra gitlab-runner list komutuyla oluşturduğumuz runner'ı görebiliriz. Credentials'da herhangi bir değişiklik yapacağımız zaman etc'nin altında bulunan gitlab-runner/config.toml dosyasını kullanabiliriz.
.gitlab-ci.yml
ve runner oluşturulduktan artık basit bir pipeline'a sahibiz. Projemize herhangi bir commit push edildiğinde runner mekanizması çalışıp Go projesini otamatik olarak derleyecektir.