Apa itu Jenkins? Pelayan CI menerangkan

Jenkins menawarkan cara mudah untuk mengatur persekitaran integrasi berterusan atau penghantaran berterusan (CI / CD) untuk hampir semua kombinasi bahasa dan repositori kod sumber menggunakan saluran paip, serta mengotomatisasi tugas pembangunan rutin lain. Walaupun Jenkins tidak menghilangkan keperluan untuk membuat skrip untuk langkah-langkah individu, ini memberi anda cara yang lebih cepat dan lebih mantap untuk mengintegrasikan keseluruhan rangkaian alat binaan, ujian, dan penyebaran anda daripada yang dapat anda buat sendiri.

"Jangan hancurkan bangunan malam!" adalah peraturan utama di kedai pengembangan perisian yang memposting versi produk harian yang baru dibina setiap pagi untuk penguji mereka. Sebelum Jenkins, yang terbaik yang dapat dilakukan oleh pembangun untuk mengelakkan kerosakan pada bangunan malam adalah membina dan menguji dengan teliti dan berjaya pada mesin tempatan sebelum melakukan kod tersebut. Tetapi itu bermaksud menguji perubahan seseorang secara terpencil, tanpa komitmen harian orang lain. Tidak ada jaminan tegas bahawa bangunan malam akan bertahan dari komitmen seseorang.

Jenkins - awalnya Hudson - adalah tindak balas langsung terhadap batasan ini.

Hudson dan Jenkins

Pada tahun 2004, Kohsuke Kawaguchi adalah pemaju Java di Sun. Kawaguchi bosan memecahkan binaan dalam kerja pengembangannya dan ingin mencari jalan untuk mengetahui, sebelum memberikan kod ke repositori, apakah kod itu akan berfungsi. Jadi Kawaguchi membina pelayan automasi di dan untuk Java untuk mewujudkannya, yang disebut Hudson. Hudson menjadi popular di Sun, dan tersebar ke syarikat lain sebagai sumber terbuka.

Maju cepat ke 2011, dan perselisihan antara Oracle (yang telah memperoleh Sun) dan komuniti sumber terbuka Hudson yang bebas menyebabkan pertikaian dengan perubahan nama, Jenkins. Pada tahun 2014 Kawaguchi menjadi CTO CloudBees, yang menawarkan produk penghantaran berterusan berasaskan Jenkins.

Kedua-dua garpu terus wujud, walaupun Jenkins jauh lebih aktif. Hari ini, projek Jenkins masih aktif. Laman web Hudson ditutup pada 31 Jan 2020.

Pada bulan Mac 2019, Yayasan Linux, bersama dengan CloudBees, Google, dan sejumlah syarikat lain, melancarkan asas perisian sumber terbuka baru yang dinamakan Continuous Delivery Foundation (CDF). Penyumbang Jenkins memutuskan bahawa projek mereka harus bergabung dengan yayasan baru ini. Kawaguchi menulis pada masa itu bahawa tidak ada yang penting akan berubah untuk pengguna.

Pada Januari 2020 Kawaguchi mengumumkan dia akan beralih ke startup barunya, Dilancarkan. Dia juga mengatakan bahawa dia secara rasmi akan mundur dari Jenkins, walaupun tinggal di Jawatankuasa Pengawasan Teknikal Yayasan Penghantaran Berterusan, dan menukar peranannya di CloudBees menjadi penasihat.

Video berkaitan: Cara menyampaikan kod dengan lebih pantas dengan CI / CD

Automasi Jenkins

Hari ini Jenkins adalah pelayan automasi sumber terbuka terkemuka dengan sekitar 1.600 pemalam untuk menyokong automasi semua jenis tugas pembangunan. Masalah yang pada awalnya cuba diselesaikan oleh Kawaguchi, penyatuan berterusan dan penyampaian kod Java secara berterusan (iaitu membangun projek, menjalankan ujian, melakukan analisis kod statik, dan menyebarkan) hanyalah salah satu dari banyak proses yang diotomatisasi orang dengan Jenkins. 1.600 pemalam itu merangkumi lima bidang: platform, UI, pentadbiran, pengurusan kod sumber, dan, paling kerap, pengurusan binaan.

Bagaimana Jenkins berfungsi

Jenkins diedarkan sebagai arkib WAR dan sebagai pakej pemasang untuk sistem operasi utama, sebagai pakej Homebrew, sebagai gambar Docker, dan sebagai kod sumber. Kod sumbernya kebanyakannya Java, dengan beberapa fail Groovy, Ruby, dan Antlr.

Anda boleh menjalankan Jenkins WAR secara mandiri atau sebagai servlet dalam pelayan aplikasi Java seperti Tomcat. Dalam kedua-dua keadaan, ia menghasilkan antara muka pengguna web dan menerima panggilan ke REST API-nya.

Apabila anda menjalankan Jenkins untuk pertama kalinya, ia membuat pengguna pentadbiran dengan kata laluan rawak yang panjang, yang boleh anda tampalkan ke halaman web awalnya untuk membuka kunci pemasangan.

Pemalam Jenkins

Setelah dipasang, Jenkins membolehkan anda menerima senarai pemalam lalai atau memilih pemalam anda sendiri.

Setelah memilih set pemalam awal anda, klik butang Pasang dan Jenkins akan menambahkannya.

Skrin utama Jenkins memaparkan status barisan semasa dan status Pelaksana, dan menawarkan pautan untuk membuat item baru (pekerjaan), mengurus pengguna, melihat sejarah pembuatan, menguruskan Jenkins, melihat pandangan tersuai anda, dan menguruskan kelayakan anda.

Item Jenkins baru boleh terdiri daripada enam jenis pekerjaan ditambah folder untuk mengatur item.

Terdapat 18 perkara yang boleh anda lakukan dari halaman Manage Jenkins, termasuk pilihan untuk membuka antara muka baris perintah. Pada titik ini, bagaimanapun, kita harus melihat saluran pipa, yang merupakan aliran kerja yang disempurnakan yang biasanya ditentukan oleh skrip.

Saluran paip Jenkins

Setelah anda mengkonfigurasi Jenkins, sudah tiba masanya untuk membuat beberapa projek yang dapat dibina oleh Jenkins untuk anda. Walaupun anda dapat menggunakan UI web untuk membuat skrip, praktik terbaik saat ini adalah membuat skrip saluran paip, bernama Jenkinsfile , dan menyemaknya ke repositori anda. Tangkapan skrin di bawah menunjukkan borang web konfigurasi untuk saluran paip multibranch.

Seperti yang anda lihat, sumber cawangan untuk saluran paip jenis ini di pemasangan Jenkins asas saya boleh menjadi repositori Git atau Subversion, termasuk GitHub. Sekiranya anda memerlukan jenis repositori lain atau perkhidmatan repositori dalam talian yang berbeza, hanya masalah menambahkan pemalam yang sesuai dan memulakan semula Jenkins. Saya mencuba, tetapi tidak dapat memikirkan sistem pengurusan kod sumber (SCM) yang belum mempunyai senarai pemalam Jenkins.

Saluran paip Jenkins boleh dinyatakan atau ditulis. A perisytiharan saluran paip, yang mudah kedua-dua, menggunakan Groovy riba sintaks dan jika anda mahu, anda boleh mula fail dengan #!groovyuntuk menunjukkan editor kod anda ke arah yang betul. Paip deklaratif dimulakan dengan pipelineblok, mendefinisikan agent, dan mendefinisikan stagesyang termasuk dapat dilaksanakan steps, seperti dalam contoh tiga tahap di bawah ini.

saluran paip {

    ejen mana-mana

    peringkat {

        pentas ('Bangun') {

            langkah-langkah {

                gema 'Bangunan ..'

            }

        }

        pentas ('Ujian') {

            langkah-langkah {

                gema 'Ujian ..'

            }

        }

        pentas ('Terapkan') {

            langkah-langkah {

                gema 'Menyebarkan ....'

            }

        }

    }

}

pipelineadalah blok luaran wajib untuk menggunakan pemalam saluran paip Jenkins. agentmentakrifkan di mana anda mahu menjalankan saluran paip. anymengatakan untuk menggunakan mana-mana ejen yang ada untuk menjalankan saluran paip atau peringkat. Ejen yang lebih khusus mungkin mengisytiharkan bekas untuk digunakan, contohnya:

ejen {

    pelabuhan {

        gambar 'maven: 3-alpine'

        labelkan 'label yang ditentukan saya'

        berhujah '-v / tmp: / tmp'

    }

}

stagesmengandungi urutan satu atau lebih arahan peringkat. Dalam contoh di atas, tiga tahap tersebut adalah Build, Test, dan Deploy.

stepsbuat kerja sebenar. Dalam contoh di atas langkah-langkah hanya mencetak mesej. Langkah membina yang lebih berguna mungkin seperti berikut:

saluran paip {

    ejen mana-mana

    peringkat {

        pentas ('Bangun') {

            langkah-langkah {

                sh 'buat'

                arkib artifak artifak: '** / target / *. jar', cap jari: benar

            }

        }

    }

}

Di sini kami makememinta dari shell, dan kemudian mengarkibkan fail JAR yang dihasilkan ke arkib Jenkins.

The postseksyen mentakrifkan tindakan yang akan dijalankan pada akhir perancangan jangka atau peringkat. Anda boleh menggunakan beberapa blok selepas keadaan dalam seksyen post: always, changed, failure, success, unstable, dan aborted.

Sebagai contoh, Jenkinsfile di bawah selalu menjalankan JUnit selepas peringkat Ujian, tetapi hanya menghantar e-mel jika saluran paip gagal.

saluran paip {

    ejen mana-mana

    peringkat {

        pentas ('Ujian') {

            langkah-langkah {

                sh 'buat cek'

            }

        }

    }

    siaran {

        selalu {

            junit '** / target / *. xml'

        }

        kegagalan {

            hantarkan ke: [email protected], subjek: 'Pipeline gagal :('

        }

    }

}

Saluran paip deklaratif dapat menyatakan sebahagian besar dari apa yang anda perlukan untuk menentukan saluran paip, dan jauh lebih mudah dipelajari daripada sintaks saluran paip skrip, yang merupakan DSL berasaskan Groovy. Saluran paip skrip sebenarnya adalah persekitaran pengaturcaraan sepenuhnya.

Sebagai perbandingan, dua Jenkinsfiles berikut adalah sama.

Saluran paip deklaratif

saluran paip {

    ejen {docker 'node: 6.3'}

    peringkat {

        pentas ('bina') {

            langkah-langkah {

                sh 'npm —versi'

            }

        }

    }

Saluran paip skrip

simpul ('docker') {

    checkout scm

    pentas ('Bangun') {

        docker.image ('node: 6.3'). di dalam {

            sh 'npm —versi'

        }

    }

}

Lautan Biru, GUI Jenkins

Sekiranya anda menginginkan UI Jenkins terbaru dan terhebat, anda boleh menggunakan pemalam Blue Ocean, yang memberikan pengalaman pengguna grafik. Anda boleh menambahkan pemalam Blue Ocean ke pemasangan Jenkins yang ada atau menjalankan bekas Jenkins / Blue Ocean Docker. Dengan Blue Ocean dipasang, menu utama Jenkins anda akan mempunyai ikon tambahan:

Anda boleh membuka Lautan Biru secara langsung jika anda mahu. Terdapat dalam folder biru di pelayan Jenkins. Pembuatan saluran paip di Lautan Biru sedikit lebih grafik daripada di Jenkins biasa:

Jenkins Docker

Seperti yang saya nyatakan sebelumnya, Jenkins juga diedarkan sebagai gambar Docker. Tidak banyak lagi yang perlu dilakukan: Setelah memilih jenis SCM, anda memberikan URL dan bukti kelayakan, kemudian buat saluran paip dari satu repositori atau imbas semua repositori dalam organisasi. Setiap cabang dengan Jenkinsfile akan mendapat saluran paip.

Di sini saya menjalankan imej Blue Ocean Docker, yang disertakan dengan beberapa lagi pemalam perkhidmatan Git yang dipasang daripada senarai penyedia SCM lalai:

Setelah anda menjalankan beberapa saluran paip, pemalam Lautan Biru akan memaparkan statusnya, seperti gambar di atas. Anda boleh memperbesar saluran paip individu untuk melihat tahap dan langkahnya:

Anda juga boleh memperbesar cawangan (atas) dan aktiviti (bawah):  

-

Mengapa menggunakan Jenkins?

Plugin Jenkins Pipeline yang kami gunakan menyokong kes penggunaan integrasi berterusan / penghantaran berterusan (CICD) umum, yang mungkin merupakan penggunaan yang paling biasa untuk Jenkins. Terdapat pertimbangan khusus untuk beberapa kes penggunaan yang lain.

Projek Java adalah sumber semula jadi untuk Jenkins. Kami telah melihat bahawa Jenkins menyokong pembinaan dengan Maven; ia juga berfungsi dengan Ant, Gradle, JUnit, Nexus, dan Artifactory.

Android menjalankan sejenis Java, tetapi memperkenalkan masalah bagaimana menguji pada berbagai perangkat Android. Pemalam emulator Android membolehkan anda membina dan menguji seberapa banyak peranti yang ditiru yang anda mahu tentukan. Pemalam Penerbit Google Play membolehkan anda mengirim build ke saluran alfa di Google Play untuk dilancarkan atau ujian lebih lanjut pada peranti sebenar.

Saya telah menunjukkan contoh di mana kita menentukan bekas Docker sebagai ejen saluran paip dan tempat kita menjalankan Jenkins dan Blue Ocean dalam bekas Docker. Bekas dok sangat berguna dalam persekitaran Jenkins untuk meningkatkan kelajuan, skalabilitas, dan konsistensi.

Terdapat dua kes penggunaan utama untuk Jenkins dan GitHub. Salah satunya adalah integrasi binaan, yang dapat merangkumi kait perkhidmatan untuk mencetuskan Jenkins pada setiap komitmen ke repositori GitHub anda. Yang kedua adalah penggunaan pengesahan GitHub untuk mengawal akses ke Jenkins melalui OAuth.

Jenkins menyokong banyak bahasa lain selain Java. Untuk C / C ++, ada plug-in untuk menangkap kesalahan dan amaran dari konsol, menghasilkan skrip build dengan CMake, menjalankan ujian unit, dan melakukan analisis kod statik. Jenkins mempunyai sebilangan integrasi dengan alat PHP.

Walaupun kod Python tidak perlu dibina (kecuali jika anda menggunakan Cython, misalnya, atau membuat roda Python untuk pemasangan), Jenkins berintegrasi dengan alat pengujian dan pelaporan Python, seperti Nose2 dan Pytest, dan kualiti kod alat seperti Pylint. Begitu juga, Jenkins berintegrasi dengan alat Ruby seperti Rake, Cucumber, Brakeman, dan CI :: Reporter.

Jenkins untuk CI / CD

Secara keseluruhan, Jenkins menawarkan cara mudah untuk mengatur persekitaran CI / CD untuk hampir semua kombinasi bahasa dan repositori kod sumber menggunakan saluran paip, serta mengotomatisasi sejumlah tugas pengembangan rutin lain. Walaupun Jenkins tidak menghilangkan keperluan untuk membuat skrip untuk langkah-langkah individu, ini memberi anda cara yang lebih cepat dan lebih kuat untuk mengintegrasikan keseluruhan rangkaian alat binaan, ujian, dan penyebaran anda daripada yang dapat anda buat sendiri.