Môi trường phát triển
Nguyễn Nhân  

Hướng dẫn sử dụng hệ thống tự động Pull/Deploy Git Code

Nếu bạn thường xuyên gõ lệnh `git pull` trên máy chủ để tự động pull 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.

Nội dung chính

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.

cd /path/to/directory
git clone git://github/your_name/your_repo.git

Cài đặt Github-Auto-Deploy

cd /path/to/directory
git clone git@github.com:logsol/Github-Auto-Deploy.git
cd 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

cp  GitAutoDeploy.conf.json.example  GitAutoDeploy.conf.json
{
 "port": 8001,
 "repositories":
 [
     {
        "url": "https://github.com/{NAME}/{REPOSITORY_NAME}",
	"path": "/path/to/directory/{DIRECTORY}",
	"deploy": "git pull origin master && echo deployed {REPOSITORY_NAME_OR_WHATEVER}"		
     }
 ]
}

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

cd /path/to/directory/Github-Auto-Deploy
nohup python -u GitAutoDeploy.py  --daemon-mode --quiet &
tail -f nohup.out  # kiểm tra log

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

crontab -e

Thêm nội dung như sau

@reboot cd /path/to/directory/Github-Auto-Deploy/ && nohup /usr/bin/python -u GitAutoDeploy.py --daemon-mode --quiet &

Ở đâ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.

Xử lý khi pull thành công hay thất bại

Xem lại ở phần config:

“deploy”: “git pull origin master && echo deployed {REPOSITORY_NAME_OR_WHATEVER}”

Ở câu lệnh deploy, thì chỉ đơn giản là echo, mình sẽ tối ưu thêm 1 chút để có thể gởi thông báo pull thành công hay thất bại. Tạo thêm 2 script chứa lệnh curl đơn giản đến api nào đó của Chatwork hay Slack, cái này cũng đơn giản thôi.

# notify_success.sh 
curl -X POST -H "X-ChatWorkToken: e12321ef233d8a92deb1cc15bc09b79e" \
    -d "body=Success&self_unread=0" \
    "https://api.chatwork.com/v2/rooms/11111178/messages"

# notify_failed.sh
curl -X POST -H "X-ChatWorkToken: e12321ef233d8a92deb1cc15bc09b79e" \
    -d "body=Failed&self_unread=0" \
    "https://api.chatwork.com/v2/rooms/11111178/messages"

Lúc đó lệnh deploy sẽ đổi thành:

“deploy”: “git pull origin master &&/path/to/notify_success.sh || /path/to/notify_failed.sh

Tùy theo repository mà sửa nội dung phù hợp, là push notification ngon lành thôi.

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

Leave A Comment