Pengantar Jenkins 2 dan Kekuatan Pipelines

1. Ikhtisar

Pada artikel ini, kami akan menunjukkan penggunaan pipeline melalui contoh pengiriman berkelanjutan menggunakan Jenkins.

Kami akan membangun pipeline yang sederhana, namun cukup berguna, untuk proyek sampel kami:

  • Kompilasi
  • Analisis statis sederhana (paralel dengan kompilasi)
  • Tes unit
  • Tes integrasi (paralel dengan tes unit)
  • Penyebaran

2. Menyiapkan Jenkins

Pertama-tama, kita perlu mengunduh Jenkins versi stabil terbaru (2.73.3 pada saat menulis artikel ini).

Mari arahkan ke folder tempat file kita berada dan jalankan menggunakan perintah java -jar jenkins.war . Perlu diingat bahwa kami tidak dapat menggunakan Jenkins tanpa penyiapan pengguna awal.

Setelah membuka kunci Jenkins dengan menggunakan kata sandi yang dibuat admin awal, kita harus mengisi informasi profil pengguna admin pertama dan pastikan untuk menginstal semua plugin yang direkomendasikan.

Sekarang kami memiliki instalasi Jenkins baru yang siap digunakan.

Semua versi Jenkins yang tersedia dapat ditemukan di sini.

3. Saluran pipa

Jenkins 2 hadir dengan fitur hebat yang disebut Pipelines , yang sangat bisa dikembangkan ketika kita perlu mendefinisikan lingkungan integrasi berkelanjutan untuk sebuah proyek.

Pipeline adalah cara lain untuk menentukan beberapa langkah Jenkins menggunakan kode , dan mengotomatiskan proses penerapan perangkat lunak.

Ini menggunakan Domain Specific Language (DSL) dengan dua sintaks berbeda:

  • Pipa Deklaratif
  • Pipa Skrip

Dalam contoh kita, kita akan menggunakan yang Scripted Pipeline yang mengikuti model pemrograman yang lebih penting dibangun dengan Groovy .

Mari kita bahas beberapa karakteristik plugin Pipeline :

  • pipeline ditulis ke dalam file teks dan diperlakukan sebagai kode; ini berarti mereka dapat ditambahkan ke kontrol versi dan dimodifikasi nanti
  • mereka akan tetap ada setelah restart server Jenkins
  • kami secara opsional dapat menjeda saluran pipa
  • mereka mendukung persyaratan yang kompleks seperti melakukan pekerjaan secara paralel
  • plugin Pipeline juga dapat diperpanjang atau diintegrasikan dengan plugin lain

Dengan kata lain, menyiapkan proyek Pipeline berarti menulis skrip yang secara berurutan akan menerapkan beberapa langkah dari proses yang ingin kita selesaikan.

Untuk mulai menggunakan pipelines, kita harus menginstal plugin Pipeline yang memungkinkan pembuatan otomatisasi sederhana dan kompleks.

Secara opsional, kita dapat memiliki Tampilan Panggung Pipeline juga sehingga saat menjalankan build, kita akan melihat semua tahapan yang telah kita konfigurasikan.

4. Contoh Cepat

Untuk contoh kami, kami akan menggunakan aplikasi Spring Boot kecil. Kami kemudian akan membuat pipeline yang mengkloning proyek, membangunnya dan menjalankan beberapa pengujian, lalu menjalankan aplikasi.

Mari instal plugin Checkstyle , Static Analysis Collector, dan JUnit , yang masing-masing berguna untuk mengumpulkan hasil Checkstyle , membuat grafik analisis gabungan dari laporan pengujian dan menggambarkan pengujian yang berhasil dijalankan dan gagal.

Pertama, mari kita pahami alasan Checkstyle di sini: ini adalah alat pengembangan yang membantu pemrogram menulis kode Java yang lebih baik mengikuti standar yang diterima dan terkenal.

Kolektor Analisis Statis adalah add-on yang mengumpulkan keluaran analisis berbeda dan mencetak hasilnya dalam grafik tren gabungan. Selain itu, plugin menyediakan pelaporan kesehatan dan membangun stabilitas berdasarkan hasil yang dikelompokkan ini.

Terakhir, plugin JUnit menyediakan penerbit yang menggunakan laporan pengujian XML yang dihasilkan selama pembuatan dan keluaran informasi yang rinci dan bermakna relatif terhadap pengujian proyek.

Kami juga akan mengonfigurasi Checkstyle di pom.xml aplikasi kami :

 org.apache.maven.plugins maven-checkstyle-plugin 2.17 

5. Membuat Script Pipeline

Pertama, kita perlu membuat pekerjaan Jenkins baru. Mari pastikan untuk memilih Pipeline sebagai tipe sebelum menekan tombol OK seperti yang dijelaskan dalam tangkapan layar ini:

Layar berikutnya memungkinkan kita untuk mengisi lebih detail tentang berbagai langkah pekerjaan Jenkins kita, seperti deskripsi , pemicu , beberapa opsi proyek lanjutan:

Mari selami bagian utama dan terpenting dari jenis pekerjaan ini dengan mengklik tab Pipeline .

Kemudian, untuk definisinya pilih Pipeline script dan centang Use Groovy Sandbox.

Berikut ini skrip kerja untuk lingkungan Unix:

node { stage 'Clone the project' git '//github.com/eugenp/tutorials.git' dir('spring-jenkins-pipeline') { stage("Compilation and Analysis") { parallel 'Compilation': { sh "./mvnw clean install -DskipTests" }, 'Static Analysis': { stage("Checkstyle") { sh "./mvnw checkstyle:checkstyle" step([$class: 'CheckStylePublisher', canRunOnFailed: true, defaultEncoding: '', healthy: '100', pattern: '**/target/checkstyle-result.xml', unHealthy: '90', useStableBuildAsReference: true ]) } } } stage("Tests and Deployment") { parallel 'Unit tests': { stage("Runing unit tests") { try { sh "./mvnw test -Punit" } catch(err) { step([$class: 'JUnitResultArchiver', testResults: '**/target/surefire-reports/TEST-*UnitTest.xml']) throw err } step([$class: 'JUnitResultArchiver', testResults: '**/target/surefire-reports/TEST-*UnitTest.xml']) } }, 'Integration tests': { stage("Runing integration tests") { try { sh "./mvnw test -Pintegration" } catch(err) { step([$class: 'JUnitResultArchiver', testResults: '**/target/surefire-reports/TEST-' + '*IntegrationTest.xml']) throw err } step([$class: 'JUnitResultArchiver', testResults: '**/target/surefire-reports/TEST-' + '*IntegrationTest.xml']) } } stage("Staging") { sh "pid=\$(lsof -i:8989 -t); kill -TERM \$pid " + "|| kill -KILL \$pid" withEnv(['JENKINS_NODE_COOKIE=dontkill']) { sh 'nohup ./mvnw spring-boot:run -Dserver.port=8989 &' } } } } }

Pertama, kami menggandakan repositori dari GitHub, lalu mengubah direktori ke proyek kami, yang disebut spring-jenkins-pipeline.

Selanjutnya, kami menyusun proyek dan menerapkan analisis Checkstyle secara paralel.

Langkah berikut merepresentasikan eksekusi paralel dari pengujian unit dan pengujian integrasi, lalu penerapan aplikasi.

Paralelisme digunakan untuk mengoptimalkan pipeline, dan membuat tugas berjalan lebih cepat. Ini adalah praktik terbaik di Jenkins untuk secara bersamaan menjalankan beberapa tindakan independen yang dapat memakan banyak waktu.

Misalnya, dalam proyek dunia nyata, kami biasanya memiliki banyak pengujian unit dan integrasi yang membutuhkan waktu lebih lama.

Perhatikan bahwa jika ada pengujian yang gagal, BUILD juga akan ditandai sebagai GAGAL dan penerapan tidak akan terjadi.

Selain itu, kami menggunakan JENKINS_NODE_COOKIE untuk mencegah penutupan langsung aplikasi kami saat pipeline mencapai akhir.

Untuk melihat skrip yang lebih umum yang bekerja pada sistem lain yang berbeda, lihat repositori GitHub.

6. Laporan Analisis

Setelah membuat pekerjaan, kami akan menyimpan skrip kami dan menekan Build Now di rumah proyek dasbor Jenkins kami.

Berikut ringkasan dari build tersebut:

Sedikit lebih jauh ke bawah kita akan menemukan tampilan panggung dari pipeline, dengan hasil dari setiap tahapan:

Setiap keluaran dapat diakses saat mengarahkan kursor ke sel tahapan dan mengklik tombol Log untuk melihat pesan log yang dicetak pada langkah itu.

We can also find more details of the code analysis. Let's click on the desired build from the Build History on the right menu and hit Checkstyle Warnings.

Here we see 60 high priority warnings browsable by clicking:

The Details tab displays pieces of information that highlight warnings and enable the developer to understand the causes behind them.

In the same way, the full test report is accessible by clicking on Test Result link. Let's see the results of the com.baeldung package:

Here we can see each test file with its duration and status.

7. Conclusion

Dalam artikel ini, kami menyiapkan lingkungan pengiriman berkelanjutan sederhana untuk menjalankan dan menampilkan analisis kode statis dan laporan pengujian di Jenkins melalui tugas Pipeline .

Seperti biasa, kode sumber untuk artikel ini dapat ditemukan di GitHub.