Rails auto deployment với mina

Mở đề

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 😀

bài viết trước, mình đã nói về capistrano.

Hôm nay là một ngôi sao khác, de dọa sự thống trị của cap trong nhiều năm qua: mina.
Đe dọa sự thống trị luôn á?
Đúng. Mời bạn đọc thêm bài viết Mina vs Capistrano – cuộc so găng không cân sức để hiểu rõ hơn.

OK, vào việc nào.

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
  • releases: 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.
  • 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:

Chỉ 1 file duy nhất, đơn giản nhanh gọn 😛

Cấu hình

Chuẩn bị

  • Thêm vào Gemfile:

Cài gem mới:

config/deploy.rb

Sau khi bundle, bạn chạy lệnh:

Mina sẽ tạo file config/deploy.rb và điền sẵn một số thông tin cần thiết, chỉnh sửa lại như dưới đây:

  • require: lệnh sử dụng các module của mina
  • shared_paths: là danh sách các file, folder sẽ được sym link tới thư mục shared trên server.
  • task :environment: cái này là custom task, nó sẽ thiết lập môi trường cần thiết để chạy được các lệnh sau này. Tỏng ví dụ này mình dùng rbenv để quản lý ruby version, nên mình load nó vào, đồng thời phải tạo file .ruby-version trong thư mục gốc. Nội dung là tênruby version bạn cần chạy, vd: 2.3.0
  • task deploy: :environment sẽ định nghĩa tất cả những việc cần làm khi deploy. Để ý là task này sẽ gọi task :environment trước.
  • task restart_nginx:: đây là custom task, mình tự viết để restart nginx service.

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

Ở máy local, chạy lệnh sau để cài đặt các thư mục, file, thông số cần thiết trên server:

Deploy

Chỉ 1 lệnh duy nhất:

Mina tỏ ra hết sức nhanh gọn trong việc cấu hình, tuy nhiên, đó chỉ là 1 môi trường, 1 server. Còn nếu dùng nhiều môi trường, nhiều server thì việc cấu hình hơi phức tạp hơn 1 tí.

P/s: môi trường mặc định cho cấu hình này là production, muốn custom, bạn thêm vào config: (vd môi trường staging)

Multiple environment

  • Tạo file config/deploy_config.yml:

Thêm vào đó nội dung:

Hoàn toàn dễ hiểu đúng không 😛

  • Tiếp đến, cấu hình trong deploy.rb:

Tham khảo từ đây
Với cấu hình ở trên, ta sẽ có các task:

Những lần tới, muốn sử dụng thì chi việc gọi task tương ứng thôi:

Xong 🙂

Hoặc bạn có thể dùng module mina-multistage.

Multiple server deployment

nguồn

Hy vọng chức năng này sớm được navtive supported.

Rollback

Native supported.

Lưu ý là lệnh này không rollback database, muốn vậy, bạn cần chạy thêm task:

Hoặc viết 1 cái custom task cho riêng mình 😛

Rollback về 1 release cụ thể nào đó?

Hiện chưa hỗ trợ, nhưng bạn có thể đọc source code rồi tự viết 1 task riêng, tạo PR luôn cho máu 😛

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

Spread the love
  • 2
  •  
  •  
  •  
  •  
    2
    Shares

Leave a Reply

Be the First to Comment!

avatar
  Subscribe  
Notify of