No More Horror Issue 'It Works on My Machine' RoR Development Using Vagrant & Chef
“Kok dilokalku g jalan gini app nya?”
Sering ngalamin masalah itu? Dimana ketika suatu fitur dapat berjalan di lokal developer lain, sedangkan di lokal kita error disana-sini / bahkan app tersebut tidak dapat berjalan sama sekali.
Yep, saya sering mengalaminya dan sekarang ada solusinya!
Vagrant
Vagrant adalah sebuah tool yang secara otomatis melakukan setup development environment didalam mesin virtual didalam komputer. Anda akan dapat melakukan ssh
dari lokal komputer host menuju lokal pada mesin virtual.
Dengan demikian, development environment Anda akan dapat sama persis dengan production environment dan juga dapat didistribusikan kepada seluruh team kolaborasi Anda sehingga mereka juga memiliki environment yang sama tidak peduli jenis konfigurasi komputer / laptop yang digunakan untuk development. Awesome!
Chef
Chef adalah sebuah tool yang dapat melakukan otomatisasi setup untuk virtual mesin / server, misalnya instal DBMS, ruby, dan prerequisites lainnya yang dibutuhkan dalam sebuah development aplikasi.
Dengan demikian kita tidak perlu melakukan instalasi satu persatu kebutuhan konfigurasi yang diperlukan.
STEP 1 - Installation
- Install vagrant
- Install virtualbox
Install vagrant plugin :
$ vagrant plugin install vagrant-vbguest
, install otomatis host dari VirtualBox Guest Additions$ vagrant plugin install vagrant-librarian-chef
, memberitahu vagrant untuk running Chef ketika vagrant dijalankan
$ cd to/root/app_directory
$ vagrant init
, akan menggenerate vagrantfile pada root directory aplikasi$ touch Cheffile
, akan membuat Cheffile pada root directory aplikasi
STEP 2 - Configuration
Buka file Cheffile, lalu tambahkan code berikut :1
2
3
4
5
6
7
8
9site "http://community.opscode.com/api/v1"
cookbook 'apt'
cookbook 'build-essential'
cookbook 'mysql', '5.5.3'
cookbook 'ruby_build'
cookbook 'nodejs', git: 'https://github.com/mdxp/nodejs-cookbook'
cookbook 'rbenv', git: 'https://github.com/fnichol/chef-rbenv'
cookbook 'vim'
Pada Cheffile tersebut disebutkan prerequisites pada virtual mesin, dan ketika vagrant dijalankan untuk pertama kalinya akan secara otomatis melakukan installasi prerequisites tersebut.
Buka Vagrantfile yang telah tergenerate sebelumnya. Akan ada banyak konfigurasi pada file tersebut. Untuk sekarang kita hanya membutuhkan konfigurasi sebagai berikut :
1 | # -*- mode: ruby -*- |
add_recipe
akan menginclude receipe dari Cheffile kita ketika vagrant dijalankan.
Anda dapat menambahkan receipes sesuai kebutuhan Anda (tambahkan di Cheffile dan include di Vagrantfile). Untuk daftar receipes dapat Anda temukan pada repository opscode-cookbooks
STEP 3 - Running Vagrant
$ vagrant up
, Proses ini akan memakan waktu lama untuk pertamakalinya karena akan melakukan installasi OS sesuai konfigurasi dan prerequisites yang dibutuhkan. Untuk selanjutnya akan sangat lebih cepat karena semua configurasi telah terinstall- (additional info) Ketika Anda melakukan perubahan pada Vagrantfile dan Cheffile, maka Anda perlu untuk melakukan
$ vagrant provision
- (additional info) ketika vagrant telah
up
dan Anda ingin mematikan virtual mesin Anda, cukup dengan$ vagrant halt
$ vagrant ssh
, perintah ini akan melakukan ssh ke virtual mesin- Ketika telah masuk ke ssh mesin virtual, pindah ke shared directory antara host dan virtual mesin
$ cd /vagrant
. Anda dapat mengecek dengan$ ls
untuk memastikan directory pada virtual mesin memiliki isi sama persis dengan directory aplikasi pada host komputer Anda - Jalankan perintah dasar Ruby on Rails (
bundle
,db:create
,db:migrate
, dsb sampairails s
) - Buka browser seperti biasa, dan akses
localhost:port
Anda
Berikut adalah output yang akan tampil pada terminal ketika melakukan $ vagrant up
dan $ vagrant ssh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39# The commented lines are the output you should see when you run these commands
vagrant up
#==> default: Checking if box 'ubuntu/trusty64' is up to date...
#==> default: Clearing any previously set forwarded ports...
#==> default: Installing Chef cookbooks with Librarian-Chef...
#==> default: The cookbook path '/Users/chris/code/test_app/site-cookbooks' doesn't exist. Ignoring...
#==> default: Clearing any previously set network interfaces...
#==> default: Preparing network interfaces based on configuration...
# default: Adapter 1: nat
#==> default: Forwarding ports...
# default: 3000 => 8080 (adapter 1)
# default: 22 => 2222 (adapter 1)
#==> default: Running 'pre-boot' VM customizations...
#==> default: Booting VM...
#==> default: Waiting for machine to boot. This may take a few minutes...
# default: SSH address: 127.0.0.1:2222
# default: SSH username: vagrant
# default: SSH auth method: private key
# default: Warning: Connection timeout. Retrying...
#==> default: Machine booted and ready!
#==> default: Checking for guest additions in VM...
#==> default: Mounting shared folders...
# default: /vagrant => /Users/chris/code/test_app
# default: /tmp/vagrant-chef-1/chef-solo-1/cookbooks => /Users/chris/code/test_app/cookbooks
#==> default: VM already provisioned. Run `vagrant provision` or use `--provision` to force it
vagrant ssh
#Welcome to Ubuntu 14.04 LTS (GNU/Linux 3.13.0-24-generic x86_64)
#
# * Documentation: https://help.ubuntu.com/
#
# System information disabled due to load higher than 1.0
#
# Get cloud support with Ubuntu Advantage Cloud Guest:
# http://www.ubuntu.com/business/services/cloud
#
#
#vagrant@vagrant-ubuntu-trusty-64:~$
Perlu diketahui, pada Vagrantfile terdapat konfigurasi config.vm.network :forwarded_port, guest: 3000, host: 8080
, maksudnya adalah ketika anda running di virtual mesin pada port 3000
maka untuk menampilkan aplikasi pada browser harus pada port 8080
.
Ketika Anda menginginkan environment terdistribusi memiliki state yang sama (misal data pada database, dsb) Anda dapat menjalankan perintah $ vagrant package
. Perintah tersebut akan menggenerate box, dan Anda dapat memberikan kepada team kolaborasi Anda sehingga mereka memiliki development environment yang sama dengan yang Anda miliki.
Untuk daftar CLI vagrant, dapat ditemukan pada Vagrant Command-Line Interface
Vagrant memberikan kemudahan kepada team kolaborasi untuk dapat memiliki environment yang sama antara satu dengan yang lain, sehingga horror It works on my machine tidak akan terjadi lagi (: