Tutorial: Menyebarkan dari GitHub ke Azure Kubernetes Service menggunakan Jenkins

Penting

Meskipun banyak layanan Azure memiliki plug-in Jenkins, sebagian besar plug-in ini mengakhiri dukungan per 29 Februari 2024. Azure CLI adalah cara yang saat ini direkomendasikan untuk mengintegrasikan Jenkins dengan layanan Azure. Untuk informasi selengkapnya, lihat artikel Plug-in Jenkins untuk Azure.

Tutorial ini menyebarkan aplikasi sampel dari GitHub ke kluster Azure Kubernetes Service (AKS) dengan menyiapkan integrasi berkelanjutan (CI) dan penyebaran berkelanjutan (CD) di Jenkins.

Dalam tutorial ini, Anda akan menyelesaikan tugas-tugas ini:

  • Sebarkan sampel aplikasi suara Azure ke kluster AKS.
  • Buat proyek Jenkins dasar.
  • Siapkan kredensial agar Jenkins berinteraksi dengan ACR.
  • Buat tugas build Jenkins dan atur webhook GitHub untuk build otomatis.
  • Uji alur CI/CD untuk memperbarui aplikasi di AKS berdasarkan komit kode GitHub.

Prasyarat

Untuk menyelesaikan tutorial ini, Anda memerlukan item ini:

Menyiapkan aplikasi Anda

Dalam artikel ini, Anda menggunakan sampel aplikasi pemungutan suara Azure yang berisi antarmuka web dan Redis untuk penyimpanan data sementara.

Sebelum Anda mengintegrasikan Jenkins dan AKS untuk penyebaran otomatis, pertama-tama siapkan dan sebarkan aplikasi suara Azure secara manual ke kluster AKS Anda. Penyebaran manual ini memungkinkan Anda melihat aplikasi beraksi.

Nota

Contoh aplikasi pemungutan suara Azure menggunakan pod Linux yang dijadwalkan untuk berjalan pada node Linux. Alur yang diuraikan dalam artikel ini juga berfungsi untuk pod Windows Server yang dijadwalkan pada node Windows Server.

Fork repositori GitHub berikut untuk aplikasi sampel - https://github.com/Azure-Samples/azure-voting-app-redis. Untuk membuat fork repositori ke akun GitHub Anda sendiri, pilih tombol Fork di sudut kanan atas.

Klon fork ke sistem pengembangan Anda. Pastikan Anda menggunakan URL fork Anda saat mengkloning repositori ini:

git clone https://github.com/<your-github-account>/azure-voting-app-redis.git

Pindah ke direktori fork yang telah Anda kloning:

cd azure-voting-app-redis

Untuk membuat gambar kontainer yang diperlukan untuk aplikasi sampel, gunakan file docker-compose.yaml dengan docker-compose:

docker-compose up -d

Gambar dasar yang diperlukan ditarik dan kontainer aplikasi dibuat. Anda kemudian dapat menggunakan perintah gambar docker untuk melihat gambar yang dibuat. Tiga gambar telah diunduh atau dibuat. Gambar azure-vote-front berisi aplikasi dan menggunakan gambar nginx-flask sebagai basis. Gambar redis digunakan untuk memulai instans Redis:

$ docker images

REPOSITORY                   TAG        IMAGE ID            CREATED             SIZE
azure-vote-front             latest     9cc914e25834        40 seconds ago      694MB
redis                        latest     a1b99da73d05        7 days ago          106MB
tiangolo/uwsgi-nginx-flask   flask      788ca94b2313        9 months ago        694MB

Masuk ke registri kontainer Azure Anda.

az acr login -n <acrLoginServer>

Ganti <acrLoginServer> dengan server masuk ACR Anda.

Gunakan perintah docker tag untuk memberi tag pada citra dengan nama server masuk ACR dan nomor versi v1. Gunakan nama Anda sendiri <acrLoginServer> yang diperoleh pada langkah sebelumnya:

docker tag azure-vote-front <acrLoginServer>/azure-vote-front:v1

Terakhir, dorong gambar azure-vote-front ke registri ACR Anda. Sekali lagi, ganti <acrLoginServer> dengan nama server login registri ACR Anda sendiri, seperti myacrregistry.azurecr.io:

docker push <acrLoginServer>/azure-vote-front:v1

Menyebarkan aplikasi sampel ke AKS

Untuk menyebarkan aplikasi sampel ke kluster AKS, Anda dapat menggunakan file manifes Kubernetes di akar repositori suara Azure. azure-vote-all-in-one-redis.yaml Buka file manifes dengan editor seperti vi. Ganti microsoft dengan nama server masuk ACR Anda. Nilai ini ditemukan pada baris 60 file manifes:

containers:
- name: azure-vote-front
  image: azuredocs/azure-vote-front

Selanjutnya, gunakan perintah kubectl apply untuk menyebarkan aplikasi ke kluster AKS Anda:

kubectl apply -f azure-vote-all-in-one-redis.yaml

Layanan load balancer Kubernetes dibuat untuk mengekspos aplikasi ke internet. Proses ini memerlukan waktu beberapa menit. Untuk memantau kemajuan deployment load balancer, gunakan perintah kubectl get service dengan argumen --watch.

$ kubectl get service azure-vote-front --watch

Setelah alamat EXTERNAL-IP berubah dari tertunda ke alamat IP, gunakan Control + C untuk menghentikan proses kubectl watch.

NAME               TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE

Untuk melihat aplikasi beraksi, buka browser web ke alamat IP eksternal layanan Anda. Aplikasi suara Azure ditampilkan, seperti yang ditunjukkan dalam contoh berikut:

Aplikasi pemungutan suara sampel Azure yang berjalan di AKS

Mengonfigurasi Pengontrol Jenkins

Terapkan perubahan berikut untuk mengaktifkan penyebaran AKS dari Pengontrol Jenkins:

Buka port 80 masuk.

az vm open-port \
--resource-group <Resource_Group_name> \
--name <Jenkins_Controller_VM>  \
--port 80 --priority 1020

Ganti <Resource_Group_name> dan <Jenkins_Controller_VM> dengan nilai yang sesuai.

SSH ke dalam Pengontrol Jenkins

ssh azureuser@<PublicIPAddress>

Ganti <PublicIPAddress> dengan alamat IP Pengontrol Jenkins.

Instal & Masuk ke AzCLI

curl -L https://aka.ms/InstallAzureCli | bash
az login

Nota

Untuk menginstal AzCLI secara manual, ikuti instruksi berikut.

Menginstal Docker

sudo apt-get 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 apt-key fingerprint 0EBFCD88;
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable";
sudo apt-get update;
sudo apt-get install docker-ce -y;

Instal Kubectl dan Sambungkan ke AKS

sudo az aks install-cli
sudo az aks get-credentials --resource-group <Resource_Group> --name <AKS_Name>

Ganti <Resource_Group> dan <AKS_Name> dengan nilai yang sesuai.

Mengonfigurasi akses

sudo usermod -aG docker jenkins;
sudo usermod -aG docker azureuser;
sudo touch /var/lib/jenkins/jenkins.install.InstallUtil.lastExecVersion;
sudo service jenkins restart;
sudo cp ~/.kube/config /var/lib/jenkins/.kube/
sudo chmod 777 /var/lib/jenkins/
sudo chmod 777 /var/lib/jenkins/config

Membuat variabel lingkungan Jenkins

Variabel lingkungan Jenkins digunakan untuk menyimpan nama server login ACR. Variabel ini dirujuk selama pekerjaan build Jenkins. Untuk membuat variabel lingkungan ini, selesaikan langkah-langkah berikut:

  • Di sisi kiri portal Jenkins, pilih Kelola Jenkins>Configure System

  • Di bawah Properti Global, pilih Variabel lingkungan. Tambahkan variabel dengan nama ACR_LOGINSERVER dan nilai server login ACR Anda.

    Variabel lingkungan Jenkins

  • Setelah selesai, Pilih Simpan di bagian bawah halaman.

Membuat kredensial Jenkins untuk ACR

Selama proses CI/CD, Jenkins membangun gambar kontainer baru berdasarkan pembaruan aplikasi, dan kemudian perlu mendorong gambar tersebut ke registri ACR.

Untuk memungkinkan Jenkins mendorong gambar kontainer yang diperbarui ke ACR, Anda perlu menentukan kredensial untuk ACR.

Untuk pemisahan peran dan izin, konfigurasikan prinsipal layanan untuk Jenkins dengan izin Kontributor ke registri ACR Anda.

Membuat prinsipal layanan untuk Jenkins dalam menggunakan ACR

Pertama, buat prinsipal layanan menggunakan perintah az ad sp create-for-rbac :

az ad sp create-for-rbac

Perintah ini menghasilkan output yang mirip dengan contoh berikut:

{
  "appId": "<app-ID>",
  "displayName": "azure-cli-2018-09-28-22-19-34",
  "name": "http://azure-cli-2018-09-28-22-19-34",
  "password": "<password>",
  "tenant": "<tenant-ID>"
}

Catat appId dan kata sandi. Nilai-nilai ini digunakan dalam langkah-langkah berikut untuk mengonfigurasi sumber daya kredensial di Jenkins.

Dapatkan ID sumber daya registri ACR Anda menggunakan perintah az acr show , dan simpan sebagai variabel.

ACR_ID=$(az acr show --resource-group <Resource_Group> --name <acrLoginServer> --query "id" --output tsv)

Ganti <Resource_Group> dan <acrLoginServer> dengan nilai yang sesuai.

Buat penetapan peran untuk memberikan hak Kontributor kepada prinsipal layanan di registri ACR.

az role assignment create --assignee <appID> --role Contributor --scope $ACR_ID

Ganti <appId> dengan nilai yang disediakan dalam output dari perintah sebelumnya yang digunakan untuk membuat principal layanan.

Membuat sumber daya kredensial di Jenkins untuk perwakilan layanan ACR

Dengan penetapan peran yang dibuat di Azure, sekarang simpan kredensial ACR Anda di objek kredensial Jenkins. Kredensial ini digunakan selama proses build Jenkins.

Kembali ke sisi kiri portal Jenkins, pilih Kelola Kredensial Jenkins>Manage Credentials>Jenkins Store>Global credentials (unrestricted)>Add Credentials

Pastikan bahwa jenis kredensial adalah Nama pengguna dengan kata sandi dan masukkan item berikut:

  • Nama pengguna - ID aplikasi perwakilan layanan yang dibuat untuk autentikasi dengan registri ACR Anda.
  • Kata sandi - Kata sandi prinsipal layanan yang dibuat untuk autentikasi dengan registri ACR Anda.
  • ID - Pengidentifikasi kredensial, seperti acr-credentials

Setelah selesai, formulir kredensial terlihat seperti contoh berikut:

Membuat objek kredensial Jenkins dengan informasi perwakilan layanan

Pilih OK dan kembali ke portal Jenkins.

Membuat proyek Jenkins

Dari beranda portal Jenkins Anda, pilih Item baru di sisi kiri:

  1. Masukkan azure-vote sebagai nama pekerjaan. Pilih Proyek freestyle, lalu pilih OK

  2. Di bawah bagian Umum , pilih proyek GitHub dan masukkan URL repositori fork Anda, seperti https://github.com/<your-github-account>/azure-voting-app-redis

  3. Di bawah bagian Manajemen kode sumber , pilih Git, masukkan URL repositori .git fork Anda, seperti https://github.com/<your-github-account>/azure-voting-app-redis.git

  4. Di bawah bagian Pemicu Build , pilih pemicu kait GitHub untuk polling GITscm

  5. Di bawah Lingkungan Build, pilih Gunakan teks atau file rahasia

  6. Di bawah Pengikatan, pilih Tambahkan>Nama Pengguna dan kata sandi (dipisahkan)

    • Masukkan ACR_ID untuk Variabel Nama Pengguna, dan ACR_PASSWORD untuk Variabel Kata Sandi

      Pengikatan Jenkins

  7. Pilih untuk menambah Langkah Build jenis Execute Shell dan gunakan teks berikut. Skrip ini membangun gambar kontainer baru dan mendorongnya ke registri ACR Anda.

    # Build new image and push to ACR.
    WEB_IMAGE_NAME="${ACR_LOGINSERVER}/azure-vote-front:kube${BUILD_NUMBER}"
    docker build -t $WEB_IMAGE_NAME ./azure-vote
    docker login ${ACR_LOGINSERVER} -u ${ACR_ID} -p ${ACR_PASSWORD}
    docker push $WEB_IMAGE_NAME
    
  8. Tambahkan Langkah Build lain dari jenis execute shell dan gunakan teks berikut. Skrip ini memperbarui penyebaran aplikasi di AKS dengan gambar kontainer baru dari ACR.

    # Update kubernetes deployment with new image.
    WEB_IMAGE_NAME="${ACR_LOGINSERVER}/azure-vote-front:kube${BUILD_NUMBER}"
    kubectl set image deployment/azure-vote-front azure-vote-front=$WEB_IMAGE_NAME
    
  9. Setelah selesai, klik Simpan.

Menguji proyek Jenkins

Sebelum Anda mengotomatiskan pekerjaan berdasarkan penerapan GitHub, uji build Jenkins secara manual.

Build ini memvalidasi bahwa pekerjaan telah dikonfigurasi dengan benar. Ini mengonfirmasi file autentikasi Kubernetes yang tepat ada, dan autentikasi tersebut ke ACR berfungsi.

Di menu sebelah kiri proyek, pilih Bangun Sekarang.

Pengujian build Jenkins

Build pertama lebih lama karena lapisan gambar Docker ditarik ke bawah ke server Jenkins.

Proses build melakukan tugas-tugas berikut:

  1. Menggandakan repositori GitHub
  2. Membangun citra kontainer baru
  3. Mendorong gambar kontainer ke registri ACR
  4. Memperbarui gambar yang dipakai oleh deployment AKS

Karena tidak ada perubahan yang dilakukan pada kode aplikasi, antarmuka pengguna web tidak berubah.

Setelah pekerjaan build selesai, pilih build #1 di bawah riwayat build. Pilih Output Konsol dan lihat output dari proses build. Baris akhir harus menunjukkan pembangunan yang berhasil.

Membuat webhook GitHub

Dengan build manual yang sukses lengkap, sekarang integrasikan GitHub ke dalam build Jenkins. Gunakan webhook untuk menjalankan pekerjaan build Jenkins setiap kali kode diterapkan ke GitHub.

Untuk membuat webhook GitHub, selesaikan langkah-langkah berikut:

  1. Telusuri ke repositori GitHub yang telah Anda fork di browser web.

  2. Pilih Pengaturan, lalu pilih Webhook di sisi kiri.

  3. Pilih untuk Menambahkan webhook. Untuk URL Payload, masukkan http://<publicIp:8080>/github-webhook/, di mana <publicIp> adalah alamat IP server Jenkins. Pastikan untuk menyertakan yang terakhir /. Biarkan default lainnya untuk jenis konten dan untuk memicu peristiwa push.

  4. Pilih Tambahkan webhook.

    Membuat webhook GitHub untuk Jenkins

Menguji alur CI/CD lengkap

Sekarang Anda dapat menguji seluruh alur CI/CD. Saat Anda mendorong penerapan kode ke GitHub, langkah-langkah berikut terjadi:

  1. Webhook GitHub menginformasikan Jenkins.
  2. Jenkins memulai pekerjaan build dan menarik penerapan kode terbaru dari GitHub.
  3. Build Docker dimulai menggunakan kode yang diperbarui, dan gambar kontainer baru ditandai dengan nomor build terbaru.
  4. Gambar kontainer baru ini didorong ke Azure Container Registry.
  5. Aplikasi Anda yang berjalan di Azure Kubernetes Service diperbarui dengan gambar terbaru dari Azure Container Registry.

Pada komputer pengembangan Anda, buka aplikasi kloning dengan editor kode. Di bawah direktori /azure-vote/azure-vote , buka file bernama config_file.cfg. Perbarui nilai suara dalam file ini ke sesuatu selain kucing dan anjing, seperti yang ditunjukkan dalam contoh berikut:

# UI Configurations
TITLE = 'Azure Voting App'
VOTE1VALUE = 'Blue'
VOTE2VALUE = 'Purple'
SHOWHOST = 'false'

Saat diperbarui, simpan file, terapkan perubahan, dan dorong ke fork repositori GitHub Anda. Webhook GitHub memicu pekerjaan build baru di Jenkins. Di dasbor web Jenkins, pantau proses build. Hanya butuh beberapa detik untuk mengambil kode terbaru, membuat dan mengirim gambar terbaru, serta menyebarkan aplikasi terbaru di AKS.

Setelah build selesai, refresh browser web Anda dari sampel aplikasi pemungutan suara Azure. Perubahan Anda ditampilkan, seperti yang ditunjukkan dalam contoh berikut:

Sampel pemungutan suara Azure pada AKS yang diperbarui oleh tugas pembangunan Jenkins

Langkah selanjutnya