Öğretici: GitHub ve Docker kullanarak Jenkins işlem hattı oluşturma

Önemli

Birçok Azure hizmeti Jenkins eklentilerine sahiptir. Bu eklentilerden bazıları 29 Şubat 2024 itibarıyla destekten çıkarılacaktır. Azure CLI, Jenkins'i Azure hizmetleriyle tümleştirmenin şu anda önerilen yoludur. Daha fazla bilgi için Azure için Jenkins eklentileri makalesine bakın.

Uygulama geliştirme sürecinin derleme ve test aşamasını otomatikleştirmek için bir sürekli tümleştirme ve dağıtım (CI/CD) işlem hattı kullanabilirsiniz. Bu öğreticide, aşağıdakileri öğrenerek bir Azure sanal makinesinde CI/CD işlem hattı oluşturursunuz:

  • Jenkins sanal makinesi oluşturma
  • Jenkins’i yükleme ve yapılandırma
  • GitHub ile Jenkins arasında web kancası tümleştirmesi oluşturma
  • GitHub işlemelerinden Jenkins derleme işleri oluşturma ve tetikleme
  • Uygulamanız için bir Docker görüntüsü oluşturma
  • GitHub işlemelerinin yeni Docker görüntüsü oluşturduğunu ve çalışmakta olan uygulamayı güncelleştirdiğini doğrulama

Bu öğreticide Azure Cloud Shell içindeki CLI sürekli olarak en son sürüme güncelleştirilmektedir. Cloud Shell'i açmak için herhangi bir kod bloğunun üst kısmından Deneyin'i seçin.

CLI'yi yerel olarak yükleyip kullanmayı tercih ederseniz bu öğretici için Azure CLI 2.0.30 veya sonraki bir sürümünü çalıştırmanız gerekir. Sürümü bulmak için az --version komutunu çalıştırın. Yüklemeniz veya yükseltmeniz gerekirse, bkz. Azure CLI yükleme.

Jenkins örneği oluşturma

İlk önyüklemede Linux sanal makinelerini özelleştirme konulu önceki bir öğreticide, cloud-init ile VM özelleştirmeyi nasıl otomatikleştirebileceğinizi öğrendiniz. Bu öğreticide, bir VM’ye Jenkins ve Docker yüklemek için cloud-init dosyası kullanılır. Jenkins, sürekli tümleştirme (CI) ve sürekli teslimi (CD) etkinleştirmek için Azure ile sorunsuz bir şekilde tümleştirilen popüler bir açık kaynak otomasyon sunucusudur. Jenkins kullanmayla ilgili diğer öğreticiler için bkz. Azure’da Jenkins merkezi.

Geçerli kabuğunuzda cloud-init-jenkins.txt adlı bir dosya oluşturup aşağıdaki yapılandırmayı yapıştırın. Örneğin, dosyayı yerel makinenizde değil Cloud Shell’de oluşturun. Dosyayı oluşturmak ve kullanılabilir düzenleyicilerin listesini görmek için sensible-editor cloud-init-jenkins.txt adını girin. Başta birinci satır olmak üzere cloud-init dosyasının tamamının doğru bir şekilde kopyalandığından emin olun:

#cloud-config
package_upgrade: true
write_files:
  - path: /etc/systemd/system/docker.service.d/docker.conf
    content: |
      [Service]
        ExecStart=
        ExecStart=/usr/bin/dockerd
  - path: /etc/docker/daemon.json
    content: |
      {
        "hosts": ["fd://","tcp://127.0.0.1:2375"]
      }
runcmd:
  - apt install openjdk-8-jre-headless -y
  - wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add -
  - sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
  - apt-get update && apt-get install jenkins -y
  - curl -sSL https://get.docker.com/ | sh
  - usermod -aG docker azureuser
  - usermod -aG docker jenkins
  - service jenkins restart

VM oluşturabilmek için önce az group create ile bir kaynak grubu oluşturun. Aşağıdaki örnekte, eastus konumunda myResourceGroupJenkins adlı bir kaynak grubu oluşturulur:

az group create --name myResourceGroupJenkins --location eastus

Şimdi az vm create ile bir VM oluşturun. --custom-data parametresini kullanarak cloud-init yapılandırma dosyanızı geçirin. Dosyayı geçerli çalışma dizininizin dışına kaydettiyseniz cloud-init-jenkins.txt dosyasının tam yolunu belirtin.

az vm create --resource-group myResourceGroupJenkins \
    --name myVM \
    --image UbuntuLTS \
    --admin-username azureuser \
    --generate-ssh-keys \
    --custom-data cloud-init-jenkins.txt

Sanal makinenin oluşturulup yapılandırılması birkaç dakika sürer.

Web trafiğinin sanal makinenize ulaşmasına izin vermek üzere az vm open-port komutunu kullanarak Jenkins trafiği için 8080 bağlantı noktasını, örnek uygulama çalıştırmak amacıyla kullanılacak Node.js uygulaması için de 1337 bağlantı noktasını açın:

az vm open-port --resource-group myResourceGroupJenkins --name myVM --port 8080 --priority 1001
az vm open-port --resource-group myResourceGroupJenkins --name myVM --port 1337 --priority 1002

Jenkins’i yapılandırma

Jenkins örneğinize erişmek için VM’nizin genel IP adresini edinin:

az vm show --resource-group myResourceGroupJenkins --name myVM -d --query [publicIps] --o tsv

Güvenlik nedeniyle, Jenkins yüklemesini başlatmak için VM’nizde bir metin dosyasında saklanan ilk yönetici parolasını girmeniz gerekir. Önceki adımda edinilen genel IP adresini kullanarak VM’niz ile SSH bağlantısı kurun:

ssh azureuser@<publicIps>

Jenkins'in şu komutu kullanarak service çalıştığını doğrulayın:

$ service jenkins status
● jenkins.service - LSB: Start Jenkins at boot time
   Loaded: loaded (/etc/init.d/jenkins; generated)
   Active: active (exited) since Tue 2019-02-12 16:16:11 UTC; 55s ago
     Docs: man:systemd-sysv-generator(8)
    Tasks: 0 (limit: 4103)
   CGroup: /system.slice/jenkins.service

Feb 12 16:16:10 myVM systemd[1]: Starting LSB: Start Jenkins at boot time...
...

Jenkins yüklemenizin initialAdminPassword değerini görüntüleyin ve kopyalayın:

sudo cat /var/lib/jenkins/secrets/initialAdminPassword

Dosya henüz kullanılamıyorsa cloud-init tarafından Jenkins ve Docker yüklemesinin tamamlanması için birkaç dakika daha bekleyin.

Şimdi bir web tarayıcısı açıp http://<publicIps>:8080 adresine gidin. Aşağıdaki adımları uygulayarak ilk Jenkins kurulumunu tamamlayın:

  • Yüklenecek eklentileri seç'i seçin
  • Üstteki metin kutusundan GitHub araması yapın. GitHub kutusunu işaretleyin ve Yükle’yi seçin
  • İlk yönetici kullanıcıyı oluşturun. admin gibi bir kullanıcı adı girin ve sonra kendi güvenli parolanızı belirtin. Son olarak, bir tam ad ve e-posta adresi yazın.
  • Kaydet ve Bitir’i seçin
  • Jenkins hazır olduktan sonra Jenkins kullanmaya başla’yı seçin
    • Jenkins kullanmaya başladığınızda web tarayıcınız boş bir sayfa görüntülerse, Jenkins hizmetini yeniden başlatın. SSH oturumundan sudo service jenkins restart yazın ve web tarayıcınızı yenileyin.
  • Gerekirse jenkins'te oluşturduğunuz kullanıcı adı ve parolayla oturum açın.

GitHub web kancası oluşturma

GitHub tümleştirmesini yapılandırmak için Azure örnek deposundan Node.js Hello World örnek uygulamasını açın. Depo için GitHub hesabınızda çatal oluşturmak üzere sağ üst köşedeki Fork (Çatal Oluştur) düğmesini seçin.

Oluşturduğunuz çatalın içinde bir web kancası oluşturun:

  • Ayarlar'ı ve ardından sol taraftaki Web Kancaları'nı seçin.
  • Web kancası ekle'yi seçin ve filtre kutusuna Jenkins yazın.
  • Yük URL'si için girinhttp://<publicIps>:8080/github-webhook/. Sondaki / karakterini eklemeyi unutmayın
  • İçerik türü için application/x-www-form-urlencoded öğesini seçin.
  • Bu web kancasını tetiklemek istediğiniz olaylar için Yalnızca gönderme olayı'nı seçin.
  • Etkin'i işaretli olarak ayarlayın.
  • Web kancası ekle'ye tıklayın.

Add GitHub webhook to your forked repo

Jenkins işi oluşturma

Jenkins’in GitHub’daki kod işleme gibi olaylara yanıt vermesini sağlamak için bir Jenkins işi oluşturun. Kendi GitHub çatalınız için URL’leri kullanın.

Jenkins web sitenizde, giriş sayfasından Yeni iş oluştur’u seçin:

  • İş adı olarak HelloWorld adını girin. Serbest tarzda proje’yi seçip Tamam’ı seçin.
  • Genel bölümünden GitHub projesi’ni seçip çatalı oluşturulan deponuzun URL’sini https://github.com/cynthn/nodejs-docs-hello-world şeklinde girin
  • Kaynak kodu yönetimi bölümünden Git’i seçip çatalı oluşturulan deponuzun .git URL’sini https://github.com/cynthn/nodejs-docs-hello-world.git şeklinde girin
  • Derleme Tetikleyicileri bölümünden GITScm yoklaması için GitHub kanca tetikleyicisi’ni seçin.
  • Derleme bölümünden Derleme adımı ekle’yi seçin. Kabuğu yürüt’ü seçin ve komut penceresine echo "Test" ifadesini girin.
  • İşler penceresinin en altından Kaydet’i belirleyin.

GitHub tümleştirmesini test etme

Jenkins ile GitHub tümleştirmesini test etmek için çatalınızda bir değişiklik işleyin.

GitHub web kullanıcı arabirimine dönerek çatalı oluşturulan deponuzu seçip index.js dosyasını seçin. Kalem simgesini seçerek bu dosyayı 6. satırda şu yazacak şekilde düzenleyin:

response.end("Hello World!");

Değişikliklerinizi işlemek için alttaki Değişiklikleri işle düğmesini seçin.

Jenkins’de işinizin bulunduğu sayfanın sol alt köşesindeki Derleme geçmişi bölümünün altında yeni bir derleme başlar. Derleme numarası bağlantısını seçip sol taraftan Konsol çıktısı’nı seçin. Kodunuz GitHub’dan çekilirken ve derleme eylemi tarafından konsola çıktı olarak Test mesajı iletilirken Jenkins’in uyguladığı adımları görebilirsiniz. GitHub’da her işleme gerçekleştirildiğinde web kancası bu şekilde Jenkins’e ulaşır ve yeni bir derleme tetikler.

Docker derleme görüntüsünü tanımlama

Node.js uygulamasının GitHub işlemelerinize bağlı olarak çalışmasını görmek için uygulamayı çalıştırmaya yönelik bir Docker görüntüsü oluşturalım. Görüntü, uygulamayı çalıştıran kapsayıcının nasıl yapılandırılacağını tanımlayan bir Dockerfile’dan oluşturulur.

VM’niz ile kurulan SSH bağlantısından, önceki adımlardan birinde oluşturduğunuz işin adını verdiğiniz Jenkins çalışma dizinine geçin. Bu örnekte HelloWorld olarak adlandırılmıştı.

cd /var/lib/jenkins/workspace/HelloWorld

sudo sensible-editor Dockerfile ile bu çalışma alanı dizininde bir dosya oluşturun ve aşağıdaki içeriği yapıştırın. Başta birinci satır olmak üzere Dockerfile’ın tamamının doğru bir şekilde kopyalandığından emin olun:

FROM node:alpine

EXPOSE 1337

WORKDIR /var/www
COPY package.json /var/www/
RUN npm install
COPY index.js /var/www/

Bu Dockerfile, Alpine Linux kullanan temel Node.js görüntüsünü kullanır, Hello World uygulamasının üzerinde çalıştığı 1337 bağlantı noktasını kullanıma açar ve sonra uygulama dosyalarını kopyalayıp uygulamayı başlatır.

Jenkins derleme kuralları oluşturma

Önceki adımlardan birinde, çıktı olarak konsola mesaj gönderen temel bir Jenkins derleme kuralı oluşturmuştunuz. Dockerfile’ımızı kullanmak için derleme adımını oluşturalım ve uygulamayı çalıştıralım.

Jenkins örneğine dönerek önceki adımlardan birinde oluşturduğunuz işi seçin. Sol taraftan Yapılandır’ı seçin ve aşağı kaydırarak Derleme bölümüne gidin:

  • Mevcut echo "Test" derleme adımınızı kaldırın. Mevcut derleme adımı kutusunun sağ üst köşesindeki kırmızı çarpı işaretini seçin.

  • Derleme adımı ekle’yi seçip Kabuğu yürüt’ü seçin

  • Komut kutusuna aşağıdaki Docker komutlarını girip Kaydet’i seçin:

    docker build --tag helloworld:$BUILD_NUMBER .
    docker stop helloworld && docker rm helloworld
    docker run --name helloworld -p 1337:1337 helloworld:$BUILD_NUMBER node /var/www/index.js &
    

Docker derleme adımları bir görüntü oluşturur ve görüntülerin geçmişini tutabilmeniz için bunu Jenkins derleme numarasıyla etiketler. Uygulamayı çalıştıran mevcut kapsayıcılar varsa bunlar durdurulup kaldırılır. Daha sonra, yeni bir kapsayıcı görüntüyü kullanmaya başlar ve GitHub’daki en son işlemeleri temel alarak Node.js uygulamanızı çalıştırır.

İşlem hattınızı test etme

İşlem hattının tamamını iş başında görmek için çatalı oluşturulan GitHub deponuzdaki index.js dosyasını yeniden düzenleyin ve Değişikliği işle’yi seçin. Jenkins’de GitHub’a yönelik web kancasını temel alan yeni bir iş başlatılır. Docker görüntüsünün oluşturulup uygulamanızın yeni bir kapsayıcıda başlatılması birkaç saniye alır.

Gerekirse VM’nizin genel IP adresini yeniden edinin:

az vm show --resource-group myResourceGroupJenkins --name myVM -d --query [publicIps] --o tsv

Bir web tarayıcısı açıp http://<publicIps>:1337 adresini girin. Node.js uygulamanız görüntülenir ve GitHub çatalınızdaki son işlemeleri aşağıdaki gibi gösterir:

Running Node.js app

Şimdi GitHub’daki index.js dosyasında bir düzenleme işlemi daha yapın ve değişikliği işleyin. Jenkins’deki işin tamamlanması için birkaç saniye bekleyin, sonra uygulamanızın güncelleştirilen sürümünün aşağıdaki gibi yeni bir kapsayıcıda çalıştığını görmek için web tarayıcınızı yenileyin:

Running Node.js app after another GitHub commit

Sonraki adımlar

Bu öğreticide, GitHub’ı her kod işlemesinde bir Jenkins derleme işi çalıştıracak ve sonra uygulamanızı test etmek için bir Docker kapsayıcısı dağıtacak şekilde yapılandırdınız. Şunları öğrendiniz:

  • Jenkins sanal makinesi oluşturma
  • Jenkins’i yükleme ve yapılandırma
  • GitHub ile Jenkins arasında web kancası tümleştirmesi oluşturma
  • GitHub işlemelerinden Jenkins derleme işleri oluşturma ve tetikleme
  • Uygulamanız için bir Docker görüntüsü oluşturma
  • GitHub işlemelerinin yeni Docker görüntüsü oluşturduğunu ve çalışmakta olan uygulamayı güncelleştirdiğini doğrulama

Jenkins’i Azure DevOps Services ile tümleştirme hakkında daha fazla bilgi edinmek için bir sonraki öğretici ilerleyin.