“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
9
site "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
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
40
41
42
43
44
45
46
47
48
49
50
51
# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
# Use Ubuntu 14.04 Trusty Tahr 64-bit as our operating system
config.vm.box = "ubuntu/trusty64"

# Configurate the virtual machine to use 2GB of RAM
config.vm.provider :virtualbox do |vb|
vb.customize ["modifyvm", :id, "--memory", "2048"]
end

# Forward the Rails server default port to the host
config.vm.network :forwarded_port, guest: 3000, host: 8080

# Use Chef Solo to provision our virtual machine
config.vm.provision :chef_solo do |chef|
chef.cookbooks_path = ["cookbooks"]

chef.add_recipe "apt"
chef.add_recipe "nodejs"
chef.add_recipe "ruby_build"
chef.add_recipe "rbenv::user"
chef.add_recipe "rbenv::vagrant"
chef.add_recipe "vim"
chef.add_recipe "mysql::server"
chef.add_recipe "mysql::client"

# Install Ruby 2.1.2 and Bundler
# Set an empty root password for MySQL to make things simple
chef.json = {
rbenv: {
user_installs: [{
user: 'vagrant',
rubies: ["2.1.2"],
global: "2.1.2",
gems: {
"2.1.2" => [
{ name: "bundler" }
]
}
}]
},
mysql: {
server_root_password: ''
}
}
end
end

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 sampai rails 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 (: