Apa Jenkins? Server CI menjelaskan

Jenkins menawarkan cara sederhana untuk menyiapkan lingkungan integrasi berkelanjutan atau pengiriman berkelanjutan (CI / CD) untuk hampir semua kombinasi bahasa dan repositori kode sumber menggunakan pipeline, serta mengotomatiskan tugas pengembangan rutin lainnya. Meskipun Jenkins tidak menghilangkan kebutuhan untuk membuat skrip untuk langkah-langkah individual, Jenkins memberi Anda cara yang lebih cepat dan lebih kuat untuk mengintegrasikan seluruh rangkaian alat build, pengujian, dan penerapan daripada yang dapat Anda buat sendiri dengan mudah.

“Jangan merusak bangunan malam!” adalah aturan utama di toko pengembangan perangkat lunak yang memposting versi produk harian yang baru dibuat setiap pagi untuk penguji mereka. Sebelum Jenkins, hal terbaik yang dapat dilakukan developer untuk menghindari kerusakan pada nightly build adalah membuat dan menguji dengan hati-hati dan berhasil di mesin lokal sebelum menerapkan kode. Tapi itu berarti menguji perubahan seseorang dalam isolasi, tanpa komitmen harian orang lain. Tidak ada jaminan pasti bahwa bangunan malam akan bertahan dari komitmen seseorang.

Jenkins - aslinya Hudson - adalah tanggapan langsung terhadap batasan ini.

Hudson dan Jenkins

Pada tahun 2004, Kohsuke Kawaguchi adalah pengembang Java di Sun. Kawaguchi bosan memecahkan build dalam pekerjaan pengembangannya dan ingin menemukan cara untuk mengetahui, sebelum memasukkan kode ke repositori, apakah kode itu akan berfungsi. Jadi Kawaguchi membangun server otomasi di dan untuk Java untuk mewujudkannya, yang disebut Hudson. Hudson menjadi populer di Sun, dan menyebar ke perusahaan lain sebagai open source.

Maju cepat ke tahun 2011, dan perselisihan antara Oracle (yang telah mengakuisisi Sun) dan komunitas sumber terbuka Hudson yang independen menyebabkan pergantian nama, Jenkins. Pada tahun 2014 Kawaguchi menjadi CTO CloudBees, yang menawarkan produk pengiriman berkelanjutan berbasis Jenkins.

Kedua garpu terus ada, meskipun Jenkins jauh lebih aktif. Saat ini, proyek Jenkins masih aktif. Situs web Hudson ditutup pada 31 Jan 2020.

Pada bulan Maret 2019, Linux Foundation, bersama dengan CloudBees, Google, dan sejumlah perusahaan lainnya, meluncurkan yayasan perangkat lunak sumber terbuka baru yang disebut Continuous Delivery Foundation (CDF). Kontributor Jenkins memutuskan bahwa proyek mereka harus bergabung dengan yayasan baru ini. Kawaguchi menulis pada saat itu bahwa tidak ada hal penting yang akan berubah bagi pengguna.

Pada Januari 2020 Kawaguchi mengumumkan dia pindah ke startup barunya, Launchable. Dia juga mengatakan bahwa dia akan secara resmi mundur dari Jenkins, meskipun tetap di Komite Pengawasan Teknis dari Continuous Delivery Foundation, dan mengalihkan perannya di CloudBees menjadi penasihat.

Video terkait: Cara mengirimkan kode lebih cepat dengan CI / CD

Otomatisasi Jenkins

Saat ini Jenkins adalah server otomatisasi sumber terbuka terkemuka dengan sekitar 1.600 plugin untuk mendukung otomatisasi semua jenis tugas pengembangan. Masalah yang awalnya coba dipecahkan Kawaguchi, integrasi berkelanjutan dan pengiriman kode Java secara terus-menerus (misalnya, membangun proyek, menjalankan pengujian, melakukan analisis kode statis, dan menerapkan) hanyalah satu dari banyak proses yang diotomatiskan orang dengan Jenkins. 1.600 plugin tersebut mencakup lima area: platform, UI, administrasi, manajemen kode sumber, dan, paling sering, manajemen build.

Bagaimana Jenkins bekerja

Jenkins didistribusikan sebagai arsip WAR dan sebagai paket penginstal untuk sistem operasi utama, sebagai paket Homebrew, sebagai image Docker, dan sebagai kode sumber. Kode sumber sebagian besar adalah Java, dengan beberapa file Groovy, Ruby, dan Antlr.

Anda dapat menjalankan Jenkins WAR secara mandiri atau sebagai servlet di server aplikasi Java seperti Tomcat. Dalam kedua kasus tersebut, ia menghasilkan antarmuka pengguna web dan menerima panggilan ke REST API-nya.

Saat Anda menjalankan Jenkins untuk pertama kali, itu membuat pengguna administratif dengan kata sandi acak yang panjang, yang dapat Anda tempelkan ke halaman web awalnya untuk membuka kunci instalasi.

Pengaya Jenkins

Setelah diinstal, Jenkins memungkinkan Anda menerima daftar plugin default atau memilih plugin Anda sendiri.

Setelah Anda memilih kumpulan plugin awal Anda, klik tombol Pasang dan Jenkins akan menambahkannya.

Layar utama Jenkins menampilkan antrian build dan status Pelaksana saat ini, dan menawarkan link untuk membuat item baru (pekerjaan), mengelola pengguna, melihat histori build, mengelola Jenkins, melihat tampilan kustom Anda, dan mengelola kredensial Anda.

Item Jenkins baru bisa berupa salah satu dari enam jenis pekerjaan ditambah folder untuk mengatur item.

Ada 18 hal yang dapat Anda lakukan dari halaman Kelola Jenkins, termasuk opsi untuk membuka antarmuka baris perintah. Namun, pada titik ini, kita harus melihat pipeline, yang merupakan alur kerja yang disempurnakan yang biasanya ditentukan oleh skrip.

Jaringan pipa Jenkins

Setelah Anda mengonfigurasi Jenkins, sekarang saatnya membuat beberapa proyek yang dapat dibuat Jenkins untuk Anda. Meskipun Anda dapat menggunakan UI web untuk membuat skrip, praktik terbaik saat ini adalah membuat skrip pipeline, bernama Jenkinsfile , dan memeriksanya ke dalam repositori Anda. Tangkapan layar di bawah ini menunjukkan formulir web konfigurasi untuk pipa multibranch.

Seperti yang Anda lihat, sumber cabang untuk pipeline jenis ini di instalasi Jenkins dasar saya dapat berupa repositori Git atau Subversion, termasuk GitHub. Jika Anda membutuhkan jenis repositori lain atau layanan repositori online yang berbeda, itu hanya masalah menambahkan plugin yang sesuai dan me-reboot Jenkins. Saya mencoba, tetapi tidak dapat memikirkan sistem manajemen kode sumber (SCM) yang belum memiliki plug-in Jenkins yang terdaftar.

Pipeline Jenkins dapat berupa deklaratif atau skrip. Sebuah deklaratif pipa, sederhana dari dua, menggunakan Groovy-kompatibel sintaks-dan jika Anda ingin, Anda dapat mulai file dengan #!groovymenunjukkan kode editor Anda ke arah yang benar. Pipeline deklaratif dimulai dengan sebuah pipelineblok, mendefinisikan sebuah agent, dan mendefinisikan stagesyang menyertakan executable steps, seperti pada contoh tiga tahap di bawah ini.

pipa saluran {

    agen apapun

    tahapan {

        stage ('Build') {

            Langkah {

                echo 'Gedung ..'

            }

        }

        stage ('Test') {

            Langkah {

                echo 'Pengujian ..'

            }

        }

        stage ('Deploy') {

            Langkah {

                echo 'Menerapkan ....'

            }

        }

    }

}

pipelineadalah blok luar wajib untuk menjalankan plugin pipeline Jenkins. agentmenentukan tempat Anda ingin menjalankan pipeline. anymengatakan untuk menggunakan agen yang tersedia untuk menjalankan pipeline atau stage. Agen yang lebih spesifik mungkin mendeklarasikan container untuk digunakan, misalnya:

agen {

    buruh pelabuhan {

        gambar 'maven: 3-alpine'

        label 'my-defined-label'

        args '-v / tmp: / tmp'

    }

}

stagesberisi urutan satu atau lebih arahan tahapan. Dalam contoh di atas, tiga tahapan tersebut adalah Build, Test, dan Deploy.

stepslakukan pekerjaan yang sebenarnya. Pada contoh di atas, langkah-langkah hanya mencetak pesan. Langkah build yang lebih berguna mungkin terlihat seperti berikut:

pipa saluran {

    agen apapun

    tahapan {

        stage ('Build') {

            Langkah {

                sh 'make'

                archiveArtifacts artefak: '** / target / *. jar', sidik jari: true

            }

        }

    }

}

Di sini kita memanggil makedari shell, dan kemudian mengarsipkan file JAR yang dihasilkan ke arsip Jenkins.

The postBagian mendefinisikan tindakan yang akan dijalankan pada akhir pipa run atau tahap. Anda dapat menggunakan sejumlah pos-kondisi blok dalam bagian post: always, changed, failure, success, unstable, dan aborted.

Misalnya, Jenkinsfile di bawah ini selalu menjalankan JUnit setelah tahap Test, tetapi hanya mengirim email jika pipeline gagal.

pipa saluran {

    agen apapun

    tahapan {

        stage ('Test') {

            Langkah {

                sh 'periksa'

            }

        }

    }

    posting {

        selalu {

            junit '** / target / *. xml'

        }

        kegagalan {

            mail to: [email protected], subject: 'Saluran Pipa gagal :('

        }

    }

}

Pipeline deklaratif dapat mengekspresikan sebagian besar dari apa yang Anda perlukan untuk menentukan pipelines, dan jauh lebih mudah dipelajari daripada sintaks pipeline skrip, yang merupakan DSL berbasis Groovy. Pipeline dengan skrip sebenarnya adalah lingkungan pemrograman yang lengkap.

Sebagai perbandingan, dua Jenkinsfiles berikut sepenuhnya setara.

Pipa deklaratif

pipa saluran {

    agen {docker 'node: 6.3'}

    tahapan {

        panggung ('membangun') {

            Langkah {

                sh 'npm —version'

            }

        }

    }

Pipa skrip

node ('docker') {

    checkout scm

    stage ('Build') {

        docker.image ('node: 6.3'). inside {

            sh 'npm —version'

        }

    }

}

Blue Ocean, GUI Jenkins

Jika Anda menginginkan UI Jenkins yang terbaru dan terbaik, Anda dapat menggunakan plugin Blue Ocean, yang memberikan pengalaman pengguna grafis. Anda dapat menambahkan plug-in Blue Ocean ke instalasi Jenkins yang sudah ada atau menjalankan container Docker Jenkins / Blue Ocean. Dengan Blue Ocean terinstal, menu utama Jenkins Anda akan memiliki ikon tambahan:

Anda dapat membuka Blue Ocean secara langsung jika Anda mau. Itu ada di folder / blue di server Jenkins. Pembuatan saluran pipa di Blue Ocean sedikit lebih grafis daripada di Jenkins biasa:

Jenkins Docker

Seperti yang saya sebutkan sebelumnya, Jenkins juga didistribusikan sebagai image Docker. Tidak banyak lagi prosesnya: Setelah Anda memilih jenis SCM, Anda memberikan URL dan kredensial, lalu membuat pipeline dari satu repositori atau memindai semua repositori di organisasi. Setiap cabang dengan Jenkinsfile akan mendapatkan pipeline.

Di sini saya menjalankan image Blue Ocean Docker, yang datang dengan beberapa plugin layanan Git yang diinstal daripada daftar default penyedia SCM:

Setelah Anda menjalankan beberapa pipeline, plug-in Blue Ocean akan menampilkan statusnya, seperti yang ditunjukkan di atas. Anda dapat memperbesar setiap pipeline untuk melihat tahapan dan langkahnya:

Anda juga dapat memperbesar cabang (atas) dan aktivitas (bawah):  

-

Mengapa menggunakan Jenkins?

Plug-in Jenkins Pipeline yang kami gunakan mendukung kasus penggunaan general continuous integration / continuous delivery (CICD), yang mungkin merupakan penggunaan paling umum untuk Jenkins. Ada pertimbangan khusus untuk beberapa kasus penggunaan lainnya.

Proyek Java adalah alasan asli untuk Jenkins. Kami telah melihat bahwa Jenkins mendukung pembangunan dengan Maven; itu juga bekerja dengan Ant, Gradle, JUnit, Nexus, dan Artifactory.

Android menjalankan semacam Java, tetapi memperkenalkan masalah cara menguji pada berbagai perangkat Android. Plugin Android emulator memungkinkan Anda membuat dan menguji perangkat emulasi sebanyak yang ingin Anda tentukan. Plugin Google Play Publisher memungkinkan Anda mengirim build ke saluran alfa di Google Play untuk dirilis atau diuji lebih lanjut pada perangkat sebenarnya.

Saya telah menunjukkan contoh di mana kami menentukan kontainer Docker sebagai agen untuk pipeline dan di mana kami menjalankan Jenkins dan Blue Ocean dalam kontainer Docker. Container Docker sangat berguna di lingkungan Jenkins untuk meningkatkan kecepatan, skalabilitas, dan konsistensi.

Ada dua kasus penggunaan utama untuk Jenkins dan GitHub. Salah satunya adalah integrasi build, yang dapat menyertakan hook layanan untuk memicu Jenkins pada setiap komit ke repositori GitHub Anda. Yang kedua adalah penggunaan otentikasi GitHub untuk mengontrol akses ke Jenkins melalui OAuth.

Jenkins mendukung banyak bahasa lain selain Java. Untuk C / C ++, tersedia plugin untuk menangkap error dan peringatan dari konsol, membuat skrip build dengan CMake, menjalankan pengujian unit, dan melakukan analisis kode statis. Jenkins memiliki sejumlah integrasi dengan alat PHP.

Meskipun kode Python tidak perlu dibuat (kecuali Anda menggunakan Cython, misalnya, atau membuat roda Python untuk penginstalan), ada gunanya Jenkins terintegrasi dengan alat pengujian dan pelaporan Python, seperti Nose2 dan Pytest, dan kualitas kode. alat seperti Pylint. Demikian pula, Jenkins terintegrasi dengan alat Ruby seperti Rake, Cucumber, Brakeman, dan CI :: Reporter.

Jenkins untuk CI / CD

Secara keseluruhan, Jenkins menawarkan cara sederhana untuk menyiapkan lingkungan CI / CD untuk hampir semua kombinasi bahasa dan repositori kode sumber menggunakan pipeline, serta mengotomatiskan sejumlah tugas pengembangan rutin lainnya. Meskipun Jenkins tidak menghilangkan kebutuhan untuk membuat skrip untuk langkah-langkah individual, Jenkins memberi Anda cara yang lebih cepat dan lebih kuat untuk mengintegrasikan seluruh rangkaian alat build, pengujian, dan penerapan daripada yang dapat Anda buat sendiri dengan mudah.