rasitesdmr / SpringBoot-Jenkins-GCP

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

🎯 Jenkins ?

  • Jenkins, Sürekli Entegrasyon (CI / Continuous Integration) ve Sürekli Dağıtım (CD / Continuous Delivery) amacıyla Java ile yazılmış açık kaynaklı bir otomasyon aracıdır.
  • Jenkins, yazılım projelerinizi sürekli olarak oluşturmak ve test etmek için kullanılır, bu da geliştiricilerin değişiklikleri projeye entegre etmesini ve kullanıcıların yeni bir sürüm elde etmesini kolaylaştırır.
  • Ayrıca, çok sayıda test ve dağıtım teknolojisiyle bütünleşerek yazılımınızı sürekli olarak teslim etmenize olanak tanır.
  • Jenkins ile kuruluşlar, otomasyon yoluyla yazılım geliştirme sürecini hızlandırabilir.
  • Jenkins, derleme, belgeleme, test etme, paketleme, aşama, devreye alma, statik analiz ve çok daha fazlası dahil olmak üzere her türlü geliştirme yaşam döngüsü sürecini entegre eder.

📌 Continuous Integration ?

  • Yazılım geliştirme sürecinde birleştirme işlemlerinin otomatikleştirilmesidir.
  • Yani, yazılım geliştiricilerin yaptıkları değişiklikler sürekli olarak ana kod tabanına entegre edilir ve böylece çatallanma ve birleştirme hataları önceden tespit edilir.
  • Jenkins, bu süreci otomatikleştirmek için kullanılan bir araçtır.

📌 Continuous Delivery ?

  • Yazılımın sürekli olarak hızlı ve güvenli bir şekilde kullanıma sunulması için yapılan bir dizi uygulama ve süreçlerdir.

  • Bu süreçler arasında test otomasyonu, konfigürasyon yönetimi, uygulama dağıtımı, sürüm kontrolü vb. yer alır.

  • Jenkins, bu süreci de otomatikleştirmek için kullanılan bir araçtır.

  • Yani, CI, kod değişikliklerinin entegrasyonunu otomatikleştirirken, CD ise yazılımın sürekli olarak güvenli ve hızlı bir şekilde kullanıma sunulmasını sağlar.

📌 Pipeline ?

  • İşlerin ardışık bir sırada yapılması, bir işlemin çıktısının sonraki gelen işlemin girdisi olması anlamına gelmektedir.
  • Fabrikadaki üretim bantlarını aklımıza getirelim.
  • Üretilen eşya, hattın içerisinde farklı duraklara gelir.
  • Her durakta bir işlem görür ve sonraki aşamaya geçer.

📌 Stage ?

  • Pipeline içerisinde yer alan fazları ifade eder. Örneğin standart bir yazılım projesinde build -> test -> deploy adımlarından her birisi bir fazı ifade eder.

📌 Step ?

  • Stage içerisinde yer alan adımları ifade eder.

  • Jenkins üzerinde kodumuzun geçtiği aşamaları düşünelim:

  • Build -> Test -> Deployment

  • Build (derleme) aşamasını bir evre (stage) olarak düşünelim.

  • Test evresi de sonraki evre.

  • Deployment evresi de en son çalışacak evre olarak düşünelim.

  • Bu işlemler Jenkins üzerinde ardışık bir sırada çalışmaktadır.

  • Build işlemi hatalı olursa, yani kodumuz derlenmez ise, sonraki evreye geçmeyecektir.

  • Aynı şekilde test safhasında hata oluşursa, deployment işlemi gerçekleşmeyecektir.


  • Jenkins'i kısa bir özet geçtiğimize göre , jenkins nasıl kurulur o adımlara geçelim.

🎯 Jenkins Kurulumu ?

  • İsterseniz kendi local'ınıza jenkinsi indirebilirsiniz.
  • Ama ben böyle yapmayacağım.
  • Google cloud hesabımdan ubuntu bir makine kuracağım.

📌 Google Cloud

  • İlk önce https://cloud.google.com/ sayfasına girininiz.
  • Compute Engine > VM instances > Create Instance diyerek oluşturmaya başlayalım.

  • Karşımıza böyle bir sayfa geliyor.
  • Sunucu adınızı giriniz.

  • Boot Disk bölümünden ubuntu 20.04'ü seçiniz.

  • Son olarak HTTP isteklerine izin veriyoruz.
  • Create kısmına tıklıyoruz.

  • Sunucu oluşturma tamamlandı. Şimdi yapmamız gereken SSH ile içine giriyoruz.


📌 SSH AND DOCKER

  • Karşımıza böyle bir ekran açılıyor.
  • Şimdi yapmamız gereken sunucunun içinde docker ve docker-compose yüklemek.
  • Yazacağım komutları tek tek yazınız.

  • Docker
sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common -y
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
apt-cache policy docker-ce
sudo apt install docker-ce -y
sudo systemctl status docker
docker --version


  • Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version


  • Şimdi docker-compose.yaml dosyası oluşturup içine jenkins image'nı yazmamız gerekiyor.
sudo su 
nano docker-compose.yaml
  • nano docker-compose.yaml dediğimiz zaman içine yazı yazabileceğimiz bir text sayfası açılır.

  • İçine jenkins image'nı yazıyoruz.
  • Yazdıktan sonra ctrl + x , y , enter yapıyoruz.
ls
  • ls çekip dosyamızı görebiliriz.
version: "3.7"
services:

  jenkins:
    image: jenkins/jenkins:lts
    privileged: true
    restart: always
    user: root
    ports:
      - "8080:8080"
    container_name: jenkins
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /usr/bin/docker:/usr/bin/docker
      - /usr/local/bin/docker-compose:/usr/local/bin/docker-compose
      - jenkins_vol:/var/lib/jenkins/data

volumes:
  jenkins_vol:
  • Şimdi gelelim container ayağa kaldırma kısmına.
docker-compose up -d
docker ps 
  • ps çekerek container durumuna bakabiliriz.

  • Artık jenkins yükleme kısmını tamamladık. Gelelim jenkins yönetim ekranına.

🎯 Jenkins Yönetim ?

  • Sunucumuzun oluştuğu ekranı açalım.

  • Bu kısımda iki tane IP adresi var. Bunlardan kısaca bahsedelim
  • Internal IP : Makinenizin Google Cloud ağındaki yerel IP adresidir. Bu IP adresi, yalnızca Google Cloud ağındaki diğer kaynaklarla iletişim kurmak için kullanılabilir ve internete erişim sağlamak için kullanılamaz.
  • External IP : Makinenizin internet üzerinden erişilebilir genel IP adresidir.Bu IP adresi, makinenize internet üzerinden erişim sağlamak için kullanılır ve internetteki diğer kaynaklarla iletişim kurmak için kullanılır.
  • Bu kısmıda öğrendiğimize göre bir tane browser açalım ve External IP:8080 adresine bağlanalım.

📌 Jenkins Yapılandırma

  • External IP:8080 adresine girdiğimiz zaman önümüze bir ekran geliyor ve key istiyor.

  • Bu key'i almak için SSH tekrardan girelim.
docker ps 
  • docker ps çekelim.
docker logs -f containerId 
  • container'ımızın loglarına bakarsak şifreyi görebiliriz.

  • Tamamlanmasını bekleyelim.

  • Instance Configuration sayfasında direk save and finish kısmına tıklayınız.

  • Artık yönetim sayfasını açmış oluyoruz.

  • Şimdi bu kısımda Kontrol Merkezi > Jenkins'i Yönet > Plugin Manager > Available Plugins kısmından Maven Integration, Pipeline Maven Integration , Pipeline Utility Steps ,Docker , Docker Commons , Docker Pipeline , docker-build-step kısımlarını indirip sunucuya restart atıyoruz.

  • Bu adımıda tamamladığımıza göre şimdi yeni bir öge oluşturalım.

  • Açılan sayfada şu adımları doldurup seçiyoruz.

  • Bu alanda jenkinsfile dosyasını kendi repomuzdan alması için bunu seçiyoruz.

  • Projemizin url'ini veriyoruz.
  • Daha sonra add kısmına basıp jenkins'i seçiyoruz ve önümüze Jenkins Credentials Provider: Jenkins ekranı geliyor.

  • Bu kısımda github bilgilerimizi giriyoruz. Önerim password kısmına bir token girmeniz. Bu adımları izleyerek yapabilirsiniz.
  • Önce github sayfasına giriş yapalım
  • Ardından ayarlar kısmını açalım ve en alt da developer setting kısmına tıklayalım.

  • Token kısmından gerkli izinleri vererek oluşturun ve size bir token verecektir, onu password kısmına yapıştırın.

  • Hangi brach deyseniz onu seçin. Script Path seçin ve kaydet kısmına tıklayın.
  • Son bir adımımız kaldı o da docker hesabını bağlamak.

  • Bu adımları izleyerek bir credentials oluşturun ve karşınıza şu ekran gelecek.

  • Aynı github kısmı gibi password kısmını token oluşturarak verin.

  • Jenkins yapılandırma kısmı bitti. Şimdi benim oluşturduğum Jenkinsfile dosyasına bakalım.

🎯 Jenkinsfile ?

pipeline {
    agent any
    stages {
        stage('Build Maven') {
           agent {
             docker {
               image 'maven:3.8.5-openjdk-17'
               args '-v $HOME/.m2:/root/.m2'
               reuseNode true
             }
           }
           steps {
                 checkout scmGit(branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: 'rasitesdmr', url: 'https://github.com/rasitesdmr/SpringBoot-Jenkins-GCP.git']])
                 sh 'mvn clean package -DskipTests'
           }
        }
        stage("Docker Build Image"){
            steps{
                script{
                    withCredentials([usernameColonPassword(credentialsId: 'docker', variable: 'dockerhub')]) {
                       sh 'docker build -t rasitesdmr1486/springboot-jenkins-gcp:latest .'
                    }

                }

            }

        }
        stage("Docker Push Image"){
            steps{
                script{
                    withDockerRegistry(credentialsId: 'docker', toolName: 'docker', url: "" ){
                       sh 'docker tag rasitesdmr1486/springboot-jenkins-gcp:latest  rasitesdmr1486/springboot-jenkins-gcp:latest'
                       sh 'docker push rasitesdmr1486/springboot-jenkins-gcp:latest'
                    }

                }

            }

        }

        stage("Docker Compose"){
           steps{
                 sh 'docker-compose up -d'
           }
        }

    }
}

  • İlk başta maven image indiriyoruz.
  • Projeyi github'dan çekiyoruz ve build edip jar dosyası haline getiriyoruz.
  • Docker Hub'a push'ladıktan sonra sunucumuzda çalışan container'ımızı yeniden başlatıyoruz.
  • Böylece proje hep güncel kalıyor.

  • Şu kısma değinmek istiyorum. Diyelimki projeye birşeyler ekledik ve commit push yaparak github'a gönderdik. Jenkins bunu otomatik yapması için github projenin ayarlar kısmınnda Webhooks açmamız gerekiyor. Gelin bu adımlara bakalım.

📌 Webhooks

🎯 Projenin Tamamlanması

  • SSH sunucuya bağlanıyoruz.
  • docker ps çekerek projem ayaktamı ona bakıyorum.

  • Projemde swagger kullanıyorum. Gelin swagger dan bakalım.

  • Gördüğümüz gibi sadece bir tane metodum var.
  • Projeme öğrencilerin listesini çekmek için bir metot ekleyip github'a push'layacam ve ardından neler gerçekleşiyor onlara bakalım.

  • Adımlarım başarıyla tamamlandı.
  • Şimdi swagger kısmına bakalım.

  • Canlı sunucumdaki proje düzgün bir şekilde güncellendi.

About


Languages

Language:Java 99.5%Language:Dockerfile 0.5%