18 Mayıs 2020

Gitlab CI&CD ile Golang Projelerini Derlemek

Ş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.

gitlab pipeline

Chrome Performans Metrikleri

Temiz Kod İçin Basit Kurallar