Tutorial: Sebarkan dari GitHub ke Azure Kubernetes Service menggunakan Jenkins

Penting

Banyak layanan Azure memiliki plug-in Jenkins. Beberapa plug-in ini dihentikan pada 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:

  • Menyebarkan contoh aplikasi suara Azure ke kluster AKS.
  • Buat proyek Jenkins dasar.
  • Siapkan info masuk agar Jenkins berinteraksi dengan ACR.
  • Buat pekerjaan build Jenkins dan GitHub webhook untuk build otomatis.
  • Uji alur CI/CD untuk memperbarui aplikasi di AKS berdasarkan komit kode GitHub.

Prasyarat

Untuk menyelesaikan tutorial ini, Anda memerlukan hal berikut:

Menyiapkan aplikasi Anda

Pada artikel ini, Anda menggunakan contoh aplikasi suara Azure yang berisi antarmuka web dan Redis untuk penyimpanan data sementara.

Sebelum Anda mengintegrasikan Jenkins dan AKS untuk penyebaran otomatis, persiapkan dan sebarkan aplikasi suara Azure secara manual ke kluster AKS Anda. Penyebaran manual ini memungkinkan Anda melihat aplikasi dalam tindakan.

Catatan

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

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

Kloning fork ke sistem pengembangan Anda. Pastikan Anda menggunakan URL fork Anda saat mengkloning repo ini:

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

Ubah ke direktori fork kloning Anda:

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 dibangun. Anda kemudian dapat menggunakan perintah docker images untuk melihat gambar yang dibuat. Tiga citra telah diunduh atau dibuat. Gambar azure-vote-front berisi aplikasi dan menggunakan gambar nginx-flask sebagai dasar. 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 Azure Container Registry.

az acr login -n <acrLoginServer>

Ganti <acrLoginServer> dengan nama server masuk ACR Anda.

Gunakan perintah docker tag untuk menandai gambar dengan nama server login ACR dan nomor versi v1. Gunakan nama <acrLoginServer> Anda sendiri 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 masuk 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, Anda dapat menggunakan file manifes Kubernetes di root repo repositori suara Azure. Buka file manifes azure-vote-all-in-one-redis.yaml dengan editor seperti vi. Ganti microsoft dengan nama server login ACR Anda. Nilai ini ditemukan pada baris 60 dari 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 penyeimbang beban Kubernetes dibuat untuk mengekspos aplikasi ke internet. Proses ini memerlukan waktu beberapa menit. Untuk memantau kemajuan penyebaran penyeimbang beban, gunakan perintah kubectl get service dengan argumen --watch. Saat alamat EXTERNAL-IP berubah dari tertunda menjadi alamat IP, gunakan Control + C untuk menghentikan proses memantau kubectl.

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

NAME               TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
azure-vote-front   LoadBalancer   10.0.215.27   <pending>     80:30747/TCP   22s
azure-vote-front   LoadBalancer   10.0.215.27   40.117.57.239   80:30747/TCP   2m

Untuk melihat aplikasi yang sedang berjalan, buka browser web ke alamat IP eksternal layanan Anda. Aplikasi pemilihan 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 Jenkins Controller:

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 menjadi Jenkins Controller

ssh azureuser@<PublicIPAddres>

Ganti <PublicIPAddress> dengan alamat IP Dari Jenkins Controller.

Instal & Masuk ke AzCLI

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

Catatan

Untuk menginstal AzCLI secara manual, ikuti petunjuk ini.

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;

Menginstal Kubectl dan Menghubungkan 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 menahan nama server masuk ACR. Variabel ini direferensikan selama pekerjaan build Jenkins. Untuk membuat variabel lingkungan ini, selesaikan langkah berikut:

  • Di sisi kiri portal Jenkins, pilih Kelola Jenkins>Konfigurasikan Sistem

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

    Variabel lingkungan Jenkins

  • Setelah selesai, pilih Simpan di bagian bawah halaman.

Membuat info masuk Jenkins untuk ACR

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

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

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

Membuat perwakilan layanan agar Jenkins dapat menggunakan ACR

Buat perwakilan 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 info masuk 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 menetapkan hak Kontributor perwakilan layanan ke registri ACR.

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

Ganti <appId> dengan nilai yang disediakan dalam output dari penggunaan perintah pervious untuk membuat perwakilan layanan.

Membuat sumber daya info masuk di Jenkins untuk perwakilan layanan ACR

Dengan penetapan peran yang dibuat di Azure, sekarang simpan info masuk ACR Anda di objek info masuk Jenkins. Info masuk ini direferensikan selama pekerjaan build Jenkins.

Kembali di sisi kiri portal Jenkins, pilih Kelola Jenkins>Kelola Info Masuk>Penyimpanan Jenkins>Info masuk global (tidak terbatas)>Tambahkan Info Masuk

Pastikan jenis info masuk adalah Nama Pengguna dengan kata sandi dan masukkan item berikut:

  • Nama pengguna - AppId dari perwakilan layanan yang dibuat untuk autentikasi dengan registri ACR Anda.
  • Kata sandi - Kata sandi perwakilan layanan yang dibuat untuk autentikasi dengan registri ACR Anda.
  • ID - Pengenal info masuk seperti acr-credentials

Setelah selesai, formulir info masuk terlihat seperti contoh berikut:

Membuat objek kredensial Jenkins dengan informasi perwakilan layanan

Pilih OK dan kembali ke portal Jenkins.

Membuat proyek Jenkins

Dari halaman 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 repo bercabang Anda, seperti https://github.com/<your-github-account>/azure-voting-app-redis

  3. Di bawah bagian Pengelolaan kode sumber, pilih Git, masukkan URL .gitrepo bercabang 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 menambahkan Langkah Build jenis Jalankan shell dan gunakan teks berikut. Skrip ini membuat 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 Jalankan 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 build Jenkins

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

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

Pada menu sebelah kiri proyek, pilih Build Now.

Build pengujian Jenkins

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

Build melakukan tugas-tugas berikut:

  1. Mengkloning repositori GitHub
  2. Membuat gambar kontainer baru
  3. Mendorong gambar kontainer ke registri ACR
  4. Memperbarui gambar yang digunakan oleh penyebaran AKS

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

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

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 berkomitmen untuk GitHub.

Untuk membuat webhook GitHub, selesaikan langkah-langkah berikut:

  1. Telusuri ke repositori GitHub bercabang Anda 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/, yang mana <publicIp> alamat IP server Jenkins. Pastikan untuk menyertakan akhiran /. Biarkan default lainnya untuk tipe konten dan memicu pada 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 kode komit ke GitHub, langkah-langkah berikut terjadi:

  1. Webhook GitHub memberi tahu Jenkins.
  2. Jenkins memulai pekerjaan membangun dan menarik kode penerapan 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 berjalan di Azure Kubernetes Service diperbarui dengan gambar terbaru dari Azure Container Registry.

Di mesin 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, lakukan perubahan, dan dorong ke garpu repositori GitHub Anda. Webhook GitHub memicu pekerjaan build baru di Jenkins. Di dasbor web Jenkins, pantau proses pembuatannya. Dibutuhkan beberapa detik untuk menarik kode terbaru, membuat dan mendorong gambar yang diperbarui, dan menyebarkan aplikasi yang diperbarui di AKS.

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

Sampel suara Azure di AKS yang diperbarui oleh pekerjaan build Jenkins

Langkah berikutnya