Coding4ever’s Blog

Just coding… coding… and coding… because coding should be fun :)

GitLab CI Untuk .NET Developer Bagian #1

| Comments

Sudah hampir setahun saya menggunakan Jenkins sebagai tool/software CI Continuous Integration. Ada banyak manfaat yang saya rasakan terutama untuk mengurangi pekerjaan-pekerjaan sepele tapi berulang seperti pembuatan paket instalasi, upload updatean terbaru ke server atau deploy web api/service ke server development atau production. Dengan menggunakan software CI(Continuous Integration) seperti Jenkins pekerjaan-pekerjaan membosankan tersebut bisa dilakukan hanya dengan mengklik satu tombol atau bisa juga dibuat otomatis ketika kita mem-push perubahan source code ke repository git. Waktu yang dibutuhkan juga biasanya tidak lama sekitar 1-3 menit, ya tergantung besar atau kecilnya project yang akan dibuild/deploy.

Selain itu dari sisi dokumentasi juga ikut terbantu, karena tool seperti Jenkins dan dengan bantuan pluginnya bisa otomatis mengenerate history build dari waktu ke waktu.

Tapi pada postingan kali ini saya ingin membahas tool/software CI(Continuous Integration) yang lain yaitu GitLab CI. Beberapa hari ini saya menyempatkan untuk mencoba GitLab CI dan kesimpulannya ada beberapa kelebihan GitLab CI dibandingkan Jenkins yaitu:

  • GitLab CI sudah terintegrasi dengan GitLab . GitLab adalah layanan cloud untuk repository git, jadi mirip dengan github atau bitbucket. Kelebihan gitlab dibandingkan dengan github dan bitbucket adalah untuk layanan gratisnya tidak ada pembatasan jumlah tim atau jumlah repository private yang bisa dibuat. Sedangkan untuk Jenkins repository gitnya harus diinstall terpisah atau menggunakan layanan repository git yang sudah ada seperti gitlab, github atau bitbucket.
  • Konfigurasi Job di GitLab CI lebih sederhana dibandingkan Jenkins. Konfigurasi job GitLab CI menggunakan file text biasa dengan format YAML, sehingga file konfigurasi ini bisa kita tambahkan ke repository git.
  • Satu konfigurasi GitLab CI sudah bisa digunakan untuk beberapa job dan stage sedangkan dengan Jenkins kita harus membuat beberapa job untuk masing-masing stage (CMIIW).
  • Penggunaan Jenkins sangat cocok untuk keperluan internal kantor, jadi jika ingin digunakan secara public (di akses via internet) harus menyediakan mesin khusus yang mempunyai ip public atau bisa juga menggunakan VPS. Sedangkan untuk GitLab CI sendiri kita cukup menyediakan mesin yang mempunyai akses internet dan tidak harus mempunyai ip public.
  • Apalagi ya…, silahkan dicoba sendiri he he :-D

Continuous Integration

Sebelum kita lanjut ke pembahasan GitLab CI, saya ingin mereview kembali apa yang dimaksud dengan CI (Continuous Integration). Continuous Integration, untuk selanjutnya kita sebut CI saja, merupakan salah satu kegiatan untuk meningkatkan produktivitas dalam pengembangan aplikasi di mana seluruh hasil kerja (source code) dari masing-masing developer digabungkan (push) ke dalam satu wadah (server repository source code). Bisa sekali sehari, bisa juga beberapa kali dalam sehari. Setiap penggabungan source code akan diverifikasi secara otomatis oleh server CI, yang memungkinkan tim untuk mendeteksi secara dini jika ada masalah/konflik/error pada saat penggabungan source code.

Setelah penggabungan hasil kerja (source code) selesai, server CI otomatis akan melakukan proses build untuk memastikan tidak ada kode yang merusak/membuat proses build gagal. Jadi semakin cepat kegagalan build ini diketahui semakin cepat pula kita meresponnya. Dan jika proses build-nya berhasil akan dilanjutkan dengan proses deploy. Selain itu server CI juga bisa dikonfigurasi untuk melakukan proses lain seperti menjalankan unit testing, integration testing dan testing otomatis lainnya.

Sebagai .NET developer kita sudah biasa melakukan proses build dengan menekan tombol F5 (Start Debugging) atau Ctrl+F5 (Start Without Debugging) baik pada waktu development atau perbaikan bug. Sedangkan untuk contoh deploy anggap saja seperti kita membuat paket installer yang akan didistribusikan ke komputer/server klien. Nah dengan menggunakan CI semua proses ini bisa dilakukan secara otomatis dan terpusat, sehingga kita mempunyai arsip hasil build dan deploy dari waktu ke waktu. Jadi untuk mencari file setup/paket installer terakhir enggak usah lagi nanya ke developer karena bisa langsung kita download dari server CI-nya.

Proses build ini selain bisa dibuat otomatis setiap kita mem-push source code ke server repository bisa juga kita buatkan jadwalnya, misal pas jam makan siang atau jam pulang kantor. Jadi di kantor dibuat kesepakatan/aturan klo ada yang merusak build pas jam makan siang enggak boleh makan siang sampai proses build-nya berhasil atau yang merusak build pas jam pulang kantor enggak boleh pulang sampai proses build-nya berhasil :-D

Jadi dengan menggunakan CI, alur kerja kita lebih kurang seperti berikut :

  • Menulis kode, build dan tes di komputer masing-masing (seperti biasa).
  • Commit dan push kode ke server repository/source control seperti GIT atau SVN.
  • Server CI akan meng-clone/pull repository kemudian melakukan build, menjalankan tes otomatis (jika ada) dan deploy secara otomatis. Jika buildnya gagal ulangi lagi langkah pertama.

Nah mudah-mudahan sampai di sini sudah punya gambaran ya tentang apa itu Continuous Integration dan bagaimana cara kerjanya.

Apa saja yang perlu dipelajari ?

Untuk belajar CI, tentu saja ada pengetahun penunjang yang perlu Anda pelajari yaitu penggunaan Source/Version Control terutama GIT dan aplikasi GIT Client seperti TortoiseGit. Pengetahun lainnya adalah pembuatan paket instalasi menggunakan Inno Setup untuk aplikasi desktop atau bisa juga pengetahuan mendeploy web api/service ke server.

GitLab CI

GitLab CI adalah salah satu tool/software Continuous Integration gratis yang merupakan bagian dari GitLab. GitLab sendiri merupakan layanan cloud repository git, jadi mirip dengan github atau bitbucket. Kelebihan dari GitLab ini sendiri, untuk versi gratisnya tidak dibatasi seperti halnya github dan bitbucket. Jadi dengan versi gratisnya tidak ada pembatasan jumlah private repository yang bisa kita buat ataupun jumlah tim yang terlibat. Menarik bukan untuk sebuah layanan cloud repository git yang gratis.

GitLab CI sendiri kalo kita lihat lebih mirip dengan sebuah dashboard untuk mengelola job dan log hasil buildnya. Jadi aslinya yang melakukan build dan deploy itu bukanlah GitLab CI tapi tool lain yang disebut dengan GitLab Runner. GitLab Runner ini harus kita install di mesin (pc/server) yang mempunyai akses internet agar bisa terhubung ke service GitLab CI. Mesin untuk GitLab Runner tidak harus mempunyai ip public yang penting terkoneksi dengan internet.

Idenya sederhana tapi brilian, dengan konsep seperti ini akan menghemat resource dari server GitLab itu sendiri, karena semua resource yang dibutuhkan untuk proses build dan deploy di tanggung oleh mesin dari user/developer. Tapi dari sisi user/developer juga diuntungkan karena mesin untuk build dan deploynya adalah milik kita sendiri, sehingga kita punya akses full untuk setup/konfigurasi tool/software apa saja yang dibutuhkan untuk proses build dan deploy tersebut.

GitLab Runner

GitLab Runner adalah tool/software yang bertugas untuk menjalankan job dan mengirimkan kembali hasilnya ke GitLab, nah data-data inilah yang akan diolah oleh GitLab CI.

GitLab Runner bisa diinstall untuk GNU/Linux, macOS, FreeBSD, dan Windows.

Instalasi GitLab Runner

Instalasi GitLab Runner sendiri sangat mudah, ditambah dengan dokumentasi yang lengkap. Jadi seharusnya Anda tidak akan mendapatkan masalah untuk langkah-langkah instalasinya. Untuk petunjuknya bisa ada cek di sini.

Untuk memastikan instalasinya GitLab Runnernya berhasil, silahkan Anda cek service GitLab Runnernya.

Selain menginstall GitLab Runner, kita juga perlu menginstall beberapa tool pendukung seperti:

Intinya semua tool pendukung di atas, diinstall sesuai dengan kebutuhan environment development.

Mendaftarkan Repository ke GitLab Runner

Setelah instalasi GitLab Runner, berikutnya adalah mendaftarkan repository git ke GitLab Runner. Berikut langkah-langkahnya:

Langkah 1. Login ke GitLab, klo belum punya ya silahkan daftar terlebih dulu.

Langkah 2. Buat repository baru

Langkah 3. Setelah membuat repositorynya berhasil, klik link Settings -> Pipelines

Scroll ke bawah sedikit, kemudian catat informasi Specific Runners untuk poin 2 dan 3.

Kemudian di bagian Shared Runners klik tombol Disable shared Runners

Langkah 4. Berikutnya adalah mengaktifkan Command Prompt dengan mode Administrator kemudian masuk ke folder instalasi GitLab Runner

Setelah itu ketik perintah gitlab-runner register, kemudian tinggal jawab pertanyaan yang ada termasuk informasi Specific Runners yang kita dapatkan di langkah 3.

Jika proses registrasinya berhasil, kita bisa cek runner aktifnya dibawah informasi Specific Runners

Contoh Project

Untuk keperluan uji coba kali ini saya menggunakan contoh aplikasi Northwind yang bisa Anda download di sini. Setelah itu kita push source codenya ke link repository gitlab yang sudah kita buat di langkah-langkah sebelumnya.

Dan untuk proses push-nya saya menggunakan TortoiseGit.

Menambahkan file .gitlab-ci.yml

Untuk melakukan konfigurasi GitLab CI, kita perlu menambahkan file dengan nama .gitlab-ci.yml. File ini adalah file text biasa yang menggunakan format YAML, sehingga file konfigurasi ini bisa kita tambahkan ke folder source code kemudian kita simpan juga ke repository git.

Berikut contoh isi file .gitlab-ci.yml

Coba perhatikan skrip di atas, di baris ke-6 kita mendefinisikan beberapa stage yaitu restore dan build, kita bisa juga menambahkan stage yang lain misal test, deploy, development, production, dst. Stage digunakan untuk menentukan jenis dari job. Jadi perlu diingat bahwa stage dan job itu berbeda, walaupun dibanyak contoh menggunakan nama yang sama untuk stage dan job.

Eksekusi antar job di GitLab CI itu sifatnya independen atau dengan kata lain tidak ada hubungan antar job. Ketika job B membutuhkan file yang dihasilkan oleh job A secara default tidak bisa, sehingga kita perlu menambahkan konfigurasi cache, seperti yang terlihat di baris ke-10. Kita mendaftarkan folder lib ke dalam konfigurasi cache. Folder lib ini berisi file-file library (*.dll) hasil dari job restore_nuget_package. Semua file yang ada di folder lib ini dibutuhkan pada saat menjalankan job build_solution.

Berikutnya kita pindah ke baris 15, di baris ini kita mendefinisikan job dengan nama restore_nuget_package dengan tipe stage restore, kemudian menjalankan skrip untuk merestore paket nuget.

Terakhir di baris ke-21, kita mendefinisikan job lain dengan nama build_solution, sesuai namanya job ini digunakan untuk membuild solution atau project atau klo lewat IDE Visual Studio .NET kita menekan tombol F5 (Start Debugging) atau Ctrl+F5 (Start Without Debugging).

Cara Mengecek/Memvalidasi Skrip File .gitlab-ci.yml

Sebelum kita menambahkan file .gitlab-ci.yml ke repository git, ada baiknya kita cek terlebih dahulu apakah script yang kita tuliskan sudah benar atau belum. GitLab CI sudah menyediakan link khusus untuk mengeceknya, yang bisa Anda cek di sini.

Testing Build

Untuk testing build kita tinggal melakukan push ke repository git.

Kemudian untuk melihat log progres buildnya kita bisa cek link Pipelines.

Gambar detail job yang sedang dijalankan

Untuk melihat detail log dari masing-masing job, tinggal kita klik nama jobnya, misal job restore nuget package

job build solution

Status proses build berhasil

Untuk contoh lengkap hasil buildnya bisa Anda cek di sini

Akhirnya selesai juga postingan GitLab CI untuk .NET Developer Bagian #1, dan mudah-mudahan bisa dipahami :-D. Untuk postingan berikutnya insyaAlloh kita akan menambahkan job untuk membuat paket instalasi menggunakan Inno Setup dan menguploadnya sehingga bisa langsung didownload via Dashboard GitLab CI.

Selamat MENCOBA :-)

continuous integration, gitlab ci

Tentang Penulis

Software developer yang fokus mengembangkan aplikasi di atas platform .NET (Desktop, ASP.NET MVC, Web Service, Microservice) dan Android. Senang mempelajari teknologi baru terutama di bidang OOP, Design Pattern, ORM, Database, Continuous Integration & Deployment dan arsitektur Microservice.
Selain mengajar, saat ini penulis juga bekerja sebagai staf IT di salah satu PTS di Yogyakarta sebagai senior software developer. Di waktu luang insya Alloh akan terus berbagi pengalaman di blog ini :)

« Membuat Service SMS Gateway untuk Engine Gammu GitLab CI untuk .NET Developer Bagian #2 »

Comments