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
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.
Ở đâ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.
Ở 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.
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
figonking
Xin chào, mình là kỹ sư công nghệ thông tin đang làm việc tại Tokyo, Nhật Bản. Đam mê lập trình web và mobile, mình mong muốn hoàn thiện bản thân để trở thành lập trình viên fullstack thực thụ. Mình yêu thích tối ưu tốc độ ứng dụng cũng như cải thiện quy trình làm việc để phát triển sản phẩm chất lượng và nhanh chóng. Sự động viên của bạn bằng các hình thức "like", "share", "comment" sẽ giúp cho mình có động lực để viết nhiều bài tốt hơn!
Trang web có sử dụng cookie để nâng cao trải nghiệm người dùng. Vui lòng Đồng ý với quy định này để tiếp tục sử dụng website. Xem thêm
Privacy & Cookies Policy
Privacy Overview
This website uses cookies to improve your experience while you navigate through the website. Out of these, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may affect your browsing experience.
Necessary cookies are absolutely essential for the website to function properly. This category only includes cookies that ensures basic functionalities and security features of the website. These cookies do not store any personal information.
Any cookies that may not be particularly necessary for the website to function and is used specifically to collect user personal data via analytics, ads, other embedded contents are termed as non-necessary cookies. It is mandatory to procure user consent prior to running these cookies on your website.
Mỗi bài viết mình mất 2~4giờ, bạn chỉ mất 5 phút để đọc :D