Nếu bạn thường xuyên gõ lệnh git pull trên máy chủ để cập nhật code mới nhất thì bài viết này sẽ dành cho bạn. Bài viết này hướng dẫn sử dụng hệ thống tự động Pull/Deploy Git Code cho những dự án không phức tạp, không đòi hỏi phải sử dụng Continuous Integration, hoặc đơn giản là 1 bước cập nhật code lên máy chủ test/development.

Vấn đề

Mình tiếp quản một số máy chủ test/development chứa gần 20 repo cho mỗi máy chủ, với thiết lập tự động (cronjob) fetch & pull mỗi phút một lần, điều này tạo áp lực không nhỏ cho server khiến nó gần như bị tê liệt mỗi lần chạy.
Nhất là khi gặp trường hợp xung đột/conflict (vì có thể ai đó upload file thông qua FTP *_*), phải chạy git reset thì thôi đơ luôn. Nhiệm vụ được giao là tìm kiếm cách thức nào đó để hạn chế vấn đề này, và mình đã tìm hiểu 2 công cụ:

Mình chọn cái đầu tiên Github-Auto-Deploy để áp dụng và sau một thời gian dài hoạt động trơn tru mình khá hài lòng vì mức độ đơn giản, tiện dụng, cứ mỗi lần git push, thì máy chủ sẽ tự động fetch code mới về và thực hiện một số lệnh deploy tùy theo dự án, ví dụ với Nodejs thì chạy yarn install với PHP thì composer install, cần thiết thì thêm hook gởi thông tin qua Slack chẳng hạn, hoặc gởi vào hệ thống Huginn để thực hiện thêm các chức năng liên kết hệ thống phức tạp khác (email, sms…n web hooks khác).

Cái thứ 2 là Git-Auto-Deploy kia thì nhiều chức năng hơn, vì vậy mà code nó cũng phức tạp hơn thiết nghĩ ko cần thiết. Hoặc giả sử cần nâng cấp hay tối ưu (ví dụ Basic Auth, Secret Key, Limit IP,..) cái công cụ này cũng khó khăn hơn cái của logsol.

Thời gian chuột bạch thử nghiệm đã hơn 1 năm thành công, hi vọng cũng sẽ giúp ích cho các bạn, bắt đầu thôi!

Thiết lập hệ thống tự động pull/deploy git

Cài đặt SSH để connect Git

Ở bước này, bạn xem ở đây https://help.github.com/articles/connecting-to-github-with-ssh, bước này khá đơn giản, chỉ cần tạo SSH key của server và thêm vào Github là xong, mục đích là không cần phải gõ mật khẩu để pull repo private – phù hợp cho chương trình tự động.

Clone repo bạn muốn tự động deploy

Đơn giản là clone vô cái thư mục chứa code trên server của bạn.

Cài đặt Github-Auto-Deploy

Sau khi vào thư mục bạn sẽ thấy file GitAutoDeploy.conf.json.example, copy nó ra và chỉnh sửa

port: port thì nên set cao hơn 1024, dưới 1024 thì phải đòi hỏi có quyền root

url: đường dẫn tới repo có thể dùng git hoặc https

path: đường dẫn tới thư mục đã được cài đặt phía trên

deploy: deploy này thì cơ bản chỉ cần git pull origin master – điều chỉnh theo remote/branch tương ứng trường hợp của bạn. Cái lệnh echo deploy successful không quan trọng đơn giản là báo hiệu việc pull đã thành công.

Bạn có thể thiết lập bao nhiêu repo cũng được, theo format json như trên là ok.

Chạy hệ thống tự động pull/deploy

Mở đường dẫn http://SERVER_NAME_OR_IP:8001 để kiểm tra server đã hoạt động, nếu bạn thấy hình sau  nghĩa là server đã hoạt động ok. Hệ thống chỉ hỗ trợ phương thức POST, nên khi truy cập bằng GET sẽ bị ăn lỗi :D.

Thiết lập webhook

Phần này thì cũng đơn giản thôi, vào tài khoản Github, vô Repo mà bạn muốn thiết lập -> Settings -> Webhook -> Add webhook

Đường dẫn sẽ là: https://github.com/your_name/your_repo_name/settings/hooks, nó ra màn hình:

Payload URL thì để tên/ip server của bạn và nhớ thêm port, ví dụ: http://123.456.789.111:8001

Content Type : chọn application/json, mấy thứ khác để nguyên.

Nếu sau khi tạo xong mà có dấu check màu xanh lá cây vậy là server hoạt động ok rồi.

Nâng cao/ Tùy chọn: Cho phép tự khởi động khi server restart

Thêm nội dung như sau

Ở đây mình sử dụng lệnh nohup, để không bị tắt chương trình Github-Auto-Deploy khi kết thúc phiên làm việc ssh với server, cũng như lưu lại tất cả các log từ stdout của chương trình.

Kiểm tra

Đến đây thì phần cài đặt đã xong, bạn hãy thử commit & push và kiểm tra xem repo ở server có được cập nhật không. Kiểm tra log ở file /path/to/directory/nohup.out

Fullstack Station Tips

  • Thay vì ở cấu hình mỗi repo ở file cấu hình GitAutoDeploy.conf.json, mục deploy, bạn dùng lệnh trực tiếp, thì có thể gọi tập lệnh từ file khác ví dụ: /path/to/directory/script.sh, thì file config sẽ đơn giản và dễ nhìn hơn. Nhất là đối với các repo phức tạp đòi hỏi thêm việc chạy migration database, cài đặt package và restart dịch vụ gì đó.
  • Nên chạy với quyền user bình thường, vì có thể bạn sẽ cần cài đặt thêm các package từ yarn hoặc composer, pip

Mình biết rằng có không nhiều bạn sử dụng Continuous Integration (CI) cho việc lập trình các dự án đơn giản, hoặc chỉ là dự án cá nhân. Đây là chương trình tự động pull/deploy đơn giản mà hiệu quả, hi vọng sẽ giúp ích nhiều cho các bạn.

 

 

Comments