Integrasi berterusan dengan Jenkins

Melihat kembali bagaimana perisian dibina dan digunakan bahkan 15 tahun yang lalu, nampaknya mengejutkan bahawa aplikasi kita benar-benar berfungsi. Pada masa itu, kitaran hidup pengembangan perisian terdiri daripada menjalankan build pada mesin tempatan, menyalin artifak secara manual ke pelayan pementasan, dan menguji setiap aplikasi secara manual melalui beberapa lelaran. Apabila pasukan dev berpuas hati dengan pembuatannya, kami akan menerapkan aplikasi secara manual ke dalam produksi. Perkara yang paling konsisten mengenai gaya pembangunan ini adalah ketidakkonsistenan - dalam proses dan hasilnya.

Lebih dari satu dekad yang lalu, pemaju lincah mula merangkul dan mempromosikan pembangunan yang berasaskan ujian dan integrasi berterusan (CI). Dengan teknik-teknik ini, kita dapat membuat kod sumber secara automatik setiap kali pengembang memasukkannya ke repositori sumber, menjalankan rangkaian uji unit lengkap untuk memastikan aplikasi berfungsi dengan baik. Banyak pembangun yang didorong oleh ujian juga mula melakukan ujian integrasi dan ujian prestasi dalam proses CI sekunder.

Dengan integrasi berterusan, kami dapat mengesan ralat dengan lebih cepat dan mengeluarkan kod jauh lebih pantas daripada yang kami lakukan pada tahun-tahun sebelumnya. Tidak keterlaluan untuk mengatakan bahawa CI menjinakkan sisi "build" dari kitaran build-and-deploy. Hari-hari ini banyak pasukan dev telah bergerak melampaui CI ke CD, yang bermaksud penghantaran berterusan atau penyebaran berterusan. Apa pun sebutannya, CD adalah proses yang memindahkan perisian dari daftar masuk kod ke pementasan, atau bahkan penggunaan produksi.

Pemasangan projek Java sumber terbuka ini memperkenalkan integrasi berterusan dengan Jenkins, pelayan automasi terkemuka untuk CI / CD. Kita akan mulakan dengan gambaran keseluruhan proses CI dan CD, kemudian siapkan projek web Java menggunakan Maven dan Jenkins. Anda akan belajar membuat dan menguji unit projek di Jenkins dengan JUnit, serta bagaimana menyelesaikan masalah kegagalan membina. Anda juga akan memasang dan menjalankan sebilangan plugin Jenkins yang popular untuk ujian dan laporan analisis kod statik.

Pengenalan CI / CD

Dalam proses Integrasi yang berterusan, kod yang telah diperiksa ke repositori kod sumber dapat diperiksa secara otomatis, dibangun, diuji dengan berbagai cara, dan diterbitkan ke repositori. Agar integrasi berterusan berfungsi, anda memerlukan pelayan CI seperti Jenkins, yang dapat memantau repositori kod sumber anda untuk perubahan baru dan bertindak balas dengan cara yang dapat dikonfigurasi.

Ambil aplikasi Java yang dibina menggunakan Maven sebagai contoh. Apabila mengesan perubahan kod, pelayan CI anda dapat bertindak balas dengan menjalankan a mvn clean install. Dalam konfigurasi build Maven yang biasa, ia akan menjalankan satu set ujian unit baru sebagai sebahagian daripada perintah build. Semasa kod sumber sedang dibina, pelayan dapat melakukan sejumlah tindakan tambahan:

  • Gabungkan cabang ciri anda kembali ke cabang utama atau induk anda setelah kod yang diberi komitmen lulus ujian unit.
  • Jalankan analisis kod statik, seperti liputan kod, kerumitan kod, pemeriksaan bug biasa, dll.
  • Terbitkan artifak binaan anda ke repositori, seperti Artifactory atau Sonatype Nexus
  • Terapkan aplikasi anda ke persekitaran ujian integrasi
  • Laksanakan ujian integrasi
  • Terapkan aplikasi anda ke persekitaran ujian prestasi
  • Jalankan ujian beban terhadap aplikasi anda
  • Terapkan aplikasi anda ke Lingkungan Uji Penerimaan Pengguna (UAT)
  • Sebarkan aplikasi anda ke produksi

Langkah-langkah ini adalah semua jenis aktiviti yang mungkin anda laksanakan sebagai bagian dari proses CI / CD. CI biasanya merangkumi fasa pembangunan dan pengujian kitaran hayat pengembangan, sedangkan CD memperluas proses tersebut untuk menggunakan artifak binaan ke pelayan untuk diuji. Dalam beberapa persekitaran, CD menuju ke penghasilan.

Integrasi Berterusan biasanya dilakukan dengan menggunakan alat seperti Jenkins, Bamboo, atau TeamCity, yang mengatur langkah-langkah membangun anda ke saluran integrasi. Jenkins mungkin merupakan produk CI / CD yang paling popular, dan berpasangan dengan Docker.

Muat turun dan pasang Jenkins

Jenkins adalah pelayan integrasi berterusan dan banyak lagi. Ini terdiri daripada mesin automasi dan ekosistem plugin yang menyokong integrasi berterusan, ujian automatik, dan penghantaran berterusan. Anda menyesuaikan saluran penghantaran bergantung pada keperluan anda.

Terdapat banyak cara untuk menjalankan Jenkins:

  1. Muat turun fail WAR dan pasangkannya pada bekas servlet pada komputer tempatan anda.
  2. Sediakan mesin maya di awan awam seperti AWS dan hoskan Jenkins di sana.
  3. Manfaatkan penyedia awan Jenkins seperti CloudBees.
  4. Siapkan Jenkins dalam pemasangan ujian menggunakan Docker.

Saya akan menunjukkan kepada anda bagaimana untuk menyiapkan pemasangan tempatan dan pemasangan ujian Docker.

Muat turun dan pasang Jenkins secara tempatan

Mulakan dengan memuat turun Jenkins dan memilih pelepasan Sokongan Jangka Panjang (LTS) dari laman utama Jenkins. Kerana saya menggunakan Mac, pemasangan memuat turun pkgfail secara automatik , yang diletakkan jenkins.wardi dalam Application/Jenkinsfolder saya . Fail WAR dapat disebarkan ke wadah servlet mana pun.

Anda juga ingin memuat turun dan memasang Apache Tomcat. Untuk penulisan ini, versi terbaru Tomcat ialah 8.5.4, tetapi anda seharusnya dapat menjalankan versi terbaru. Muat turun zipatau tar.gzfail dan nyahmampatkannya ke cakera keras anda. Salin fail jenkins.war ke webappsfolder Tomcat dan kemudian jalankan fail bin/startup.shatau bin/startup.bat. Anda boleh menguji bahawa ia sedang berjalan dengan membuka pelayar anda untuk: //localhost:8080.

Untuk memulakan Jenkins, buka penyemak imbas ke URL: // localhost: 8080 / jenkins.

Anda harus mendapatkan skrin yang kelihatan seperti Gambar 1.

Steven Haines

Seterusnya, Jenkins mewujudkan kata laluan pentadbiran dan menulis bahawa kedua-dua untuk Tomcat yang logs/catalina.outfail log dan direktori rumah berikut: .jenkins/secrets/initialAdminPassword. Ambil kata laluan, masukkan dalam elemen bentuk kata laluan Pentadbiran (ditunjukkan dalam Rajah 1), dan tekan Teruskan . Anda akan diminta untuk memasang plugin yang dicadangkan atau memilih plugin yang akan dipasang. Buat masa ini saya cadangkan memasang pemalam yang dicadangkan.

Sekarang anda akan diminta untuk membuat pengguna pentadbir. Masukkan maklumat pengguna pentadbir anda dan tekan Simpan dan Selesaikan . Akhirnya, klik Mula menggunakan Jenkins . Anda sekarang akan melihat laman utama Jenkins, seperti yang ditunjukkan dalam Gambar 2.

Steven Haines

Konfigurasikan aplikasi contoh dengan Maven

Before we can use Jenkins to build a Java web project with Maven, we need to setup both of these technologies. Under-the-hood, Jenkins will checkout source code from a source code repository to a local directory and execute the Maven targets that you specify. For that to work, you need to install one or more versions of Maven, tell Jenkins where they're installed, and configure the version of Maven that you want Jenkins to use when building your application.

Dari papan pemuka Jenkins, klik Urus Jenkins dan pilih Konfigurasi Alat Global . Perkara pertama yang akan kita lakukan ialah mengkonfigurasi JDK. Di bawah bahagian JDK, klik Tambah JDK , beri nama (nama saya adalah "JDK8"), dan biarkan Pemasangan lalai dari java.sun.com dicentang . Terima perjanjian lesen Oracle, kemudian klik pautan "Sila masukkan nama pengguna / kata laluan anda". Masukkan nama pengguna dan kata laluan Oracle anda dan tekan Tutup . Anda akan disajikan dengan layar yang serupa dengan Gambar 3.

Steven Haines

Klik Terapkan untuk menyimpan karya anda, kemudian tatal ke bawah ke bahagian Maven dan klik Tambah Maven . Masukkan nama untuk Maven (nama saya "Maven 3.3.9"), biarkan "Pasang Secara Automatik" dan "Pasang dari Apache" dicentang Klik Simpan apabila anda sudah bersedia. Anda harus disertakan dengan layar yang serupa dengan Gambar 4.

Steven Haines

Git dilengkapi dengan Jenkins, jadi sekarang anda harus memasang semua alat yang anda perlukan untuk memeriksa dan membuat projek Java dari Git with Maven.

Pasang Jenkins dalam bekas 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

Seterusnya kita akan menyiapkan pekerjaan aplikasi web Java yang sederhana di Jenkins. Kerana aplikasi ini tidak penting untuk tutorial ini, kami akan menggunakan aplikasi contoh Hello, World Servlet yang ringkas, yang telah saya hoskan di GitHub.

Untuk menguji Jenkins, anda mesti dapat melakukan perubahan pada repositori kod sumber, jadi anda harus membuat repositori itu sekarang. Di laman utama Jenkins, klik butang Buat pekerjaan baru dan masukkan nama projek anda. Anda akan diminta untuk memilih jenis projek, seperti yang ditunjukkan pada Gambar 5.

Steven Haines

Kami akan memilih jenis projek Gaya Bebas untuk projek ini, tetapi anda harus mengetahui pilihan anda:

  • Projek gaya bebas: Jenis projek yang paling biasa ini membolehkan anda memantau repositori kod sumber dan menggunakan mana-mana sistem binaan, 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 bahagian Build, tambahkan langkah build baru, pilih Invoke target Maven level teratas , pilih instance Maven yang anda konfigurasikan sebelumnya (seperti "Maven 3.3.9") dan masukkan pemasangan bersih di medan tujuan. Biarkan Tindakan Pasca Binaan kosong buat masa ini. Setelah selesai, tekan Simpan .

Apabila anda kembali ke papan pemuka, anda akan melihat skrin yang serupa dengan Gambar 6.

Steven Haines

Untuk menguji konfigurasi anda, tekan butang Build Now di sebelah projek hello-world-servlet. Anda mesti melihat binaan dilaksanakan dengan jayanya dalam Sejarah Binaan di sebelah kiri halaman projek, seperti yang ditunjukkan dalam Rajah 7.

Steven Haines

Untuk melihat dengan tepat apa yang berlaku, klik pada build dan kemudian klik Console Output , yang akan menunjukkan kepada anda semua langkah yang dilakukan oleh Jenkins dan hasilnya. Keluaran konsol ada di bawah.