8 Ekim 2018 Pazartesi

Jenkins ve GitLab ile uçtan uca otomasyon



Bugün çok eğlenceli bir geliştirme fırsatı verilmiş olmanın hüsnü-sevinci içerisindeyim :)) 

Coder'lıktan öteye gidip orchestration ve otomasyon yaptım biraz ve gideri varmış bu işlerin de hani. :P

Öncelikle işi özetleyeyim, yapmak istediğimiz şey projeyi git'e push'ladığımız zaman telegram botumuza bir adet onay notification'ı gelsiiin, onay verirsek proje otomatik olarak yayınlansıın. 

Bu işlemleri yapmak için bir sürü şey kullandık umarım fazla karıştırmam :)

Öncelikle otomasyon için meşhur Jenkins'i kullandık. Jenkins adımlarını belirlemek için Jenkinsfile diye bir file'ımız var, bu file'ı "groovy" dili ile işlememiz gerekiyor. Projenin içine de koyulabiliyor jenkins ayarlarından da yönetilebiliyor. Ana taslağı şu şekıl;


def swarmWebhookUrl = "https://swarm.adresimiz.com/api/webhooks/......"
def monopushUrl = "https://webhook.monopush.io/telegram/....."
node {
  stage('SCM') {
    git credentialsId'GitLabSSH'url'[gitadresi.git]'
  }
  stage('Docker Build') {
    sh 'docker build -t [...] -f bot.Dockerfile .'
  }
  stage('Docker Push') {
    withDockerRegistry(credentialsId'DockerCredentials'url'[https://pushlanacakadresimiz]') {
      sh 'docker tag [...] [...]:build-$BUILD_NUMBER'
      sh 'docker tag [...] [...]'
      sh 'docker push [...]:build-$BUILD_NUMBER'
      sh 'docker push [...]'
    }
  }
  stage('Approvement for Deploy'){
// 15 dk bekle, eğer olumlu cevap alırsan bir sonraki adıma geç
    timeout(time15unit'MINUTES'){
      hook = registerWebhook()
      def hookUrl = hook.getURL()
      def message = """
      {
          "message": "Project ready for deployment. I will deploy it to production if you want.",
          "action": "Do you want me to do that?",
          "buttons": [
              {
                  "id": "APPROVE",
                  "text": "Yes, Please",
                  "webhook": "${hookUrl}",
                  "success_message": "\\uD83D\\uDC4D Done. I did it.",
                  "error_message": "Something is wrong with your request."
              },
              {
                  "id": "CANCEL",
                  "text": "No",
                  "success_message": "\\uD83D\\uDD96 OK, I have canceled it."
              }
          ]
      }
      """
      httpRequest url: monopushUrl, httpMode'POST'requestBody: message, contentType'APPLICATION_JSON'
      echo "Waiting for POST to ${hookUrl}"
      data = waitForWebhook hook
      echo "Webhook called with data: ${data}"
    }
  }
  stage('Deploy') {   
      httpRequest url: swarmWebhookUrl, httpMode'POST'
  }
}


Bu Jenkinsfile'da 5 adım belirlemişiz ve bunlar stage'lerle belirtilmiş. Stage'lerin içinde yazan isimleri başlık olarak Jenkins'de görüyoruz.

Şimdi adımları özetlersek eğer, ilk adım olarak yani SCM adımında projeyi gitlab'dan çekiyoruz. 
2. ve 3. adımlar docker adımları yani bu adımlarda projeyi dockerize edip pushlama işlemi yaptık. 
4. adım approvement kısmı. Yani deploy edilsin mi edilmesin mi kararımızın verildiği kısım. Bu adımda kullandığımız timeout cevabı bekleyeceğimiz zamanı gösteriyor, eğer bu süre aksiyon alınmadan geçerse deploy işlemi yapılmıyor. 
Bu adımda monopush devreye giriyor. Yani telegram botumuza approvement mesajı atma kısmı. MonoPush'un ne olduğu ve nasıl kullanıldığı şu makalelerden görülebilir;
https://monopush.io/
https://www.selcukermaya.com/tr/bir-problem-45-dk-bir-proje-bir-makale/

Ve en son adım da deployment işlemi.. 

Tabii ki bu işlemlerden sonra gitlab ile jenkins'i ve swarm'ı tanıştırmamız lazım :) "Haadi dalalım"

GitLab'da projemizin integrations kısmına girip jenkins'den aldığımız adresi ve token'ı yazıp webhook ekle diyoruz.



Token bilgisini Jenkins'den, build triggers başlığından Advanced butonuna tıklayarak alabiliriz.


Tabi swarm Jenkinsfile'da yazan swarm webhookumuzu da swarm'dan almamız gerekiyor. Bu kısmı da atlamayalım. 

Sonuç olarak artık "git push" komutumuzla telegramımızda istediğimiz gruba bir notification gelecek, bizden onay alacak ve deploy işlemini gerçekleştirecek. Ve biz dee Jenkins'den izlemenin keyfini süreceğiz. İşte şu şekıl;



Fazla huzurlu.. :S

Hiç yorum yok:

Yorum Gönder