Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Web Development
Code

Menyiapkan Continuous Integration & Continuous Deployment dengan Jenkins

by
Difficulty:BeginnerLength:LongLanguages:
Sponsored Content

This sponsored post features a product relevant to our readers while meeting our editorial guidelines for being objective and educational.

Indonesian (Bahasa Indonesia) translation by Yusuf Samin (you can also view the original English article)

Kehidupan sehari-hari seorang pengembang dipenuhi dengan tugas-tugas yang monoton dan berulang-ulang. Untungnya, kita hidup di zaman kecerdasan pra-buatan, yang berarti komputer hebat dalam menangani tugas-tugas yang membosankan dan mereka hampir tidak pernah mengeluh tentang hal itu! Jadi mari kita buat beberapa otomatisasi untuk membuat pekerjaan sehari-hari kita menjadi sedikit kurang grindy.

Pengujian dan penyebaran adalah dua elemen integral dari pengembangan web. Dengan beberapa otomatisasi yang tercampur, mereka menjadi solusi yang biasa disebut "continuous integration" (CI) dan "continuous deployment" (CD). Aspek "continuous" dari solusi ini berarti bahwa proyek Anda akan diuji dan disebarkan secara otomatis, memungkinkan Anda untuk lebih fokus pada penulisan kode dan lebih sedikit dalam menggiringnya ke server.

Dalam tutorial ini, kami akan menyiapkan server integrasi berkelanjutan populer bernama Jenkins dan menyinkronkannya dengan GitHub sehingga akan menjalankan tes setiap kali kode baru di push. Setelah itu, kami akan membuat solusi untuk secara otomatis mendorong kode itu ke server aplikasi kami, menghilangkan keharusan bagi kami untuk menggunakan secara manual.

Kami akan menggunakan DigitalOcean untuk dengan cepat dan mudah membuat virtual private servers (VPS) berbasis cloud untuk meng-host aplikasi kami dan Jenkins.

Catatan: Tutorial ini mengasumsikan Anda memiliki pengetahuan dasar tentang bekerja pada baris perintah, dan bahwa mesin Anda sudah menginstal Git dan Node.js.

Aplikasi Super Sampel kami

Sebelum kita dapat menguji atau menyebar apa pun, kita perlu sesuatu untuk menguji dan disebar. Izinkan saya untuk memperkenalkan Anda ke aplikasi pengujian tutorial ramah kami, tepat disebut "hello-jenkins."

Kami akan menulis aplikasi Node.js sederhana yang sesuai dengan tujuan kami. Ini tidak akan berfungsi lebih dari sekadar menampilkan satu baris teks di browser, tetapi itu hanya fungsionalitas yang cukup untuk memastikan bahwa kami telah menyiapkan continuous integration dan continuous deployment secara tepat.

Git Up di GitHub

Karena kita akan menyimpan proyek kita di GitHub, mari kita mulai dari sana. Masuk ke (atau buat) akun GitHub Anda dan buat repositori baru. Beri nama "hello-jenkins" dan berikan deskripsi berikut ini:

Untuk kesederhanaan, mari kita biarkan reponya Public. Lanjutkan dan centang Initialize this repository with a README, dan pilih opsi Node dari daftar drop-down Add .gitignore.

Klik tombol Create repository, dan repo kami akan siap.

Sekarang, mari kita klon repositori baru kita ke mesin lokal kita dan navigasikan ke dalamnya:

Aplikasi Node kami

Berikut struktur akhir aplikasi kami:

Mari kita selesaikan ini satu per satu. Langkah pertama untuk membangun aplikasi Node.js adalah membuat file package.json. Ini milik kita:

Di bawah dependencies, kami telah menambahkan express, yang akan kami gunakan untuk membantu membuat aplikasi Node.js kami. Di bawah devDependencies kami telah menambahkan mocha dan supertest, yang keduanya akan membantu kami menulis tes kami.

Sekarang package.json kami telah ditentukan, instal dependensi aplikasi kami dengan menjalankan:

Saatnya menulis kode aplikasi kami. Buat file bernama app.js dan tambahkan yang berikut ke dalamnya:

Mari kita uraikan aplikasi Node.js kami yang sederhana:

  • Pertama, kami mengimpor lib ekspres yang kami tentukan di package.json kami.
  • Kami menggunakan express untuk membuat app baru.
  • Kami memberi tahu app kami untuk menanggapi semua permintaan yang masuk ke root dari situs kami (/) dengan teks "hello world."
  • Selanjutnya, kami memberi tahu app kami tentang port apa yang harus didengarkan permintaan (process.env.PORT mengacu pada variabel lingkungan yang disebut "PORT", dan jika tidak ada, kami sebaliknya default ke port 5000).
  • Akhirnya, kami membuat app kami tersedia untuk modul Node.js lainnya melalui module.exports (ini akan berguna nanti saat kami menambahkan tes).

Itu dia! Aplikasi kami siap - mari jalankan:

Buka peramban favorit Anda dan navigasikan ke http:// localhost:5000, dan Anda akan melihat hello world duduk dalam semua kejernihannya.

Ini bukan aplikasi tes yang paling menarik, tetapi berfungsi! Silakan mematikan aplikasi Node.js kami dengan Ctrl-C, dan mari kita lanjutkan.

Beberapa Pengujian Berurutan

Saatnya menulis tes untuk aplikasi kita - lagipula, jika kita tidak memiliki apa-apa untuk diuji, maka Jenkins tidak akan melakukan apa pun!

Buat folder bernama test, dan di dalamnya buat file bernama test.js. Tambahkan kode berikut untuk test/test.js:

Bagaimana cara kerja pengujian kami? Pertama, kami mengimpor lib supertest dan app kami. Kemudian kami menambahkan satu tes, menjelaskan apa yang harus terjadi ketika permintaan GET mengenai root situs kami. Kami memberi tahu tes kami untuk mengharapkan respons sebagai "hello world," dan jika ya, tes akan berlalu.

Untuk menjalankan tes, kita akan menggunakan Mocha Perpustakaan. Kami diinstal Mocha sebagai bagian dari devDependencies kami, jadi kami hanya akan menjalankan perintah yang melewati kami file tes untuk Mocha dan Mocha akan menjalankan tes kami:

Setelah selesai, Anda akan melihat titik hijau bersama dengan informasi yang mengatakan bahwa satu tes telah berlalu. Itu artinya pengujian kami berhasil! Tetapi mengetik perintah itu berulang kali akan segera menghasilkan kram jari dan mata berkedut, jadi mari kita membuat skrip pembantu untuk melakukannya untuk kita (ingat, komputer tidak bosan!).

Buat direktori baru yang disebut script, dan di dalamnya buat file bernama test(perhatikan tidak ada ekstensi). Tambahkan yang berikut ke script/test:

Di sana - sekarang kita memiliki skrip shell untuk mengeksekusi baris degil itu untuk kita. Tetapi sebelum kita dapat menggunakannya, kita harus memberinya izin yang dapat dieksekusi:

Ayo kita coba! Jalankan:

... dan Anda akan melihat tes lulus yang sama seperti sebelumnya.

Saatnya Mempush

Baiklah, kami memiliki aplikasi yang berfungsi dan tes yang berfungsi, jadi mari kita push kode baru kami ke GitHub:

Dan hanya itu - aplikasi kita selesai dan di GitHub!

Aplikasi Kami Akan Dilayani

Kami memiliki aplikasi yang memikat dan menawan ("hello world" memiliki semacam puisi untuk itu, bukankah Anda setuju?), Tetapi tidak ada yang bisa melihatnya! Mari kita ubah itu dan menjalankan aplikasi kita di server.

Untuk kebutuhan hosting kami, kami akan beralih ke DigitalOcean. DigitalOcean menyediakan cara cepat dan sederhana untuk memutar instance cloud VPS, menjadikannya tuan rumah yang sempurna untuk taman bermain CI/CD kami.

Drop pertama

Masuk ke (atau mendaftar) DigitalOcean dan klik tombol Create Droplet. Untuk nama host, sebut saja "hello-jenkins". Contoh ukuran terendah (512MB/1/20GB) akan disesuaikan dengan kebutuhan kami, dan memilih wilayah geografis terdekat dengan Anda. Selanjutnya, kita perlu memilih image yang digunakan untuk membuat droplet. DigitalOcean menyediakan berbagai pilihan sistem operasi untuk dipilih, tetapi yang sangat menyenangkan adalah mereka juga menyediakan image yang dirancang khusus untuk jenis aplikasi tertentu.

Klik tab Applications, dan pilih opsi node-v0.10.29 pada Ubuntu 14.04 - ini akan membuat server yang di-bootstrap dengan baik untuk aplikasi Node.js kami.

Sekarang klik Create Droplet, dan DigitalOcean akan memulai menginisialisasi server kami.

Konfigurasi Server

Dalam satu menit server baru kami akan siap, dan Anda seharusnya sudah menerima email dengan kredensial root server Anda. Mari kita gunakan info itu untuk masuk:

Anda akan dimintai kata sandi yang disediakan dalam email, dan kemudian segera dipaksa untuk membuat kata sandi baru (membuatnya menjadi sesuatu yang sangat kuat, dan menyimpannya di lokasi yang aman, seperti basis data KeePass).

Saat ini kita masuk sebagai root, yang merupakan dewa di tanah Linux yang sangat kuat. Tapi berat adalah kepala yang memakai mahkota, dan beroperasi sebagai root pada umumnya adalah ide yang buruk. Jadi hal pertama yang ingin kita lakukan adalah membuat pengguna baru - sebut saja "app":

Anda harus memberikan kata sandi (kata sandi kuat yang berbeda, disimpan dengan aman), dan kemudian akan mengajukan serangkaian pertanyaan opsional.

Kami ingin beralih ke pengguna app kami, tetapi sebelum kami keluar, kami harus memberikan hak pengguna sudo baru kami sehingga ia akan memiliki kemampuan untuk melakukan tindakan administratif:

Sekarang tutup koneksi dengan exit, dan kemudian sambungkan sebagai app:

Anda akan dimintai kata sandi pengguna app, dan kemudian Anda harus login dan baik untuk pergi.

Menginstal aplikasi kami

Ayo bawa aplikasi kita ke mesin. Berkat gambar aplikasi DigitalOcean, mesin kami dilengkapi dengan Node.js dan npm yang sudah diinstal, tetapi kami masih perlu menginstal Git:

Anda akan diminta kata sandi (karena Anda menggunakan sudo), dan Anda harus mengonfirmasi pemasangan dengan Y. Setelah Git diinstal, kita dapat menggunakannya untuk mendapatkan aplikasi dari GitHub.

Salin URL klon HTTPS dari halaman GitHub proyek, lalu klon repo ke folder home Anda di server:

Sekarang aplikasi kita ada di server kita, dalam folder bernama "hello-jenkins." Mari kita menuju ke sana:

Hal pertama yang perlu kita lakukan adalah menginstal dependensi aplikasi:

Setelah selesai, kita dapat menjalankan aplikasi kita! Putar dengan:

... dan arahkan ke alamat IP server Anda di browser Anda.

Tapi tunggu, itu tidak berhasil! Apa masalahnya?

Baiklah, mari kita ingat baris kode ini di app.js kami:

Saat ini, kami tidak memiliki set variabel lingkungan PORT, jadi aplikasi kami secara default ke port 5000 dan Anda perlu menambahkan port ke alamat IP di browser (http://YOUR.SERVER.IP.ADDRESS:5000 ).

Jadi bagaimana kita membuat aplikasi kita berfungsi seperti yang diharapkan, tanpa harus menentukan port? Nah, ketika browser membuat permintaan HTTP, itu default ke port 80. Jadi kita hanya perlu mengatur variabel lingkungan PORT kita ke 80.

Kami akan mengatur variabel lingkungan kami di file /etc/environment di server - file ini dimuat saat login, dan set variabel akan tersedia secara global untuk semua aplikasi. Buka file:

Anda akan melihat bahwa sekarang PATH sedang diatur dalam file ini. Tambahkan baris berikut setelahnya:

Kemudian ketik Ctrl-X, Y, dan Enter untuk menyimpan dan keluar. Logout dari server (exit) dan SSH kembali (ini akan memuat variabel lingkungan baru).

Satu tugas kecil terakhir - menjalankan aplikasi pada port 80 membutuhkan hak akses root, tetapi menjalankan sudo node app.js tidak akan mempertahankan variabel lingkungan yang telah kita atur. Untuk menyiasatinya, kami akan mengaktifkan node untuk memiliki kemampuan untuk berjalan pada port 80 sans sudo:

Itu harus melakukannya. Sekarang jalankan:

Arahkan ke http://YOUR.SERVER.IP.ADDRESS, dan Anda akan melihat hello world!

Tetap berjalan

Saat ini aplikasi kami hanya berjalan saat kami menjalankan proses - jika kami menutupnya, situs kami tidak lagi tersedia. Yang kita butuhkan adalah cara agar aplikasi Node.js kita tetap berjalan di latar belakang. Untuk itu, kita akan gunakan forever. Langkah pertama adalah menginstalnya secara global:

Sekarang, daripada memulai aplikasi kami dengan node app.js, kami akan menggunakan:

Perhatikan bahwa daripada proses tergantung pada eksekusi, itu keluar segera dan memberi Anda kontrol kembali. Ini karena server Node.js berjalan di latar belakang. Sekarang kita tidak perlu khawatir server kita akan mati ketika kita keluar dari server. forever akan secara otomatis me-restart aplikasi kita jika itu terjadi crash!

Untuk menghentikan aplikasi kami, kami dapat menjalankan:

Untuk saat ini, mari kita tetap menjalankannya, dan beralih ke Jenkins.

Waktunya untuk menguji

Kami akan meng-hosting server Jenkins kami di droplet DigitalOcean terpisah. Mari kita putar itu sekarang.

Drop kedua

Buat droplet baru dengan nama host "jenkins-box". Pilih 512MB/1/20GB lagi, bersama dengan lokasi yang sama dan jenis aplikasi yang sama (node-v0.10.29 pada Ubuntu 14.04) seperti dengan droplet sebelumnya.

Klik Buat Droplet dan setelah selesai, gunakan kredensial yang diemailkan kepada Anda untuk login melalui SSH (Anda harus menetapkan kata sandi baru, seperti sebelumnya).

Seperti sebelumnya, kita harus membuat pengguna baru sebelum kita melakukan hal lain. Kali ini sebut saja admin:

Logout sebagai root dan login sebagai admin yang baru dibuat.

Karena tujuan Jenkins adalah mengambil proyek kami dan menjalankan pengujiannya, alat berat kami perlu menginstal semua dependensi proyek. Kami memutar instance ini dengan aplikasi Node.js DigitalOcean, jadi Node.js dan npm sudah diinstal. Tetapi kita masih perlu menginstal Git:

Sewa Pelayan

Selanjutnya adalah Jenkins. Memasang Jenkins cukup sederhana apt-get kita harus melakukan semua pekerjaan berat. Satu-satunya tujuan adalah kita perlu menambahkan repositori apt baru sebelum memulai instalasi:

Sekarang kita dapat menginstal Jenkins:

Setelah selesai, Jenkins akan berjalan dan tersedia di port 8080. Arahkan browser Anda ke alamat IP jenkins-box di port 8080 dan Anda akan melihat halaman landing Jenkins.

Klik tautan Manage Jenkins, lalu tautan Manage Plugins. Beralih ke tab Available, dan cari GitHub Plugin. Klik Instal kotak centang, dan kemudian tombol Download now and install after restart.

Ini akan memulai urutan pemasangan. Plugin GitHub memiliki beberapa dependensi, jadi beberapa plugin akan diinstal. Di bagian bawah halaman, centang Restart Jenkins when installation is complete and no jobs are running - ini akan meminta Jenkins untuk memulai kembali setelah instalasi selesai.

Setelah Jenkins telah memulai kembali, saatnya untuk menambahkan proyek kami. Klik tombol New Item. Gunakan "hello-jenkins" untuk nama item, pilih Build a free-style project software, dan klik tombol berlabel OK.

Setelah proyek diatur, Anda akan menemukan diri Anda di halaman pengaturan proyek. Tambahkan URL GitHub proyek kami ke kotak proyek GitHub:

Selanjutnya, pilih opsi Git di bawah Source Code Management. Di bidang yang baru muncul, tambahkan URL ke repo proyek GitHub kami ke bidang Repository URL:

Gulir sedikit ke bawah dan klik kotak untuk mengaktifkan Build when a change is pushed to GitHub. Dengan opsi ini dicentang, proyek kami akan dibangun setiap kali kami push repo GitHub kami. Tentu saja, kita perlu Jenkins tahu apa yang harus dilakukan ketika menjalankan build. Klik dropdown Add build step, dan pilih Execute shell. Ini akan membuat dialog Command tersedia, dan apa yang kita masukkan dalam dialog ini akan dijalankan ketika build memulai. Tambahkan yang berikut ini:

Bangunan kami terdiri dari dua langkah. Pertama, ia menginstal dependensi aplikasi kami. Kemudian dieksekusi ./script/test untuk menjalankan pengujian kami.

Klik "Save".

Untuk menyelesaikan pengaturan integrasi, buka repo GitHub, dan klik Settings. Klik tab Webhooks & Services, dan kemudian drop-down Add Service. Pilih layanan Jenkins (GitHub plugin).

Tambahkan yang berikut ini sebagai url hook Jenkins:

Klik Add service. Proyek kami sekarang siap untuk uji integrasi berkelanjutan pertama!

Mari kita berikan sesuatu untuk diuji. Buka app.js secara lokal dan ubah baris ini:

...untuk ini:

Simpan perubahan dan commit:

Sekarang awasi Jenkins sambil push perubahan Anda ke GitHub:

Setelah satu atau dua detik, Anda akan melihat bahwa pekerjaan baru telah dimulai untuk proyek hello-jenkins kami di Jenkins - continuous integrationkami berhasil!

Aliran Continuous Integration

Tapi ... job itu gagal! Mengapa?

Nah, ingatlah bahwa pengujian kami mengharapkan panggilan root untuk mengembalikan "hello world", tetapi kami telah mengubahnya menjadi "hello jenkins". Jadi mari kita ubah ekspektasi pengujian kita. Tukar baris ini:

... dengan baris ini:

Simpan, commit, dan push lagi:

Watch Jenkins - sekali lagi, Anda akan melihat build dimulai secara otomatis, dan kali ini berhasil!

Ini adalah aliran continuous integration. Server pengujian terus menguji setiap kode baru yang Anda push sehingga Anda dengan cepat diberitahu tentang semua tes yang gagal.

Dapatkan ini sebarkan

Baiklah, jadi kami secara otomatis menguji perubahan kami, tetapi bagaimana dengan menyebarkan perubahan itu? Tidak masalah!

Jika Anda telah mengamati dengan seksama, Anda pasti memperhatikan ada sesuatu yang hilang dari proyek kami sejauh ini. Dalam struktur proyek di awal tutorial, ada script/deploy file, tetapi kami belum membuat file seperti itu. Baiklah, sekarang kita akan!

Kunci otentikasi

Tapi pertama-tama, mari kita bahas bagaimana penyebaran akan bekerja. Skrip kami (dijalankan oleh langkah build Jenkin) akan masuk ke server aplikasi melalui SSH, navigasikan ke folder aplikasi kami, perbarui aplikasi, dan kemudian restart server. Sebelum menulis skrip penyebaran kami, kami perlu menangani bagaimana server Jenkins kami akan SSH ke server aplikasi kami.

Sejauh ini, kami telah mengakses server kami dengan memasukkan kata sandi secara manual, tetapi pendekatan ini tidak akan berfungsi untuk skrip otomatis. Sebagai gantinya, kami akan membuat kunci SSH yang akan digunakan server Jenkins untuk mengautentikasi dirinya dengan server aplikasi.

Ketika Jenkins menginstal, itu menciptakan pengguna baru yang disebut jenkins. Jenkins mengeksekusi semua perintah dengan pengguna ini, jadi kami perlu membuat kunci kami dengan pengguna jenkins sehingga memiliki akses yang sesuai untuk itu.

Saat login sebagai admin di jenkins-box, jalankan yang berikut ini:

Berikan kata sandi admin Anda, dan itu akan mengalihkan Anda ke pengguna root. Kemudian jalankan:

Sekarang Anda bertindak sebagai pengguna jenkins. Hasilkan kunci SSH:

Simpan file di lokasi default (/var/lib/jenkins/.ssh/id_rsa), dan pastikan untuk tidak menggunakan passphrase (jika tidak, akses SSH akan memerlukan kata sandi dan tidak akan berfungsi saat otomatis).

Selanjutnya, kita perlu menyalin kunci publik yang dibuat. Jalankan ini:

... dan salin hasilnya. Seharusnya string panjang dimulai dengan "ssh-rsa" dan berakhir dengan "jenkins@jenkins-box".

Logout dari jenkins-box dan masuk kembali ke server aplikasi kami (hello-jenkins) sebagai pengguna app. Kita perlu membuat file bernama authorized_keys di folder pengguna .ssh app kita:

Rekatkan kunci publik yang Anda salin, dan kemudian Ctrl-X/Y/Enter untuk menyimpan dan keluar. Agar file ini berfungsi dengan baik, ia harus memiliki izin ketat yang ditetapkan di atasnya:

Kembali ke jenkins box, alihkan ke pengguna jenkins, dan verifikasi bahwa Anda bisa masuk ke server aplikasi app tanpa memasukkan kata sandi:

Anda harus berhasil masuk ke server app tanpa harus memasukkan kata sandi. Dengan itu, sekarang kita bisa beralih ke penyebaran.

Kirim Ini Secara Otomatis

Buat file di folder script bernama deploy (perhatikan tidak ada ekstensi). Tambahkan yang berikut ke skrip/deploy:

Mari kita jalani ini:

  • Pertama, kami masuk ke server aplikasi sebagai pengguna app.
  • Kemudian kami menavigasi ke folder aplikasi kami dan memperbarui ke versi terbaru dari GitHub.
  • Setelah itu, kami menginstal dependensi kami.
  • Akhirnya, setelah kode aplikasi kami diperbarui, kami me-restart server kami dengan forever restartall.

Jadikan file skrip baru kami dapat dieksekusi:

Tambahkan file baru ini dan commit:

Tapi jangan di push dulu. Pertama, kembali ke konfigurasi proyek kami di Jenkins, dan gulir ke bawah ke build command. Tambahkan baris baru ini di akhir:

Simpan proyek Jenkins.

Sekarang, maju dan push ke GitHub, dan saksikan Jenkins secara otomatis membangun. Setelah build selesai (seharusnya berhasil), navigasikan browser Anda ke IP server app kami. Presto! "Hello world" kami yang mengasyikkan telah digantikan dengan "hello jenkins" yang menggembirakan!

Aplikasi kami sekarang di sebar terus-menerus!

Semuanya Baik Itu Otomatis dengan baik

Fiuh. Itulah perjalanannya!

Pada akhirnya, kami berhasil mengatur continuous integration dan continuous deployment, yang memberikan tingkat otomatisasi yang sangat baik dalam kehidupan pengembang harian kami. Ingat, komputer tidak bosan, jadi saat mereka menangani pengujian dan penyebaran, Anda bebas melakukan hal-hal penting, seperti membuat sendiri sandwich. Jadi pergi buat sandwich itu, dan makan seperti juara otomatisasi!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.