Getting Started With Capistrano 2.0

Posted by AnnoMundi on August 02, 2007

หลังจากได้ลองศึกษาและเขียน Web Application ด้วย Ruby On Rails มาได้สักพัก ก็ได้เวลา เอา Web Application ที่ทำ ไปใช้งานจริง ซึ่งในช่วงแรก ผมอาศัยการก็อปปี้จากตัว Development ไปใช้งาน โดยเปลี่ยน config ให้รันในโหมด Production ทั้งนี้ผมรันทั้ง Development และ Production บนเครื่องตัวเองที่บ้านครับ เพราะต้องการศึกษา และทดสอบให้มั่นใจซะก่อน

และจากเดิมที่ใช้วิธีการก็อบปี้ ก็เปลี่ยนมาใช้ Subversion ช่วยซึ่งก็ทำให้สะดวกขึ้น และในที่สุดก็เลยมาลองใช้ Capistrano เพราะเห็นใครๆเขาก็ใช้กัน ^^ และพอได้มาลองใช้ดู ก็พบว่าวิธีการใช้งาน ที่มีคนเขียนไว้ตามเว็ปต่างๆนั้น ใช้แทบไม่ได้เลย – -” เพราะเวอร์ชั่น 2.0 นี้ต่างจากของเดิมเยอะพอสมควร ก็เลยต้องลองผิดลองถูก เดาๆเอาจากของเดิมที่มีคนเขียนอธิบายไว้ กับที่เว็ปของ Capistrano เขียนไว้ (น้อยจัง) พอทำสำเร็จเลยต้องมาเขียน Blog ไว้กันลืม ^^”

เริ่มต้นเลยใช้เช็คก่อนว่าเราได้ลง Capistrano 2.0 ไว้หรือยัง

gem list

ถ้ายังไม่ได้ลงก็จัดการลงเลยครับ

sudo gem install capistrano

จากนั้นก็ใน Project Root directory ซึ่งในกรณี้ของผมโปรเจคชื่อ inventory และอยู่ที่ Directory /home/my_local_username/aptana/workspace/inventory

cd ~/aptana/workspace/inventory

จากนั้นก็ทำการสร้างคอนฟิกไฟล์ของ Capistrano ใน Project ของเราด้วยคำสั่ง

capify .

จากนั้นถ้าจะดูว่าเราสามารถใช้คำสั่งอะไรได้บ้างให้ลองใช้คำสั่งนี้ดูครับ

cap -T

ทีนี้ให้เราไปเปิดไฟล์ config/deploy.rb เพื่อแก้ไขคอนฟิกให้ใช้งานได้ถูกต้องตามต้องการ ซึ่งปกติหน้าตาไฟล์คอนฟิกที่มันสร้างให้จะเป็นดังด้านล่างนี้

set :application, "set your application name here"
set :repository,  "set your repository location here" 

# If you aren't deploying to /u/apps/#{application} on the target
# servers (which is the default), you can specify the actual location
# via the :deploy_to variable:
# set :deploy_to, "/var/www/#{application}" 

# If you aren't using Subversion to manage your source code, specify
# your SCM below:
# set :scm, :subversion

role :app, "your app-server here"
role :web, "your web-server here"
role :db,  "your db-server here", :primary => true

ก็ให้แก้ตัวแปร

  • :application เป็นชื่อโปรเจค
  • :repository เป็น subversion repository ที่โปรเจคนี้ใช้งาน
  • :runner เป็น username ที่ใช้งานบน Remote Server
  • :runner เป็น username ที่ใช้งานบน Remote Server
  • :deploy_to เป็น path ที่เราจะ deploy web application บน Remote Server
  • :app, :web และ :db เป็นชื่อโดเมนของ Remote Server ที่เราจะ Deploy Web ซึ่งในกรณีของผม ผมจะ Deploy ไปยัง inventory.codesniper.org ซึ่งอยู่ในเครื่องที่ ผมทำงานนั่นแหล่ะ แต่ผมเซ็ตชื่อโดเมนไว้ใน /etc/hosts application

หลังจากแก้ไขไฟล์ config/deploy.rb เสร็จหน้าตาก็จะเป็นดังนี้

set :application, "inventory"
set :repository,  "http://localhost/svn/inventory/trunk"
set :runner, 'my_remote_username'
# If you aren't deploying to /u/apps/#{application} on the target
# servers (which is the default), you can specify the actual location
# via the :deploy_to variable:
# set :deploy_to, "/var/www/#{application}"
set :deploy_to, "/home/my_remote_username/RailsProjects/#{application}"
# If you aren't using Subversion to manage your source code, specify
# your SCM below:
# set :scm, :subversion

role :app, "inventory.codesniper.org"
role :web, "inventory.codesniper.org"
role :db,  "inventory.codesniper.org", :primary => true

task :after_setup do
  run "mkdir -p #{shared_path}/media"
  run "mkdir -p #{shared_path}/media/thumbnail"
end

task :after_symlink do
  run "rm -rf current/public/media"
  run "ln -s #{shared_path}/media #{current_path}/public/media"
end

แต่ทั้งนี้จะเห็นว่าผมใส่ Callbak Task ไว้ 2 Task คือ :after_setup ส่วนการทำงานเดี๋ยวผมจะ อธิบายทีหลัง ทีนี้หลังจากที่เราแก้ไขไฟล์ deploy.rb เสร็จแล้ว เราจะทำการเซ็ต ในส่วนที่เกี่ยวกับการ สั่งรัน Web Application บน Remote Server ซึ่งในที่นี้ผมจะรันด้วย Mongrel ดังนั้นเราต้องสร้างไฟล์ script/spin ขึ้นมา

nano -w script/spin

โดยในไฟล์ spin นี้ให้ใส่คำสั่งดังต่อไปนี้ (อย่าลืมแก้ไข Path ให้ถูกต้องด้วยนะครับ) ไฟล์นี้จะถูก Capistrono เรียกใช้โดยอัตโนมัติ

/home/my_remote_username/RailsProjects/inventory/current/script/process/spawner -p 5010 -i 2

โดยไฟล์นี้จะทำหน้านี้รัน Mongrel ในที่นี้ผมเซ็ตให้รัน 2 Process เพราะผมได้เซ็ต Apache/mod_proxy ไว้แล้ว และหลังจากนี้ ให้เราแก้ไขไฟล์ config/database.yml กันก่อน เนื่องจากผมใช้ sqlite3 เป็นฐานข้อมูล ดังนั้นเพื่อไม่ให้มีปัญหาตอน Deploy ผมเลยแก้ไขไฟล์ database.yml เป็นดังนี้

development:
  adapter: sqlite3
  database: db/development.sqlite3

test:
  adapter: sqlite3
  database: db/test.sqlite3

production:
  adapter: sqlite3
  database: /home/my_remote_username/RailsProjects/inventory/shared/production.sqlite3

ที่ต้องระบุ path ของ Production database ดังด้านบน ก็เพราะถ้าเราเก็บไฟล์ฐานข้อมูลไว้ใน Directory “db” ที่อยู่ใน Root Project เมื่อเราทำการแก้ไขโปรแกรมแล้วทำการ Deploy เพื่ออัพเดท Web App บน Remote Server ไฟล์ฐานข้อมุลก็จะหายไป
ทีนี้่ก่อนที่เราจะ Deploy ให้ทำการ commit ไฟล์ในโปรเจคก่อน

svn commit -m "Config Capistrano to Project"

จากนี้เราจะเริ่มทำการ Deploy Web Application กัน เริ่มด้วยคำสั่ง

cap deploy:setup

หลังจากเรียกคำสั่งนี้ใน Remote server จะมี Directory จำนวนนึงถูกสร้างขึ้นมา และที่เราได้เขียน Callback Task ไว้ใน deploy.rb

task :after_setup do
  run "mkdir -p #{shared_path}/media"
  run "mkdir -p #{shared_path}/media/thumbnail"
end

เมื่อลองเช็คดูใน Remote Server ใน Path ที่เราจะ Deploy จะมี Directory “current”, “releases”, “shared” และใน “shared” นั้นจะมี Directory “media” และ “media/thumbnail” ที่เราสั่งให้สร้างไว้

จากนั้นให้ส่ัง Deploy ด้วยคำส่ัง

cap deploy:cold

ซึ่งคำสั่งนี้ใช้ Deploy Web Application ในครั้งแรก ซึ่งจะมีการสั่งรัน db:migration สร้างฐานข้อมุลขึ้นมา และรัน Mongrel ให้เราโดยอัตโนมัติ ส่วน Web Application ของเราจะถูก Deploy ไปยัง Directory “Release”

$ pwd
/home/my_remote_username/RailsProjects/inventory
$ ls
current  releases  shared
$ls releases
20070802140742
$ls releases/20070802140742
app      components  db   lib  nohup.out  Rakefile  REVISION  test  vendor
Capfile  config      doc  log  public     README    script    tmp

จะเห็นว่าบน Remote Server นั้น Web Application Root จะอยู่ใน 20070802140742 ซึ่ง Directory “current” จะลิ้งก์ไปที่ Directory “20070802140742″
และจากในช่วงแรกที่ผมได้เขียน Callback Task :after_symlink ไว้ใน deploy.rb

task :after_symlink do
  run "rm -rf #{current_path}/public/media"
  run "ln -s #{shared_path}/media #{current_path}/public/media"
end

ซึ่ง Callback Task นี้จะถูกรันในขั้นตอนนี้ ซึ่งจะทำการลบ Directory “media” ทิ้ง ที่ต้องลบทิ้งเพราะใน Directory นี้ที่ใช้เก็บรูปภาพ อาจมีรูปต่างๆที่เราอัพโหลดในช่วงพัฒนา ซึ่งเราไม่ได้เอาไปใช้จริง และหลังจากลบ Directory นี้แล้วก็เป็น คำสั่งสร้าง Symbolic link ไปยัง “shared/media” ส่วนทำไมต้องทำแบบนี้ เดี๋ยวจะอธิบายในช่วงต่อไปครับ ^^”
ส่วนตอนนี้เราสามารถ เปิดดูเว็ปเราได้แล้วนะครับ และต่อไป ถ้าเราทำการพัฒนาเพิ่มเติม หรือแก้ไขบน Local แล้วต้องการอัพเทดบน Remote เราก็สามารถทำได้โดยง่ายด้วยคำสั่ง

cap deploy

ซึ่งจะทำการ deploy Web Application ที่เราพัฒนาเพิ่มเติมเสร็จ ่ไปยัง Remote Server และทำการ Restart Mongrel แต่จะไม่มีการสร้างฐานข้อมูลใหม่ให้เรา เพราะเป็นการ Deploy เพื่ออัพเดท Web Application บน Remote Server ถ้าเราลองดูใน Directory “releases” จะเห็นว่ามี Directory ใหม่สร้างขึ้นมา ภายในนั้นก็คือ Web Application Root ชุดใหม่ที่เราเพิ่งสั่ง Deploy มา และ Directory Current ก็จะถูกเปลี่ยนมาชี้ที่นี่แทน

นั่นเป็นสาเหตุที่ผมได้แก้ไขไฟล์ database.yml ที่ระบุ sqlite database file ไว้ใน shared แทนก็เพราะถ้าไว้ภายใน Web Application Root เมื่อเรา Deploy เพื่ออัพเดท Directory “current” จะถูกเปลี่ยนให้ลิ้งก์ไปที่ Web Application Root อันใหม่ซึ่งจะไม่มีไฟล์ฐานข้อมูล

ตอนนี้น่าจะเริ่มเข้าใจแล้วนะครับว่า ที่ผมเขียน Callback Task ให้สร้าง Directory “media”, “media/thumbnail” ไว้ใน “shared” ก็ด้วยเหตุผลเดียวกัน เนื่องจาก Directory เหล่านี้ผมเอาไว้เก็บรูปภาพสินค้า เมื่อเราใช้งานบน Remote Server มีการอัพรูปสินค้าไปบ้างแล้ว ถ้าเราสั่ง deploy เพื่ออัพเดทเว็ป แล้วเราดันเก็บรูปไว้ใน Diretory ที่อยู่ภายใน Web Application Root มันก็จะเกิดปัญหาขึ้น เพราะ Directory “current” ถูกเปลี่ยนลิ้งก์ไปยัง Web Application Root ชุดใหม่แทน ทำให้รูปเดิมที่เคยอัพไปแล้วใช้ไม่ได้

สุดท้ายนี้ ผมไม่ได้เขียนเกี่ยวกับ การเซ็ต Apache – Subversion – Mongrel นะครับ ถ้าใครสนใจก็ ลองอ่านได้ที่นี่ครับ เพราะผมก็ไปอ่านจากที่นั่นแหล่ะ :P
ความจริงการใช้งาน Capistrano ยังมีอะไรให้ศึกษาอีกเยอะครับ มันสามารถเซ็ต และทำงานได้มากมาย กว่าที่ผมเขียนมาทั้งหมด เพียงแต่ผมพิ่งศึกษาและเพิ่งทดลองใช้งานได้แค่นี้ ไว้ถ้าได้อะไรมากกว่านี้ก็จะมาเขียนเพิ่มเติม

หมายเหตุ : ทั้งนี้ที่ผมทดสอบนั้น Local และ Remote Server จะอยู่บนเครื่องเดียวกัน อาจทำให้บางท่าน ที่อ่านแล้วนำไปใช้ อาจไม่ได้ผลอย่างที่ผมเขียน ก็ต้องขออภัยด้วยครับ

อ้างอิง : Capistrano

Zend Framework 0.6 Preview Release 1

Posted by AnnoMundi on December 20, 2006

ช่วงนี้ไม่ได้อัพบล็อกเลยเพราะมัวเขียนโปรแกรมและศึกษาเกี่ยวกับ Javascript ซึ่งต้องใช้
ในการทำเว็ปด้วย เลยยุ่งๆ แต่เมื่อวานลองเข้าไปดูในเว็ป Zend Framework ก็พบว่ามันได้
ออกเวอร์ชั่นใหม่มาแล้ว – -” เว็ปที่ผมทำอยู่นั้นใช้เวอร์ชั่น 0.2 Preview ก็เลยจัดการอัพเกรด
ซึ่งหลังจากอัพเกรดก็มีต้องแก้โค้ด 2-3 ที่เพราะบางคลาสมีการเปลี่ยนแปลงไปจากเดิมพอสมควร
นอกจากคลาสเดิมที่มีการปรับปรุงเพิ่มเติมก็มี component ใหม่ๆเพิ่มเข้ามา รายละเอียดก็
ตามด้านล่างเลยครับ

  • Lucene-compatible search engine query language
  • New Authentication component and improved ACL design
  • Improved MVC implementation and documentation
  • Improved Session-handling design
  • Integrated Google Data API Client
  • Improved XmlRpc client and server
  • Improved Http Client design, supporting cookies and proxy servers
  • New Web Services client for Simpy social bookmarking
  • Emerging components for I18N, Getopt, Mail folders, and many other enhancements to components and documentation.

นอกจากที่ Zend จะออก Zend Framework เวอร์ชั่นใหม่แล้วก็ยังออก Zend Google Data
Client Preview 0.6.0 มาด้วย แต่ตัวหลังนี้ผมยังไม่ได้ลองใช้เลย

ข้อเสียของการใช้ Zend Framework ทำเว็ปในตอนนี้คงเป็นเรื่องที่ตัว Framework มันยังไม่นิ่ง
ทำให้เวลา Zend ออกเวอร์ชั่นใหม่มาเราก็ต้องคอยแก้ไขโค้ดตามอยู่เรื่อยๆ แต่ข้อดีก็คือช่วงแรกๆ
นี้ตัว Framework มันยังไม่ซับซ้อนจะทำความเข้าใจได้ง่าย เมื่อมีเวอร์ชั่นใหม่ออกมาก็ศึกษา
เพิ่มเติมเอา แต่ถ้าใครต้องการ Framework ที่จะเอาไปใช้ทำเว็ปจริงๆจังๆน่าจะศึกษาและใช้งาน
Framework ตัวอื่นๆที่ตัว Framwork มัน stable แล้วมากกว่านะ

เว็ปไซต์ที่เกียวข้อง : Zend Framework

PHP Framework Benchmark 1

Posted by AnnoMundi on December 02, 2006

ช่วงนี้พอดีผมกำลังหัดใช้ Zend Framework อยู่ และก็บังเอิญไปเจอเว็ปบล็อกนึงเขาได้ทำการทดสอบ
PHP Framework ที่เป็นที่นิยมกัน ซึ่งก็มี่ี CakePHP, Solar, Symfony และ Zend Framework
ซึ่งเขาทดสอบ Benchmark ด้วยการเขียนโปรแกรมโดยใช้ Framework ต่างๆให้แสดงข้อความ
Hello World ออกมา และผลที่ได้คือ Solar > Symfony > Cake > Zend Framework
ซึ่ง Zend Framework ช้าที่สุด T_T ทำเอาผมเซ็งไปเลยเพราะกำลังใช้ทำเว็ปอยู่

แต่ก็เพราะเว็ปนี้ทำให้ผมรู้จัก PHP Framework เพิ่มขึ้นมาอีก 2 ตัว คือ Solar และ Symfony
เท่าที่ดู Feature ทั้ง 4 ตัวนี้แล้วรู้สึกว่า Symfony จะมีระบบคล้าย Ruby On Rails มากที่สุด
แต่ผมก็ยังขอปักหลักกับ Zend Framework ไปก่อน เพราะไหนๆระดับ Zend ลงมาทำเองแล้ว
ต่อไปน่าจะดีขึ้น เท่าที่ตามข่าวกลางเดือนธันวาคมนี้ก็จะออกเวอร์ชั่นใหม่กระโดดไปเป็น 0.60 เลย

ช่วงนี้ผมอาจอัพบล็อกไม่ถี่เท่าที่ควร ก็เพราะกำลังเขียนเว็ปด้วย Zend Framework นี่แหล่ะ
เด๋วพอ Zend Framework ออกเวอร์ชั่นใหม่มาอาจต้องมีแก้โค้ดกันใหม่อีกแหงๆ T_T
ส่วนใครอยากดูผลการ Benchmark เต็มๆก็ตามไปดูตามลิ้งก์อ้างอิงด้านล่างนะครับ

อ้างอิง : How Fast Is Your Framework?

Zend Framework Preview 0.2.0 Released!

Posted by AnnoMundi on November 02, 2006

ในที่สุด Zend Framework Preview 0.2.0 ก็ถูกปล่อยออกมาให้ทดลองใช้กันแล้วครับ
หลังจากปล่อย 0.1.5 ให้ใช้กันอยู่นาน โดยที่ยังขาด Feature สำคัญๆหลายอย่าง ผมเอง
ก็ได้ทดลองใช้ 0.1.5 กับเว็ปนึงเหมือนกัน ^^ โดยเวอร์ชั่น 0.2.0 ที่ออกมานี้มีการปรับปรุง
ของเดิมหลายจุดและมีการเพิ่มระบบที่ยังขาดไปในรุ่น 0.1.5 อย่าง JSON server และ
Session Component เยี่ยมจริงๆ รายละเอียดเต็มๆตามด้านล่างเลยครับ

  • New MVC implementation
  • New HTTP request and response objects make it easy to automate unit testing for web apps without a web server, and also make it possible to use MVC for command-line and PHP-GTK application development
  • Enhanced pure PHP Lucene-compatible search engine component
  • New Mysqli DB adapter
  • New JSON server
  • New REST client and server
  • New XmlRpc client and server
  • New Acl component
  • New Session component
  • New Web Services clients for Delicious and Audioscrobbler
  • New Registry component
  • Significant improvements to many other components

สำหรับคนที่เขียนเว็ปเองโดยใช้ PHP ผมว่า Framework ตัวนี้น่าสนใจไม่น้อยเลยครับ
เพราะทำให้การพัฒนาเว็ปง่ายขึ้นมาก เพียงแต่ Host ที่ท่านใช้ต้องรองรับ PHP 5.1.4 ขึ้นไป
นอกจากที่ Zend ปล่อย Zend Framework 0.2.0 เวอร์ชั่นใหม่แล้ว Zend ยังปล่อย
Zend Google Data Client Library Preview Release 0.2.0. ออกมาให้ทดลองใช้กันด้วย
โดยเจ้าตัวหลังนี้จะทำให้เราสามารถเขียนโปรแกรม PHP เพื่อติดต่อดึงข้อมูลจาก Google Data
Web Service อย่างเช่น Google Base, Calendar, Blogger, and CodeSearch ผมว่า
ว่างๆก็จะลองดูเหมือนกัน ^^

อ้างอิง : Zend FrameWork

Zend Studio 5.5 Beta Available Now!.

Posted by AnnoMundi on November 01, 2006

เพิ่งได้แว็ปไปดูที่เว็ป Zend.com แล้วก็เห็นว่าทาง Zend ได้ปล่อย Zend Studio 5.5 Beta
มาให้ทดลองใช้กันแล้ว ใครที่ชอบลองของใหม่ไปโหลดกันมาทดลองดูกันได้ครับ ส่วนผมขอใช้
Zend Studio 5.2 ต่อไป อดเจ็บใจเล็กๆไม่ได้เพราะ License ผมหมดไปได้ไม่กี่อาทิตย์เอง
แล้วไม่ได้ต่ออายุ ก็ค่าต่อมันตั้ง $199 แถมผมใช้มา 1ปียังไม่คุ้มเลยก็เลยว่าจะทนใช้ไปจนคุ้ม
ก่อน และรอมี Promotion ค่อยซื้อใหม่ ^^”

ส่วนเจ้า Zend Studio 5.5 Beta มีอะไรบ้างลองดูตามด้าล่างครับ

Version 5.2.0 to 5.5.0 Beta

PHP 5.2:

  • New PHP 5.2 Support

General:

  • Installation support for Mactel ( Install Anywhere 8 )
  • Support for antialiasing (via Preference settings)

Editor:

  • Supports opening URLs from the Editor using right click

Web Services Support (SOAP):

  • Support for URLs in SoapClient Constructors
  • Bug fixed: Unsynchronized file name and configuration name

Java:

  • Embedded Java code completion of packages and classes in PHP code
  • Configure the Workspace’s default JRE / JDK
  • Configure project specific preferences
  • Nested Java code completion

Zend Platform Integration:

  • View Zend Platform Events in a dedicated Events List window
  • Customize, sort and filter Event List entities
  • Limit number of visible rows and initiate auto refresh
  • View Events from user-selected servers
  • Direct access to Platform’s Configuration dialog from the toolbar / menu
  • Configure Zend Platform’s GUI URL and authentication information

Zend Framework Integration:

  • Enable code completion for Zend Framework
  • View Zend Framework classes and functions in the PHP Inspector View
  • View source and debug into Zend Framework code

Source Control:

  • Explorer: highlights file labels 1according to their status in source control (added, merged with conflicts, modified, not versioned and up to date)
  • Source Control file status highlighting is customizable (from the Preferences dialog)
  • Can easily switch between CVS and Subversion support
  • Support for Subversion 1.4

General Bugs Fixed / Changes:

  • Bug fixed – If no Zend Guard path detected there is no default value
  • Bug fixed – Zend Guard detection doesn’t recognize old versions
  • Bug fixed – PHP Functions list doesn’t provide return types for all functions
  • Bug fixed – Uuencode functions in PHP Functions list are malformed
  • Bug fixed – Open File dialog has serious delay when a network drive is disconnected
  • Bug fixed – FTP files containing spaces in their name causes wrong file parsing
  • Bug fixed – Wrong tab behavior in the Preferences window

สำหรับผม ผมว่าเวอร์ชั่นนี้ไม่ค่อยมีการเปลี่ยนแปลงไปจาก 5.2 สักเท่าไหร่ เป็นผม ผมจะรอ PHP6
แล้ว Zend ออก Zend Studio ที่ Support ออกมาค่อนน่าสนใจหน่อย (แต่ต้องมีโปรโมชั่นด้วยนะ ^^”)