Integrasi berkelanjutan dengan Jenkins

Melihat kembali bagaimana perangkat lunak dibuat dan digunakan bahkan 15 tahun yang lalu, tampaknya mengejutkan bahwa aplikasi kami benar-benar berfungsi. Pada masa itu, siklus pengembangan perangkat lunak terdiri dari menjalankan build di mesin lokal, menyalin artefak secara manual ke server penahapan, dan menguji setiap aplikasi secara manual melalui beberapa iterasi. Saat tim pengembang puas dengan pembuatannya, kami akan menerapkan aplikasi secara manual ke dalam produksi. Hal yang paling konsisten tentang gaya pengembangan ini adalah ketidakkonsistenan - dalam proses dan hasil.

Lebih dari satu dekade lalu, pengembang yang gesit mulai merangkul dan mempromosikan pengembangan yang digerakkan oleh pengujian dan integrasi berkelanjutan (CI). Dengan teknik ini kita dapat secara otomatis membangun kode sumber setiap kali pengembang memeriksanya ke dalam repositori sumber, mengeksekusi rangkaian pengujian unit lengkap untuk memastikan bahwa aplikasi berfungsi dengan baik. Banyak pengembang yang digerakkan oleh pengujian juga mulai melakukan pengujian integrasi dan pengujian kinerja dalam proses CI sekunder.

Dengan integrasi berkelanjutan, kami dapat mendeteksi kesalahan lebih cepat dan merilis kode jauh lebih cepat daripada yang kami lakukan di tahun-tahun sebelumnya. Tidaklah berlebihan untuk mengatakan bahwa CI menjinakkan sisi "build" dari siklus build-and-deploy. Saat ini banyak tim pengembang telah beralih dari CI ke CD, yang berarti pengiriman berkelanjutan atau penerapan berkelanjutan. Apa pun peruntukannya, CD adalah proses yang memindahkan perangkat lunak dari check-in kode ke pementasan, atau bahkan penerapan produksi.

Pemasangan proyek Java sumber terbuka ini memperkenalkan integrasi berkelanjutan dengan Jenkins, server otomatisasi terkemuka untuk CI / CD. Kami akan mulai dengan ikhtisar proses CI dan CD, lalu menyiapkan proyek web Java menggunakan Maven dan Jenkins. Anda akan mempelajari cara membuat dan menguji unit proyek di Jenkins dengan JUnit, serta cara memecahkan masalah kegagalan build. Anda juga akan menginstal dan menjalankan beberapa plugin Jenkins populer untuk pengujian dan pelaporan analisis kode statis.

Pengantar CI / CD

Dalam proses Integrasi berkelanjutan, kode yang telah diperiksa ke dalam repositori kode sumber dapat secara otomatis diperiksa, dibuat, diuji dalam berbagai cara, dan diterbitkan ke repositori. Agar integrasi berkelanjutan berfungsi, Anda memerlukan server CI seperti Jenkins, yang dapat memantau repositori kode sumber Anda untuk melihat perubahan baru dan merespons dengan cara yang dapat dikonfigurasi.

Ambil aplikasi Java yang dibuat menggunakan Maven sebagai contoh. Saat mendeteksi perubahan kode, server CI Anda dapat merespons dengan menjalankan file mvn clean install. Dalam konfigurasi build Maven tipikal, ini akan mengeksekusi serangkaian pengujian unit baru sebagai bagian dari perintah build. Saat kode sumber dibuat, server dapat menjalankan sejumlah tindakan tambahan:

  • Gabungkan cabang fitur Anda kembali ke cabang utama atau master Anda setelah kode berkomitmen lulus uji unit.
  • Jalankan analisis kode statis, seperti cakupan kode, kompleksitas kode, pemeriksaan bug umum, dll.
  • Publikasikan artefak build Anda ke repositori, seperti Artifactory atau Sonatype Nexus
  • Terapkan aplikasi Anda ke lingkungan pengujian integrasi
  • Jalankan tes integrasi
  • Terapkan aplikasi Anda ke lingkungan uji kinerja
  • Jalankan uji beban terhadap aplikasi Anda
  • Deploy aplikasi Anda ke User Acceptance Testing Environment (UAT)
  • Terapkan aplikasi Anda ke produksi

Langkah-langkah ini adalah semua jenis aktivitas yang mungkin Anda lakukan sebagai bagian dari proses CI / CD. CI biasanya mencakup fase pembangunan dan pengujian dari siklus hidup pengembangan, sedangkan CD memperluas proses itu untuk menerapkan artefak build ke server untuk pengujian. Di beberapa lingkungan, CD digunakan untuk produksi.

Integrasi Berkelanjutan biasanya dilakukan menggunakan fitur seperti Jenkins, Bamboo, atau TeamCity, yang mengatur langkah-langkah build Anda ke dalam pipeline integrasi. Jenkins mungkin adalah produk CI / CD paling populer, dan cocok dengan Docker.

Unduh dan pasang Jenkins

Jenkins adalah server integrasi berkelanjutan dan banyak lagi. Ini terdiri dari mesin otomatisasi dan ekosistem plugin yang mendukung integrasi berkelanjutan, pengujian otomatis, dan pengiriman berkelanjutan. Anda menyesuaikan jalur pengiriman tergantung pada kebutuhan Anda.

Ada banyak cara untuk menjalankan Jenkins:

  1. Unduh file WAR dan instal pada wadah servlet di komputer lokal Anda.
  2. Siapkan mesin virtual di cloud publik seperti AWS dan host Jenkins di sana.
  3. Memanfaatkan penyedia cloud Jenkins seperti CloudBees.
  4. Siapkan Jenkins dalam instalasi uji coba menggunakan Docker.

Saya akan menunjukkan kepada Anda cara mengatur instalasi lokal dan instalasi uji Docker.

Unduh dan pasang Jenkins secara lokal

Mulailah dengan mendownload Jenkins dan memilih rilis Long-Term Support (LTS) dari halaman beranda Jenkins. Karena saya menggunakan Mac, penginstalan mengunduh pkgfile secara otomatis , yang ditempatkan jenkins.wardi Application/Jenkinsfolder saya . File WAR dapat digunakan untuk semua kontainer servlet.

Anda juga ingin mengunduh dan menginstal Apache Tomcat. Saat tulisan ini dibuat, versi terbaru dari Tomcat adalah 8.5.4, tetapi Anda harus dapat menjalankan versi terbaru. Unduh file zipatau tar.gzdan dekompresi ke hard drive Anda. Salin file jenkins.war ke webappsfolder Tomcat dan kemudian jalankan file bin/startup.shatau bin/startup.bat. Anda dapat menguji bahwa itu berjalan dengan membuka browser Anda ke: //localhost:8080.

Untuk memulai Jenkins, buka browser ke URL: // localhost: 8080 / jenkins.

Anda harus mendapatkan layar yang terlihat seperti Gambar 1.

Steven Haines

Berikutnya, Jenkins menciptakan password administrasi dan menulis bahwa kedua untuk Tomcat logs/catalina.outfile log dan direktori home berikut: .jenkins/secrets/initialAdminPassword. Ambil kata sandi, masukkan dalam elemen formulir kata sandi Administrasi (ditunjukkan pada Gambar 1), dan tekan Lanjutkan . Anda akan diminta untuk menginstal plugin yang disarankan atau memilih plugin untuk diinstal. Untuk saat ini saya sarankan menginstal plugin yang disarankan.

Sekarang Anda akan diminta untuk membuat pengguna admin. Masukkan informasi pengguna admin Anda dan tekan Simpan dan Selesai . Terakhir, klik Mulai menggunakan Jenkins . Sekarang Anda akan melihat beranda Jenkins, seperti yang ditunjukkan pada Gambar 2.

Steven Haines

Konfigurasi aplikasi contoh dengan Maven

Sebelum kita dapat menggunakan Jenkins untuk membangun proyek web Java dengan Maven, kita perlu menyiapkan kedua teknologi ini. Di balik sistem, Jenkins akan memeriksa kode sumber dari repositori kode sumber ke direktori lokal dan mengeksekusi target Maven yang Anda tentukan. Agar bisa berfungsi, Anda perlu menginstal satu atau beberapa versi Maven, memberi tahu Jenkins di mana mereka menginstal, dan mengonfigurasi versi Maven yang Anda ingin Jenkins gunakan saat membuat aplikasi.

Dari dasbor Jenkins, klik Kelola Jenkins dan pilih Konfigurasi Alat Global . Hal pertama yang akan kita lakukan adalah mengkonfigurasi JDK. Di bawah bagian JDK, klik Add JDK , beri nama (milik saya adalah "JDK8"), dan biarkan default Install from java.sun.com dicentang. Terima perjanjian lisensi Oracle, lalu klik tautan "Silakan masukkan nama pengguna / kata sandi Anda". Masukkan nama pengguna dan kata sandi Oracle Anda dan tekan Tutup . Anda akan disajikan dengan layar yang mirip dengan Gambar 3.

Steven Haines

Klik Apply untuk menyimpan pekerjaan Anda, kemudian scroll ke bawah ke bagian Maven dan klik Add Maven . Masukkan nama untuk Maven (nama saya adalah "Maven 3.3.9"), biarkan "Instal Otomatis" dan "Instal dari Apache" dicentang. Klik Simpan saat Anda siap. Anda akan disajikan dengan layar yang mirip dengan Gambar 4.

Steven Haines

Git sudah dikonfigurasi sebelumnya dengan Jenkins, jadi Anda sekarang harus sudah menginstal semua alat yang Anda perlukan untuk checkout dan membangun proyek Java dari Git dengan Maven.

Instal Jenkins di container Docker

If you don't want to install Jenkins on your local machine, you have the option of running it in a Docker container. The official Jenkins Docker image lets you run and test an installation of Jenkins without actually configuring it on a local machine.

Installing Docker

See my introduction to Docker for a beginner's guide to Docker, including installation and setup instructions.

Assuming you already have Docker setup in your development environment, you can launch Jenkins from the Docker the command line:

 docker run -p 8080:8080 -p 50000:50000 -v /your/home/jenkins:/var/jenkins_home -d jenkins 

This command tells Docker to run the latest release of jenkins with the following options:

  • -p 8080:8080: Maps port 8080 on the Docker container to port 8080 on the Docker host, so that you can connect to the Jenkins web app on port 8080.
  • -p 50000:50000: Maps port 50000 on the Docker container to port 50000 on the Docker host. Jenkins uses this port internally to allow build slave executors to connect to the master Jenkins server.
  • -v /your/home/jenkins:/var/jenkins_home: Maps Jenkins data storage to your local directory, so that you can restart your Docker container without losing your data.
  • -d: Lets you run the Docker container in a detached mode, or as a daemon process.

The following shows the output for running these commands:

 $ docker run -p 8000:8080 -v /Users/shaines/jenkins/:/var/jenkins_home -d jenkins cc16573ce71ae424d4122e9e4afd3a294fda6606e0333838fe332fc4e11d0d53 

Because we're running our Docker container in detached mode, we need to follow the logs that are output by Jenkins. You can do so with the docker logs -f command. Just pass in the first few hexadecimal numbers of the container ID, in this case cc16573ce71ae424d4122e9e4afd3a294fda6606e0333838fe332fc4e11d0d53:

 $ docker logs -f cc1 Running from: /usr/share/jenkins/jenkins.war webroot: EnvVars.masterEnvVars.get("JENKINS_HOME") ... ************************************************************* ************************************************************* ************************************************************* Jenkins initial setup is required. An admin user has been created and a password generated. Please use the following password to proceed to installation: 205be6fe69c447dd933a3c9ce7420496 This may also be found at: /var/jenkins_home/secrets/initialAdminPassword ************************************************************* ************************************************************* ************************************************************* 

Setup Jenkins CI for a Java web app

Selanjutnya kita akan menyiapkan pekerjaan aplikasi web Java sederhana di Jenkins. Karena aplikasinya tidak penting untuk tutorial ini, kita akan menggunakan aplikasi contoh Hello, World Servlet saya yang sederhana, yang telah saya hosting di GitHub.

Untuk menguji Jenkins, Anda harus dapat melakukan perubahan ke repositori kode sumber, jadi Anda harus membuat repositori itu sekarang. Di beranda Jenkins, klik tombol Buat pekerjaan baru dan masukkan nama proyek Anda. Anda akan diminta untuk memilih jenis proyek, seperti yang ditunjukkan pada Gambar 5.

Steven Haines

Kami akan memilih jenis proyek Freestyle untuk proyek ini, tetapi Anda harus mengetahui pilihan Anda:

  • Proyek gaya bebas: Jenis proyek yang paling umum ini memungkinkan Anda memantau repositori kode sumber dan menggunakan sistem build apa pun, seperti Maven dan Ant.
  • Pipeline: Choose this project type for complicated projects with moving parts that you need to coordinate across multiple build slaves.
  • External job: Use this to configure an automated external job that you want to track in Jenkins as part of your build.
  • Multi-configuration project: This is the job type for projects that require different configurations for different environments, such as production, staging, and test.
  • Folder: When you have a complicated build then you might want to organize things into folders, each with their own distinct namespace.
  • Multi-branch pipeline: automatically create a set of pipeline projects, based on the code branches that are defined in your source code repository

Enter a project name, in this case "hello-world-servlet", and choose "OK". Next, choose GitHub project, then enter the GitHub URL of your project: //github.com/ligado/hello-world-servlet.

Under Source Code Management, choose Git and enter the same project URL.

In the Build Triggers section, choose Build when a change is pushed to GitHub so that Jenkins will build your code anytime you push a change to GitHub.

Di bagian Build, tambahkan langkah build baru, pilih Panggil target Maven level atas , pilih instance Maven yang Anda konfigurasikan sebelumnya (seperti "Maven 3.3.9") dan masukkan instal bersih di bidang tujuan. Kosongkan Post-build Actions untuk saat ini. Saat Anda selesai, tekan Simpan .

Saat Anda kembali ke dasbor, Anda akan melihat layar seperti Gambar 6.

Steven Haines

Untuk menguji konfigurasi Anda, tekan tombol Build Now di sebelah proyek hello-world-servlet. Anda akan melihat sebuah build berhasil dieksekusi dalam Build History di sisi kiri halaman proyek, seperti yang ditunjukkan pada Gambar 7.

Steven Haines

Untuk melihat apa yang sebenarnya terjadi, klik build lalu klik Output Konsol , yang akan menunjukkan semua langkah yang dilakukan Jenkins dan hasilnya. Output konsol ada di bawah.