Pengenalan kepada Jenkins 2 dan Kekuatan Paip

1. Gambaran keseluruhan

Dalam artikel ini, kami akan menunjukkan penggunaan saluran paip melalui contoh penyampaian berterusan menggunakan Jenkins.

Kami akan membina saluran paip yang mudah namun berguna untuk contoh projek kami:

  • Penyusunan
  • Analisis statik sederhana (selari dengan penyusunan)
  • Ujian unit
  • Ujian integrasi (selari dengan ujian unit)
  • Penyebaran

2. Menubuhkan Jenkins

Pertama sekali, kita perlu memuat turun Jenkins versi stabil terkini (2.73.3 semasa menulis artikel ini).

Mari menavigasi ke folder di mana fail kita berada dan jalankan menggunakan perintah java -jar jenkins.war . Perlu diingat bahawa kami tidak dapat menggunakan Jenkins tanpa persediaan pengguna awal.

Setelah membuka kunci Jenkins dengan menggunakan kata laluan yang dibuat oleh pentadbir awal, kami mesti mengisi maklumat profil pengguna pentadbir pertama dan pastikan untuk memasang semua pemalam yang disyorkan.

Sekarang kita mempunyai pemasangan baru Jenkins yang siap digunakan.

Semua versi Jenkins boleh didapati di sini.

3. Saluran paip

Jenkins 2 dilengkapi dengan ciri hebat yang disebut Pipeline , yang sangat luas apabila kita perlu menentukan persekitaran integrasi yang berterusan untuk sesuatu projek.

Pipeline adalah cara lain untuk menentukan beberapa langkah Jenkins menggunakan kod , dan mengotomatisasi proses penyebaran perisian.

Ia menggunakan Bahasa Spesifik Domain (DSL) dengan dua sintaksis yang berbeza:

  • Saluran Paip Deklaratif
  • Paip Skrip

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

Mari kita perhatikan beberapa ciri plugin Pipeline :

  • saluran paip ditulis ke dalam fail teks dan dianggap sebagai kod; ini bermaksud mereka boleh ditambahkan ke kawalan versi dan diubah suai di kemudian hari
  • mereka akan kekal selepas memulakan semula pelayan Jenkins
  • kita boleh menjeda saluran paip secara pilihan
  • mereka menyokong keperluan yang kompleks seperti melaksanakan kerja secara selari
  • plugin Pipeline juga boleh diperluas atau disatukan dengan plugin lain

Dengan kata lain, menyiapkan projek Pipeline bermaksud menulis skrip yang secara berurutan akan menerapkan beberapa langkah proses yang ingin kita laksanakan.

Untuk mula menggunakan saluran paip, kita mesti memasang plugin Pipeline yang membolehkan menyusun automasi yang mudah dan kompleks.

Kita juga boleh mempunyai Paparan Tahap Pipa juga sehingga ketika kita menjalankan build, kita akan melihat semua tahap yang telah kita konfigurasikan.

4. Contoh Pantas

Sebagai contoh, kami akan menggunakan aplikasi Spring Boot kecil. Kami kemudian akan membuat saluran paip yang mengklon projek, membinanya dan menjalankan beberapa ujian, kemudian menjalankan aplikasi.

Mari pasang plugin Checkstyle , Static Analysis Collector dan JUnit , yang masing-masing berguna untuk mengumpulkan hasil Checkstyle , membina graf analisis gabungan laporan ujian dan menggambarkan ujian yang berjaya dilaksanakan dan gagal.

Pertama, mari kita fahami alasan Gaya Pemeriksaan di sini: ini adalah alat pengembangan yang membantu pengaturcara menulis kod Java yang lebih baik mengikut piawaian yang diterima dan terkenal.

Static Analysis Collector adalah alat tambah yang mengumpulkan hasil analisis yang berbeza dan mencetak hasilnya dalam graf trend gabungan. Selain itu, pemalam menyediakan pelaporan kesihatan dan membina kestabilan berdasarkan hasil yang dikumpulkan ini.

Akhirnya, plugin JUnit menyediakan penerbit yang menggunakan laporan ujian XML yang dihasilkan semasa membuat dan mengeluarkan maklumat terperinci dan bermakna berkaitan dengan ujian projek.

Kami juga akan mengkonfigurasi Gaya Pemeriksaan di pom.xml aplikasi kami :

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

5. Membuat Skrip Paip

Pertama, kita perlu membuat pekerjaan Jenkins baru. Pastikan untuk memilih Paip sebagai jenis sebelum menekan butang OK seperti yang dijelaskan dalam tangkapan skrin ini:

Skrin seterusnya membolehkan kami mengisi lebih banyak butiran mengenai pelbagai langkah pekerjaan Jenkins kami, seperti keterangan , pencetus , beberapa pilihan projek lanjutan:

Mari selami bahagian utama dan terpenting dari pekerjaan seperti ini dengan mengklik pada tab Pipeline .

Kemudian, untuk definisi pilih skrip Pipeline dan periksa Use Groovy Sandbox.

Berikut adalah skrip kerja untuk persekitaran 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 mengklon repositori dari GitHub, kemudian mengubah direktori ke projek kami, yang disebut spring-jenkins-pipeline.

Seterusnya, kami menyusun projek dan menerapkan analisis Checkstyle secara selari.

Langkah berikut menunjukkan pelaksanaan ujian unit dan ujian integrasi yang selari, kemudian penerapan aplikasi.

Paralelisme digunakan untuk mengoptimumkan saluran paip, dan pekerjaan berjalan lebih cepat. Merupakan amalan terbaik di Jenkins untuk menjalankan tindakan bebas secara serentak yang memerlukan banyak masa.

Sebagai contoh, dalam projek dunia nyata, kita biasanya mempunyai banyak ujian unit dan integrasi yang boleh memakan masa lebih lama.

Perhatikan bahawa jika ada ujian yang gagal, BUILD akan ditandai sebagai GAGAL juga dan penyebaran tidak akan berlaku.

Juga, kami menggunakan JENKINS_NODE_COOKIE untuk mengelakkan penutupan segera aplikasi kami apabila saluran paip sampai ke penghujungnya.

Untuk melihat skrip yang lebih umum yang berfungsi pada sistem lain yang berbeza, periksa repositori GitHub.

6. Laporan Analisis

Setelah membuat tugas, kami akan menyimpan skrip kami dan memukul Build Now di rumah projek papan pemuka Jenkins kami.

Berikut adalah gambaran keseluruhan binaan:

Sedikit lebih jauh kita akan melihat pemandangan panggung, dengan hasil dari setiap peringkat:

Setiap output dapat diakses ketika melayang di atas sel tahap dan mengklik butang Log untuk melihat mesej log dicetak pada langkah itu.

Kami juga boleh mendapatkan lebih banyak perincian analisis kod. Mari klik pada build yang diinginkan dari Sejarah Build di menu sebelah kanan dan tekan Checkstyle Warnings.

Di sini kita melihat 60 amaran keutamaan tinggi yang boleh dilayari dengan mengklik:

The Details memaparkan tab cebisan maklumat yang menonjolkan amaran dan membolehkan pemaju untuk memahami sebab-sebab di belakang mereka.

Dengan cara yang sama, laporan ujian penuh dapat diakses dengan mengklik pada pautan Hasil Uji . Mari lihat hasil pakej com.baeldung :

Di sini kita dapat melihat setiap fail ujian dengan jangka masa dan statusnya.

7. Kesimpulannya

Dalam artikel ini, kami menyiapkan lingkungan penyampaian berterusan yang mudah untuk menjalankan dan menunjukkan analisis kod statik dan laporan ujian di Jenkins melalui pekerjaan Pipeline .

Seperti biasa, kod sumber untuk artikel ini boleh didapati di GitHub.