Tutorial: Membuat alur Jenkins menggunakan GitHub dan Docker

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.

Untuk mengotomatiskan fase build dan pengujian dari pengembangan aplikasi, Anda dapat menggunakan alur integrasi dan penyebaran berkelanjutan (CI/CD). Dalam tutorial ini, Anda membuat alur CI/CD di mesin virtual Azure termasuk cara:

  • Membuat mesin virtual Jenkins
  • Menginstal dan mengonfigurasikan Jenkins
  • Membuat integrasi webhook antara GitHub dan Jenkins
  • Membuat dan memicu pekerjaan pembuatan Jenkins dari penerapan GitHub
  • Membuat gambar Docker untuk aplikasi Anda
  • Memverifikasi gambar Docker baru penerapan GitHub dan memperbarui aplikasi yang sedang berjalan

Tutorial ini menggunakan CLI dalam Azure Cloud Shell, yang terus diperbarui ke versi terkini. Untuk membuka Cloud Shell, pilih Coba dari bagian atas blok kode apa pun.

Jika Anda memilih untuk menginstal dan menggunakan CLI secara lokal, tutorial ini mengharuskan Anda menjalankan Azure CLI versi 2.0.30 atau versi lebih baru. Jalankan az --version untuk menemukan versinya. Jika Anda perlu memasang atau meningkatkan, lihat Memasang Azure CLI.

Membuat instans Jenkins

Dalam tutorial sebelumnya tentang Cara menyesuaikan mesin virtual Linux pada boot pertama, Anda belajar cara mengotomatiskan kustomisasi VM dengan cloud-init. Tutorial ini menggunakan file cloud-init untuk memasang Jenkins dan Docker di mesin virtual. Jenkins adalah server otomatisasi sumber terbuka yang dapat berintegrasi dengan layanan Azure untuk mengaktifkan integrasi berkelanjutan (CI) dan penyebaran berkelanjutan (CD). Untuk tutorial selengkapnya tentang cara menggunakan Jenkins, lihat Jenkins di hub Azure.

Di shell Anda saat ini, buat file bernama cloud-init.txt dan tempelkan konfigurasi berikut. Misalnya, membuat file di Cloud Shell bukan di komputer lokal Anda. Ketik sensible-editor cloud-init-jenkins.txt untuk membuat file dan melihat daftar editor yang tersedia. Pastikan bahwa seluruh file cloud-init disalin dengan benar, terutama baris pertama:

#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

Sebelum Anda dapat membuat VM, buat grup sumber daya dengan grup az buat. Contoh berikut ini menampilkan cara membuat grup sumber daya bernama myResourceGroup di lokasi eastus:

az group create --name myResourceGroupJenkins --location eastus

Sekarang buat VM dengan az vm create. Gunakan parameter --custom-data untuk meneruskan file konfigurasi cloud-init Anda. Berikan jalur lengkap ke konfigurasi cloud-init.txt jika Anda menyimpan file di luar direktori kerja saat ini.

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

Dibutuhkan beberapa menit agar mesin virtual dibuat dan dikonfigurasi.

Untuk memungkinkan lalu lintas web mencapai mesin virtual Anda, gunakan az vm open-port untuk membuka port 8080 untuk lalu lintas Jenkins dan port 1337 untuk aplikasi Node.js yang digunakan untuk menjalankan aplikasi sampel:

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

Mengonfigurasi Jenkins

Untuk mengakses instans Jenkins Anda, dapatkan alamat IP publik mesin virtual:

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

Untuk tujuan keamanan, Anda perlu memasukkan kata sandi admin awal yang disimpan dalam file teks di mesin virtual Anda untuk memulai pemasangan Jenkins. Gunakan alamat IP publik yang diperoleh pada langkah sebelumnya ke SSH ke mesin virtual Anda:

ssh azureuser@<publicIps>

Verifikasi Jenkins berjalan menggunakan perintah service:

$ 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...
...

Lihat initialAdminPassword untuk pemasangan Jenkins Anda dan salin:

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

Jika file belum tersedia, tunggu beberapa menit lagi hingga cloud-init menyelesaikan pemasangan Jenkins dan Docker.

Sekarang buka browser web dan buka http://<publicIps>:8080. Selesaikan penyiapan Jenkins awal sebagai berikut:

  • Pilih Pilih plug-in yang akan dipasang
  • Cari GitHub di kotak teks di bagian atas. Centang kotak GitHub, lalu pilih Pasang
  • Buat objek pengguna admin pertama. Masukkan nama pengguna, seperti admin, lalu berikan kata sandi aman Anda sendiri. Terakhir, ketik nama lengkap dan alamat email.
  • Pilih Simpan dan Selesaikan
  • Setelah Jenkins siap, pilih Mulai menggunakan Jenkins
    • Jika browser web Anda menampilkan halaman kosong saat Anda mulai menggunakan Jenkins, mulai ulang layanan Jenkins. Dari sesi SSH Anda, ketik sudo service jenkins restart, lalu refresh browser web Anda.
  • Jika perlu, masuk ke Jenkins dengan nama pengguna dan kata sandi yang Anda buat.

Membuat webhook GitHub

Untuk mengonfigurasi integrasi dengan GitHub, buka aplikasi sampel Halo Dunia Node.js dari repositori sampel Azure. Untuk melakukan fork repositori ke akun GitHub Anda sendiri, pilih tombol Fork di sudut kanan atas.

Buat webhook di dalam fork yang Anda buat:

  • Pilih Pengaturan, lalu pilih Webhook di sisi kiri.
  • Pilih Tambahkan webhook, lalu masukkan Jenkins dalam kotak filter.
  • Untuk URL Payload, masukkan http://<publicIps>:8080/github-webhook/. Pastikan Anda menyertakan akhiran /
  • Untuk Jenis konten, pilih application/x-www-form-urlencoded.
  • Untuk Acara mana yang Anda pilih untuk pemicuan webhook ini?, pilih Hanya acara push.
  • Atur Aktif agar dicentang.
  • Pilih Tambahkan Webhook.

Add GitHub webhook to your forked repo

Membuat pekerjaan Jenkins

Agar Jenkins merespons suatu peristiwa di GitHub seperti melakukan kode, buat pekerjaan Jenkins. Gunakan URL untuk fork GitHub Anda sendiri.

Di situs web Jenkins Anda, pilih Buat pekerjaan baru dari halaman beranda:

  • Masukkan HelloWorld sebagai nama pekerjaan. Pilih proyek Freestyle, lalu pilih OK.
  • Di bawah bagian Umum, pilih Proyek GitHub dan masukkan URL repositori fork Anda, seperti https://github.com/cynthn/nodejs-docs-hello-world
  • Di bawah bagian Manajemen kode sumber, pilih Git, masukkan URL .git repositori fork Anda, seperti https://github.com/cynthn/nodejs-docs-hello-world.git
  • Di bawah bagian Pemicu Build, pilih GitHub hook trigger untuk polling GITscm.
  • Di bawah bagian Build, pilih Tambahkan langkah build. Pilih Jalankan shell, lalu masukkan echo "Test" di jendela perintah.
  • Pilih Simpan di bagian bawah halaman.

Menguji integrasi GitHub

Untuk menguji integrasi GitHub dengan Jenkins, terapkan perubahan di fork Anda.

Kembali ke UI web GitHub, pilih repositori fork Anda, lalu pilih file index.js. Pilih ikon pensil untuk mengedit file ini sehingga baris 6 berbunyi:

response.end("Hello World!");

Untuk melakukan perubahan, pilih tombol Terapkan perubahan di bagian bawah.

Di Jenkins, build baru dimulai di bawah bagian Build history di sudut kiri bawah halaman pekerjaan Anda. Pilih tautan nomor build dan pilih Output konsol di sisi kiri. Anda dapat melihat langkah-langkah yang diambil Jenkins saat kode Anda ditarik dari GitHub dan tindakan build mengeluarkan pesan Test ke konsol. Setiap kali penerapan dibuat dalam GitHub, webhook menjangkau Jenkins dan memicu build baru dengan cara ini.

Menentukan gambar build Docker

Untuk memastikan bahwa aplikasi Node.js berjalan berdasarkan GitHub Anda, mari buat gambar Docker untuk menjalankan aplikasi. Gambar dibangun dari Dockerfile yang menentukan cara mengonfigurasi kontainer yang menjalankan aplikasi.

Dari koneksi SSH ke mesin virtual Anda, ubah ke direktori ruang kerja Jenkins yang dinamai sesuai dengan pekerjaan yang Anda buat di langkah sebelumnya. Dalam contoh ini, direktori diberi nama HelloWorld.

cd /var/lib/jenkins/workspace/HelloWorld

Buat file di direktori ruang kerja ini dengan sudo sensible-editor Dockerfile dan tempel konten berikut. Pastikan bahwa seluruh Dockerfile disalin dengan benar, terutama baris pertama:

FROM node:alpine

EXPOSE 1337

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

Dockerfile ini menggunakan gambar Node.js dasar menggunakan Alpine Linux, mengekspos port 1337 yang dijalankan aplikasi Halo Dunia, lalu menyalin file aplikasi dan menginisialisasinya.

Membuat aturan build Jenkins

Pada langkah sebelumnya, Anda membuat aturan build Jenkins dasar yang mengeluarkan pesan ke konsol. Mari kita buat langkah build untuk menggunakan Dockerfile dan menjalankan aplikasi.

Kembali ke instans Jenkins Anda, pilih pekerjaan yang Anda buat di langkah sebelumnya. Pilih Konfigurasikan di sisi kiri dan gulir ke bawah ke bagian Build:

  • Hapus langkah build echo "Test" yang ada. Pilih palang merah di sudut kanan atas kotak langkah build yang ada.

  • Pilih Tambahkan langkah build, lalu pilih Jalankan shell

  • Dalam kotak Perintah, masukkan perintah Docker berikut, lalu pilih Simpan:

    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 &
    

Langkah-langkah build Docker membuat gambar dan menandainya dengan nomor build Jenkins sehingga Anda dapat mempertahankan riwayat gambar. Setiap kontainer yang ada, yang menjalankan aplikasi dihentikan dan kemudian dihapus. Kontainer baru kemudian mulai menggunakan gambar dan menjalankan aplikasi Node.js Anda berdasarkan penerapan terbaru di GitHub.

Uji alur Anda

Untuk melihat seluruh alur beraksi, edit file index.js di repositori fork GitHub Anda lagi dan pilih Terapkan perubahan. Pekerjaan baru dimulai di Jenkins berdasarkan webhook untuk GitHub. Dibutuhkan beberapa detik untuk membuat gambar Docker dan memulai aplikasi Anda dalam kontainer baru.

Jika diperlukan, dapatkan alamat IP publik mesin virtual Anda lagi:

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

Buka browser web dan masukkan http://<publicIps>:1337. Aplikasi Node.js Anda ditampilkan dan menunjukkan penerapan terbaru di fork GitHub sebagai berikut:

Running Node.js app

Sekarang buat pengeditan lain pada file index.js di GitHub dan lakukan perubahan. Tunggu beberapa detik hingga pekerjaan selesai di Jenkins, lalu refresh browser web Anda untuk melihat versi terbaru aplikasi berjalan dalam kontainer baru sebagai berikut:

Running Node.js app after another GitHub commit

Langkah berikutnya

Dalam tutorial ini, Anda mengonfigurasi GitHub untuk menjalankan pekerjaan build Jenkins pada setiap penerapan kode dan kemudian menyebarkan kontainer Docker untuk menguji aplikasi Anda. Anda mempelajari cara untuk:

  • Membuat mesin virtual Jenkins
  • Menginstal dan mengonfigurasikan Jenkins
  • Membuat integrasi webhook antara GitHub dan Jenkins
  • Membuat dan memicu pekerjaan pembuatan Jenkins dari penerapan GitHub
  • Membuat gambar Docker untuk aplikasi Anda
  • Memverifikasi gambar Docker baru penerapan GitHub dan memperbarui aplikasi yang sedang berjalan

Lanjutkan ke tutorial berikutnya untuk mempelajari selengkapnya tentang cara mengintegrasikan Jenkins dengan Layanan Azure DevOps.