GoCD

Yusuf Can
hepsiburadatech
Published in
10 min readFeb 12, 2020

Sizlere bu yazımda yakın zaman içerisinde storefront takımı olarak eski versiyonunu kullandığımız fakat eski versiyonu ihtiyaçlarımızı artık karşılamadığından dolayı yeni versiyonuna geçiş yaptığımız GoCD’nin tüm yanlarını ele alarak ve örnekler vererek bahsetmeye çalışacağım. Ayrıca bu yazıda GoCD ile Jenkins arasındaki farklara yer vereceğim.

Bu yazının temel amacı GoCD’nin dünya çapında kullanımının az olduğundan dolayı topluluğunun az olması ve kendi dokümantasyonları yeterli olsa da ileri düzey kullanım için yetersiz olmasından dolayıdır. GoCD’nin resmi web sitesine aşağıdaki adresten erişebilirsiniz.

GoCD Nedir ?

GoCD ThoughtWorks tarafından geliştirilen open source Continuous Integration ve Continuous Delivery sistemidir.

Continuous Integration ve Continuous Delivery yaklaşımı.

GoCD ile diğer ci/cd uygulamaları gibi geliştirilen uygulamaları build edip test ortamından production ortamına kadar olan tüm süreçleri yönetebiliriz. GoCD ile jenkins arasındaki en önemli farklardan biri GoCD’yi sadece ci/cd environmentı olarak düşünmemiz. Jenkins’i ise kullanılan tüm environmentları ( on prem test-qa-prod veya cloud ) yönetebileceğimiz bir uygulama olarak düşünülmesindendir. Ayrıca Jenkins’in en güçlü yanlarından biri plugin desteği olmasıdır. Kullanacağımız her şey ,için neredeyse pluginin bulabiliriz. Her ne kadar GoCD’de de çeşitli kullanabileceğimiz çeşitli pluginler olsa da malesef Jenkins ile bu konuda karşılaştırılması çok zor. Fakat GoCD’nin jenkinsten çok daha daha güçlü bir dashboard özelliği var.

hepsiburada.com GoCD pipeline
hepsiburada.com GoCD pipeline
Mobile HepsiX jenkins pipeline

Yukarıdaki ekran görüntülerinde görünüm farklılıklarını görebilirsiniz. GoCD’de tüm pipelineları tek bir yerde tüm versiyonlarıyla görebilmemiz mümkün fakat jenkinste oluşturduğumuz pipelineları sadece pipeline detaylarında tüm içeriğini görebiliyoruz. Her ne kadar basit bir fark gözüksede kullanım kolaylığı açısından GoCD jenkins’ten bir adım öne çıkıyor.

GoCD Kurulumu

GoCD kurulumunu anlatmak için amazon web servisleri üzerinde ayağa kaldırdığım ubuntu ec2 sunucu kullanacağım. Sizler centos üzerinde çalışacaksınız install scriptlerini aşağıdaki github adresinden ulaşabilirsiniz.

GoCD java tabanlı bir uygulama olduğundan dolayı sunucumuza ilk önce java kurmamız gerekli.

apt-get install default-jre

Java kurulumundan sonra GoCD kurulumuna geçebiliriz.

echo “deb https://download.gocd.org /” | sudo tee /etc/apt/sources.list.d/gocd.list

curl https://download.gocd.org/GOCD-GPG-KEY.asc | sudo apt-key add -

apt-get update

apt-get install go-server

Kurulum tamamlandıktan sonra go-server’ın servisini başlatabiliriz.

systemctl start go-server

Servis başladıktan sonra go-server’a http 8153 https 8154 portundan erişim sağlayabiliriz. ( Htpp://Your_IP:8153/go)

Aşağıdaki ekran görüntüsünde kurulumdan sonra sunucuda oluşan klasörlerin yerlerini görebilirsiniz.

Bu işlemlerden sonra kurulum tamamlandı. Kurulumlardan sonra login olacak kullanıcıları düzenleme adımına geçebiliriz.

Kullanıcı Yönetimi

GoCD’yi kullanabilecek kişileri belirlemek için apache-tools’u kullanarak kullanıcı ve şifresi yaratacağız.

apt-get install apache2-tools

Yukarıdaki komutu çalıştırdıktan sonra kullanıcı yaratabiliriz.

htpasswd -B -c /etc/go/passwd_auth yusuf.can

Kullanıcı yarattıktan sonra GoCD’de gerekli düzenlemeleri yapmamız gerekmektedir.

Admin >> Security >> Authorization Configurations

Not: Kaydetme işleminden sonra tekrar login olmanız gerekecek.

Başka bir kullanıcı eklemek istiyorsak -c parametresini kaldırmalıyız. Çünkü -c parametresi var olan kullanıcıları sıfırlamaktadır.

htpasswd -B /etc/go/passwd_auth example.user

Ayrıca GoCD’ye LDAP ile giriş yapabilirsiniz. Eğer GoCD’yi merkezi bir pipeline aracı olarak kullanacaksınız LDAP yöntemi işinize çok yarayacaktır fakat küçük bir takım olarak GoCD’yi kullanacaksanız LDAP yönteminin gereksiz olduğunu düşünüyorum.

Nginx ve GoCD

Kurulumu ve login olacak kullanıcıları belirledikten sonra nginx düzenlemesini yapabiliriz. Bunu yapmamızın amacı GoCD’nin arayüzüne erişmek için port yazmaktan kaçınmak. Nginx yerine virtual IP yaratıp yine portsuz erişim sağlayabiliriz fakat ci toolu için virtual IP yaratmanın gereksiz olduğunu düşünüyorum.

apt-get install nginx

Yukarıdaki komutla nginxi kurduktan sonra nginx confiğini düzenleyebiliriz.

vi /etc/nginx/sites-available/gocd

Nginx.conf

ln -s /etc/nginx/sites-available/gocd /etc/nginx/sites-enabled/gocd

Yukarıdaki işlemlerden sonra sunucunuza example.gocd.com adında dns ayarlarsınız artık IP ve Port yerine Http://example.gocd.com ile giriş yapabilirsiniz.

GoCD Agent

Jenkins ile GoCD’nin bir diğer farklarından biri GoCD’de bir job çalıştırabilmek için GoCD bir adet agenta ihtiyaç duymaktadır. Fakat jenkinste job çalıştırmak için herhangi bir agenta ihtiyaç duymuyoruz. GoCD’de ayrıca bir agentta aynı anda bir job çalıştırılabilinirken jenkinste aynı agentta bir kaç tane job çalıştırabiliriz.

GoCD’de server sunucusunu aynı anda agent olarak çalıştırabiliriz. (Bu yöntemi önermiyorum. Best practice olarak serverla agentlar farklı olmalı.)

GoCD agent kurulumu için aşağıdaki işlemleri yapmamız gerekmektedir.

ilk önce java kurulumu yaptıktan sonra aşağıdaki adımları uygulayınız.

echo “deb https://download.gocd.org /” | sudo tee /etc/apt/sources.list.d/gocd.list

curl https://download.gocd.org/GOCD-GPG-KEY.asc | sudo apt-key add -

sudo apt-get update

apt-get install go-agent

Yukarıdaki işlemlerden sonra go-agent servisi çalıştırmadan önce go-agent’ın bind olacağı go-server adresini /usr/share/go-agent/wrapper-config dizinindeki wrapper-properties.conf dosyasındaki wrapper.app.parameter.101 parametresine go-server adresini girmeliyiz.

Bu işlemden sonra go-agent servisini başlatabilirsiniz.

systemctl start go-agent

Servis başladıktan sonra agentımız go-serverına bind olacaktır.

Not: Güvenlikten dolayı go-agentı go-servera bind olduktan sonra enable edilmelidir. Otomatik enable olmamasının sebebi kendi dokümantasyonlarında güvenlik önlemlerinden dolayı olduğu açıklanmaktadır.

Not: Eğer elinizde birden fazla eklemeniz gereken agent varsa ansible sizin için güzel bir çözüm olacaktır.(Hem Windows hem linux environmentları için) Eklediğimiz agentın otomatik bir şekilde enable olmasını sağlamak için ConfigXML’de “server agentAutoRegisterKey” parametresini kullanabilirsiniz.

Config XML server agentAutoRegistrykey

Pipeline Oluşturma

Yukarıdaki işlemleri tamamladıysak artık ilk pipelinımızı yaratabiliriz. Pipeline yaratabilmemiz için github’da bir tane projemiz olmalıdır. GoCD ile jenkins arasında bir diğer fark ise Jenkinste pipeline yaratmamız için herhangi bir source control sistemine ihtiyaç duymamamız. Örneğin jenkinste basit bir sh komutunu gite eklemeden sunucu üzerinde direk çalıştırabilirsiniz.

Pipeline oluşturmadan önce ilk yapmamız gereken GoCD’de environment ekleyip eklediğimiz agentı o environmenta eklemektir.

Ben test adında environment oluşturdum ve eklediğim agentı test environmentına ekledim.

Daha sonra agentımıza bir adet resource ismi veriyoruz. Agenta resource vermemizin sebebi pipeline’nın hangi agenta çalışağını belirlemektir. Örneğin bir adet pipelinımız var bunun sadece centos sunucuda çalışması gerektiğini düşünelim. Fakat agent listemizde hem ubuntu hem centos sunucu varsa pipelinen centos sunucuya verdiğimiz resource ismini vermeliyizki pipelinenımız ubuntu sunucuda çalışmasın.

Git Adresi
Pipeline Name

Stage isimleri verildikten sonra çalıştırılması gereken komutları verelim.

Yukarıdaki işlemlerden sonra pipelinenımızı yarattığımız test environmenta bind etmemiz gerekiyor.

Daha sonra hangi sunucuda çalışmasını istiyorsak job settings’te o sunucuya verdiğimiz resource ismini yazmamız gerekiyor.

Pipeline’nımıza resource verdikten sonra artık pipeline’nımızı çalıştırabiliriz.

Pipeline çalıştıktan sonraki ekran görüntüsü

Pipeline Template

GoCD’nin güzel özelliklerinden biri pipeline için template’ler yaratıp pipelinelarımızı bu templateler ile türetebilmemiz. Bir adet docker pipeline düşünelim. Docker pipelinelarında docker build ve push işlemleri ortak olduğundan sürekli pipelinelara bu adımları yazmak yerine bu adımları templateler yardımıyla sürekli kullanılacak hale getirebiliriz.

Docker Build and Push için yaratılmış template
Template içeriği

Yukarıda yaratmış olduğumuz templateleri görebiliriz. Aşağıdaki bu template’i kullanan pipeline örneiğini görebilirsiniz.

Proje pipeline’ı template üzerinden yaratıldı
Docker Tag işlemi için environment variable’a parametre eklendi
Template içerisinde docker registry username and passwordu secure olarak girildi.

Yukarıda örnekte görüldüğü gibi template yaratıp temlapte içerisinde variable ekleyerek template’i kullanan pipelinelar için özelleştirme yapabiliriz. Aşağıdaki linkten GoCD’de environment variable’ları nasıl kullanacağınızı görebilirsiniz.

Pipeline Örneği

Pipeline yaratıp daha sonra pipelineları template’ler ile yaratmayı öğrendiğimize göre takım olarak kullandığımız cosmos projesinin pipeline’nını inceleyebiliriz.

Cosmos microfrontend kapsamında kullandığımız componentleri pushladığımız story-book projesidir.

Cosmos Pipeline Adımları

  • npm install
  • docker build
  • docker push
  • kubernetes deployment
Pipeline Görüntüsü
Pipeline Adımları
Kubernetes Deployment Pipeline

Peki cosmosda build aldığımız pipeline’nın versiyon numarasını diğer deployment pipeline’nında nasıl kullandık?

Bu adım için cosmos-deployment pipelinena ekstra material ekliyoruz. Meterials eklerken pipeline seçimi yapıp kaydediyoruz. Daha sonra projenin label templatine pipeline ismi veriyoruz. Bu sayede bir projenin tüm ci/cd süreçlerinde tek bir build numarası olup onu her ortam için kullanabiliriz.

Materials bölümünde Pipeline Verilmesi
Label Template

Pipeline As Code (PaC)

GoCD’de pipeline as a code mantığını anlatmadan önce ana hatlarıyla PaC’ın ne olduğunu özetlemek istiyorum.

PaC bir projenin pipeline’nında kullancağınız adımları projenin bulunduğu repository’de tutmak şeklinde düşünebiliriz. Bu sayede uygulamalarımızın pipelinelarının bir commit history’si oluyor ve ci/cd sunucumuzda bir sorun olursa aynı pipeline’ı başka bir ci/cd sunucusunda configurasyonu kaybetmeden tekrar çalıştırabiliriz. Bunun en güzel örneği Jenkinsteki jenkinsfile yapısı. GoCD’de Pac sistemini yaml’lar sayesinde yapabiliyoruz.

Bu yapıyı bir örnekle açıklayalım. İlk yarattığımız pipeline’ı PaC’e göre çalıştıralım.

Aşağıdaki ekran görüntüsünde ilk yarattığımız pipeline’nın yaml halini görebilirsiniz

first.pipeline.gocd.yaml

Not: Dosya uzantısı gocd.yaml olmalıdır.

Yaml dosyasını düzenledikten sonra GoCD dashboardunda Config Repositories bölümüne gelerek yaml dosyasının bulunduğu git adresi verilmelidir.

Config Repository

Configurasyonu ayarladıktan sonra otomatik olarak projemiz build olmaya başlayacaktır.

Pipeline otomatik oluşturuldu ve Build olmaya başladı.

Yukarıda görülüğü üzere pipeline’ımızda değişiklik yapmak istersek artık repository üzerinden değişiklik yapmak zorundayız.

Infrastructure As Code (IaC)

GoCD üzerinde yaptığımız tüm değişiklikleri kendi içerisinde yer aldığı config xml dosyasına yazar. (GoCD serverından config xml’in bulunduğu dizin /etc/­go/cr­uise-­confi­g.xml) GoCD sunucusunda sorun olduğunu düşünelim. Bir sebepten dolayı sunucuya ve pipelinelarımıza erişemiyoruz. Kayıpları en aza indirmek için config xml dosyasını gitte tutabiliriz ve yeniden GoCD kurulumu yaparsak bu config xml’i kullanabiliriz. Aşağıdaki örnekte ansible ile config xml’de yaptığımız değişikleri gite pushlayan pipeline yaml’ını görebilirsiniz.

pipeline.gocd.yaml
ansible-playbook.yaml

Yukarıdaki pipeline sayesinde yaptığımız değişikliklerden sonra Config xml’i sürekli gite pushlayarak herhangi bir durumda kaybı en aza indiriyoruz.

Kubernetes Elastic Agent

GoCD’nin en güzel özelliklerden biri elastic agent kullanabilmemiz. GoCD üzerinde bir job çalıştırmak istediğimizde kubernetes üzerinde bir adet pod ayağa kalkıyor otomatik olarak GoCD’ye bind olup işlem bittiğinde pod ölüyor. Şuan takım olarak kullandığımız GoCD’de herhangi bir linux agent bulunmamaktadır. Bunun en önemli avantajlarından biri VM çöplüğünün önüne geçmemiz. Kurduğumuz 22 node’luk kubernetes clusterında yaklaşık 100 tane pod ayağa kalkabildiğinden dolayı 100 adet agent sahip olabiliyoruz. Elastic agent kullanmadan 100 adet agent eklediğinizi düşünelim. Bunların yaratacağı bakım maliyeti (özellikle disk kullanımı ) bizlere daha büyük sorunlar yaratacaktı.

Kubernetes Elastic Agent Kurulumu

Aşağıdaki github adresinden .jar dosyasını indiriyoruz ve indirdiğimiz jar dosyasını GoCD serverında belirtilen dizine kopyalıyoruz /var/lib/go-server/plugins/external

Kopyalama işleminden sonra GoCD servisine restart atıyoruz ve dashboardda pluginimizin aktif olup olmadığınız görüyoruz.

Admin >> Server Configuration >> Plugins

Bu işlemden sonra kubernetes credential’mızı bu plugine girmemiz gerekmektedir.

Admin >> Elastic Agent Configuration >> Add Cluster profile

Bilgileri doldurduktan sonra verdiğimiz ID’yi pipeline jobumuza giriyoruz ve pipeline’ı çalıştırıyoruz.

Elastic Profile ID ile Cluster Profile’a verdiğimiz isim eşleşmelidir.

Bu işlemlerden sonra jobumuz kubernetes üzerinde koşup işlem bitince çalışan container kendiliğinden silinecektir.

Docker In Docker

GoCD agent container’ı için kullanılan Dockerfile’a aşağıdaki adresten ulaşabilirsiniz. Ayrıca kubernetes elastic agent kullanırken docker hub’da paylaşılmış docker image’ı kullanmaktayız. Fakat bu docker image’ında sadece go agent olduğundan dolayı docker build işlemlerini gerçekleştiremiyoruz. Bundan dolayı kubernetes üzerinde docker build ve push işlemini yapabilmemiz için docker in docker kullanmalıyız. Bunun için paylaştıkları dockerfile’ı düzenleyip docker image’ına docker kurup private registertimize pushladık.

Docker kurulan go-agent Dockerfile:

Fakat bu dockerfile’dan üretilmiş bir container çalıştırırsak docker yüklü olmasına rağmen dockerın çalışmadığını göreceğiz. Bunun için Kubernetes elastic agent configurasyonunda pod.yaml’ına /var/run/docker.sock path’ini volume vermeliyiz.

volume /var/run/docker.sock

Bu işlemleri yaptıktan sonra kubernetes üzerinde ayağa kalkan podda docker işlemlerini çalıştırabiliriz.

Not: Ekran görüntüsündeki image’a hepsiburada private registirisinde olduğundan dolayı erişemeyeceksiniz. Docker kurulu ubuntu go agent image’ı kullanmak için aşağıdaki image’ı kullanabilirsiniz.

testhepsiburada/goagent-with-docker:01

Özet

Sizlere takım olarak kullandığımız GoCD uygulamasının tüm yönlerini anlatmaya çalıştım. Hangi ci/cd toolu kullanmalıyız sorusunu soruyorsanız size hangisi daha kolay geliyorsa veya hangisi bize daha uygun sorusundan yola çıkarak karar vermenizi öneririm. Ayıca pipeline kurarken ne kadar kolay bir yapı kurarsanız sizin işinize gelecektir. Bir pipeline’nın iyi olup olmaması ne kadar karmaşık olduğunla ilgili değil ne kadar anlaşılır olduğuyla ilgilidir. Ayrıca burda anlattığım tüm özellikleri Jenkins uygulamasında da yapabildiğinizi unutmayınız. GoCD ile Jenkins arasındaki detaylı farklara aşağıdaki linkten ulabilirsiniz.

https://stackshare.io/stackups/go-cd-vs-jenkins

Okuduğunuz için teşekkür ederim…

Yusuf Can

Kaynaklar:

--

--