Rails auto deployment với capistrano

Tình huống

Là một rails developer, việc deploy là một công việc hết sức quen thuộc, hết sức thường xuyên.

Khi deploy, bạn sẽ phải upload source code, migrate database, install gem, precompile assets, sym link files và folders…và hầm bà lằn các thứ khác.

Sẽ là ác mộng nếu như phải làm tất cả mọi thứ này bằng tay, thủ công.

Chính vì vậy, các auto deployment tool ra đời. Nó sẽ giúp bạn làm hết các công việc trên, việc của bạn chỉ là cấu hình cho nó biết phải làm những gì (1 lần duy nhất), những lần sau muốn deploy chỉ việc chạy 1 lệnh, thế là xong 😀

Ngôi sao của hôm nay chính là capistrano.

Capistrano (cap)

cap nổi tiếng và được tin dùng nhất trong giới rails developer cũng như nhiều ruby, php framework khác bởi sự tiện dụng, nhiều tính năng hữu ích, hỗ trợ đa môi trường, đa server và nhất là tính ổn định cao.

Kiến trúc

Server

Trên server, cấu trúc thư mục sẽ như sau:

  • current là một thư mục sym link, nó sẽ trỏ tới thư mục chứa source code hiện tại bên release
  • release: thư mục chứa các phiên bản release. Mặc định cap sẽ lưu lại 5 lần release gần đây nhất.
  • repo: chứa code khi clone từ vcs về, đồng thời chứa các thông tin về repo đó
  • revisions.log file chứa thông tin về các lần deployrollback
  • shared: thư mục chứa các file được dùng chung giữa các lần deploy, vd: database.yml, log, secrets.yml

Local

Dưới máy mình, các file config sẽ được cấu trúc như sau:

  • Capfile: file chứa các module require cần thiết cho cap.
  • config/deploy: file chứa các config chung cho cap, kiểu như file base_config vậy
  • config/deploy/: thư mục chứa các config cụ thể cho từng môi trường, mỗi môi trường là 1 file, vd: config/deploy/production.rb
  • lib/capistrano/tasks: chứa các custom task, thường là các task để mình tương tác với server từ dưới local, vd: log, upload file…

Bài viết này, chúng ta sẽ tập trung vào các config dưới local để công việc deploy được đơn giản hơn.

Cấu hình

Chuẩn bị

  • Thêm vào Gemfile:

Thực ra chỉ cần 2 gem trên là đủ, 2 gem dưới là 2 module, giúp việc chạy rails app trên server được tiện hơn thôi.

Cài các gem mới:

Chạy lệnh sau để tạo cấu trúc thư mục dưới local:

  • Capfile:
    File này chứa các lời gọi module, trong gem file mình có dùng 2 module là capistrano-bundlercapistrano-rbenv, nên mình sẽ require nó vào để dùng:

Tương tự, bạn muốn dùng module nào thì thêm nó vào Gemfile sau đó require trong Capfile là dùng được.

config/deploy.rb

Đây là file chứa các config chung:

Đoạn code trên hoàn toàn dễ hiểu rồi đúng không 🙂
deploy_to là thư mục sẽ chứa tất tần tật các file, folder ở mục cấu trúc server trên kia, với cấu hình trên, thư mục sẽ là /var/www/appconus-api
linked_files, linked_dir là danh sách các file, folder sẽ được sym link tới thư mục shared trên server.

Để biết thêm về các tham số cấu hình khác, bạn có thể xem tại trang chủ.

Lưu ý: bạn cần phải tạo thư mục /var/www/appconus-api trên server, và phân quyền cho user mà bạn login vào server (giả sử username là appconus):

config/deploy/production.rb

Các file config cho từng môi trường sẽ được đặt trong thư mục config/deploy/, mình ví dụ với môi trường production:

Các cấu hình cũng không khó hiểu lắm đúng không 🙂
role: mục này dùng để giới hạn phạm vi truy cập của các task, chỉ dùng role tương ứng cho các task tương ứng.
server: thiết lập thông số cho server của mình
ssh_options là các cấu hình ssh để cap có thể truy cập vào server

Để ý là ở file config chung ta set :branch, :master, nhưng đến production.rb ta lại set :branch, :release nên branch để lấy code mà deploy sẽ là release.

Deploy

Khâu chuẩn bị gian khổ nhất đã xong rồi, deploy thì cực kỳ đơn giản:

Các {environment} chính là các file bạn định nghĩa trong thư mục config/deploy/

Tada, cơ bản chỉ vậy thôi.

Nhưng đời không đẹp như vậy, đời nó vẫn cần nhiều hơn thế, và cơ bản thì cap nó cũng phục vụ được hết 😛

Rollback

Nếu sau khi deploy, bạn không muốn dùng bản mới nhất, mà dùng bản cũ. Mặc định cap lưu cho ta 5 lần deploy gần đây nhất, bạn hoàn toàn có thể rollback về các phiên bản đó:

Nó sẽ rollback về phiên bản ngay trước đó.

Còn nếu muốn về 1 phiên bản cụ thể nào đó thì sao?

Done 🙂

Multiple server deployment

Khi dự án phát triển lên, số lượng người dùng, số lượng request tăng lên, có thể ta sẽ phải mở thêm server để cân được lượng người dùng ngày càng nhiều này.

Cap cũng sẽ hỗ trợ trong việc cùng lúc deploy lên nhiều server.

Bạn chỉ việc khai báo thêm server trong file config là xong. Với ví dụ trên:

Tada 😀

Thêm chút nữa

Ngoài cap, còn 1 ngôi sao khác đang tỏa sáng, và đang đe dọa sự thống trị của cap: mina 😀

Lập trình và hơn thế nữa

Spread the love
  • 1
  •  
  •  
  •  
  •  
    1
    Share

Leave a Reply

Be the First to Comment!

avatar
  Subscribe  
Notify of