Drupal Deployment dan Backup dengan Capistrano

Setelah bermain2 dengan drupal untuk project web collaboration, gw selalu melakukan kegiatan yang sifatnya administratif dan berulang2. Parahnya lagi ini ga bisa gw lakukan lewat administrator interface. Beberapa hal tsb misalnya,

  • Karena project disimpan di subversion maka untuk memulai project, gw dan anggota tim harus,
    • Checkout project dari repository
    • Memindahkan hasil checkout ke direktori /var/www/
    • Setelah kerjaan selesai, tinggal commit hasilnya
  • Deployment ke server
    • SSH ke server
    • Export project (last stable) dari repository
    • Backup project sebelumnya dengan me-rename namanya menjadi project-backup. Misalnya dari /var/www/project ke /var/www/project-backup
    • Memindahkan hasil export project ke direktori /var/www
  • Backup data
    • SSH ke server
    • Copy project ke direktori backup. Misalnya, copy dari direktori /var/www/project ke /backup/project-[tanggal_hari_ini]
    • Dump database dan simpan di dalam direktori backup (/backup/project-[tanggal_hari_ini])

Kegiatan tsb kalo dilakukan terus menerus akan sangat membosankan. Nah maka itu gw pgn semua proses di atas bisa diotomasi. Maka gw ketemu sama yang namanya Capistrano, tools yang dibuat di atas ruby dan bertugas untuk melakukan otomasi kegiatan2 yang sifatnya repetitif seperti, instalasi, deployment, mengatur konfigurasi2, backup, dsb. Karena dibuat dengan ruby maka capistrano ini mudah di-extend dengan menambah ruby module. Capistrano ini bisa melakukan otomasi project yang dibangun selain ruby (walaupun awalnya ditujukan khusus ruby).

Maka dari itu gw mau share script capistrano untuk melakukan deployment dan backup pada projek drupal. Dengan asumsi OS yang digunakan adalah Ubuntu.

1. Install ruby dan rubygems
apt-get install ruby rubygems

2. Install capistrano lewat gems
gem install capistrano

3. Buat file dengan nama capfile (ini adalah nama default untuk capistrano)

4. Definisikan nama role untuk diasosiasikan ke host yang akan di-remote. Misalnya role root akan melakukan kegiatan2 pada host dhiku.wordpress.com
[sourcecode language=’ruby’]
role :root, “dhiku.wordpress.com”
role :localhost, “localhost”[/sourcecode]
5. Karena gw menggunakan Subversion untuk checkout dan export maka capistrano harus meminta username dan password SVN. Caranya cukup dengan kode di bawah yang artinya variable :svn_user akan diisi oleh input dari user, begitu juga dengan :svn_password, namun bedanya karena svn_password tipenya password maka tentu harus dihidden.
[sourcecode language=’ruby’]
set :svn_user do
Capistrano::CLI.ui.ask “SVN username?”
end

set :svn_password do
Capistrano::CLI.password_prompt “SVN Password for #{svn_user}?”
end[/sourcecode]
6. Sekarang kita mulai mendefinisikan task untuk masing2 kegiatan yang biasa dilakukan, deployment, checkout dari repository, dan backup data.
Mendefinisikan task sangat mudah dengan capistrano,
[sourcecode language=’ruby’]
task :nama_task , :roles => :nama_role do
# lakukan task disini
end[/sourcecode]
7. Definisikan task untuk deployment
[sourcecode language=’ruby’]
# Tentukan deployment direktori
set :deploy_to do
Capistrano::CLI.ui.ask “Deployment path of project website e.g /var/www/project?”
end

# Tentukan alamat repository
set :repository, “https://project.dhiku.com/svn/project”

# Tentukan alamat direktori temporary
temp_dir = ‘tmp/export/project’

# Berikan deskripsi untuk task deployment
desc “Deployment ke server”
# Definisikan task untuk deployment dan yang melakukan adalah role dengan nama root
task :deploy , :roles => :root do
# Jalankan svn export ke direktori tmp/export/project
run “svn export –username #{svn_user} –password #{svn_password} #{repository} #{temp_dir}”

# Backup project sebelumnya dengan me-rename namanya menjadi project-backup
sudo “mv #{deploy_to} #{deploy_to}-backup”

# Memindahkan hasil export project ke direktori deployment
sudo “mv #{temp_dir} #{deploy_to}”
end[/sourcecode]
8. Definisikan task untuk checkout
[sourcecode language=’ruby’]
# Berikan deskripsi untuk task checkout
desc “Checkout dari server”
# Definisikan task untuk checkout dan yang melakukan ini adalah role localhost
task :checkout, :roles => :localhost do

# Jalankan svn export ke direktori temp
run “svn checkout –username #{svn_user} –password #{svn_password} #{repository} #{temp_dir}”

# Backup project sebelumnya dengan me-rename namanya menjadi project-backup
sudo “mv #{deploy_to} #{deploy_to}-backup”

# Memindahkan hasil export project ke direktori deployment
sudo “mv #{temp_dir} #{deploy_to}”
end[/sourcecode]
9. Definisikan task untuk backup
[sourcecode language=’ruby’]
# Berikan deskripsi untuk task backup
desc “Backup project site dan DB ke direktori backup/project-[date]”

task :backup , :roles => :root do
db_name = ‘project’
db_user = ‘project’
backup_dir = “backup/project-#{Date.today}”

# Backup project site
run “cp -r #{deploy_to} #{backup_dir}”

# Backup DB
set :db_password do
Capistrano::CLI.password_prompt “Database password for #{db_user}?”
end
run “mysqldump -u #{db_user} -p#{db_password} #{db_name} > #{backup_dir}/#{db_name}.sql”
end[/sourcecode]
10. Capistrano siap dijalankan, dan kita bisa liat daftar task yang sudah dibuat sebelumnya dengan,
cap -T
Outputnya kira2 seperti ini,
cap deploy #Deployment ke server
cap checkout #Checkout dari server
cap backup #Backup project site dan DB ke direktori backup/project-[date]
Capistrano siap untuk dijalankan, untuk menjalankan task backup, cukup dengan cap backup. Selamat mencoba dan nikmati hidup dengan hal2 lain yang lebih bermanfaat :))

3 comments

  1. Pingback: cap

Leave a Reply