Drupal Deployment dan Backup dengan Capistrano

19 01 2008

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


    role :root, "dhiku.wordpress.com"
    role :localhost, "localhost"

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.


    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

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,


   task :nama_task , :roles => :nama_role do
      # lakukan task disini
   end

7. Definisikan task untuk deployment


   # 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

8. Definisikan task untuk checkout


   # 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

9. Definisikan task untuk backup


   # 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

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 :))


Actions

Information

3 responses to “Drupal Deployment dan Backup dengan Capistrano”

19 01 2008
A-ha » Drupal Deployment dan Backup dengan Capistrano (06:36:52) :

[...] Here’s another interesting post I read today by dhiku [...]

8 02 2008
cap (03:53:17) :

cap

wonderful post…

15 06 2008
fathur (14:42:53) :

kekurangannya…
link2 nya kurang tersedia…
BWAT pemula kayak aku N_N

Leave a comment

You can use these tags : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>