Thứ sáu, 31/08/2018 | 00:00 GMT+7

Cách sử dụng Node.js và Github Webhooks để đồng bộ hóa các dự án từ xa

Khi làm việc trong một dự án với nhiều nhà phát triển, có thể khó chịu khi một người đẩy đến một repository và sau đó người khác bắt đầu áp dụng các thay đổi trên một version mã lỗi thời. Những sai lầm như thế này gây tốn kém thời gian, điều này khiến bạn nên cài đặt một tập lệnh để giữ cho repository của bạn được đồng bộ. Bạn cũng có thể áp dụng phương pháp này trong môi trường production để đẩy nhanh các bản sửa lỗi và các thay đổi khác.

Trong khi các giải pháp khác tồn tại để hoàn thành nhiệm vụ cụ thể này, viết tập lệnh của bạn là một lựa chọn linh hoạt để lại chỗ cho các tùy chỉnh trong tương lai.

GitHub cho phép bạn cấu hình các webhook cho các repository của bạn , là các sự kiện gửi yêu cầu HTTP khi sự kiện xảy ra. Ví dụ: bạn có thể sử dụng webhook để thông báo cho bạn khi ai đó tạo yêu cầu kéo hoặc đẩy mã mới.

Trong hướng dẫn này, bạn sẽ phát triển một server Node.js lắng nghe thông báo webhook GitHub khi nào bạn hoặc người khác đẩy mã vào GitHub. Tập lệnh này sẽ tự động cập nhật repository trên server từ xa với version mã mới nhất, loại bỏ nhu cầu đăng nhập vào server để thực hiện các commit mới.

Yêu cầu

Để hoàn thành hướng dẫn này, bạn cần :

  • Một server Ubuntu 16.04 được cài đặt theo hướng dẫn cài đặt server ban đầu Ubuntu 16.04 , bao gồm user không phải root có quyền sudo và firewall .
  • Git được cài đặt trên máy local của bạn. Bạn có thể làm theo hướng dẫn Đóng góp vào Nguồn mở: Bắt đầu với Git để cài đặt và cài đặt Git trên máy tính của bạn .
  • Node.js và npm được cài đặt trên server từ xa bằng PPA chính thức, như được giải thích trong Cách cài đặt Node.js trên Ubuntu 16.04 . Cài đặt version ổn định phân phối là đủ vì nó cung cấp cho ta version được đề xuất mà không cần bất kỳ cấu hình bổ sung nào.
  • Kho lưu trữ trên Github chứa mã dự án của bạn. Nếu bạn không có dự án nào trong đầu, vui lòng chia nhỏ ví dụ này mà ta sẽ sử dụng trong phần còn lại của hướng dẫn.

Bước 1 - Cài đặt Webhook

Ta sẽ bắt đầu bằng cách cấu hình webhook cho repository của bạn. Bước này rất quan trọng vì nếu không có nó, Github không biết sẽ gửi những sự kiện gì khi có sự việc xảy ra hoặc gửi chúng ở đâu. Trước tiên, ta sẽ tạo webhook, sau đó tạo server sẽ phản hồi các yêu cầu của nó.

Đăng nhập vào account GitHub của bạn và chuyển đến repository bạn muốn theo dõi. Nhấp vào tab Cài đặt ở thanh menu trên cùng trên trang của repository của bạn, sau đó nhấp vào Webhooks trong menu chuyển bên trái. Nhấp vào Thêm Webhook ở góc bên phải và nhập password account của bạn nếu được yêu cầu . Bạn sẽ thấy một trang giống như sau:

Trang Webhooks

  • Trong trường URL tải trọng , hãy nhập http:// your_server_ip :8080 . Đây là địa chỉ và cổng của server Node.js mà ta sẽ viết ngay sau đây.
  • Thay đổi loại Nội dung thành application/json . Tập lệnh ta sẽ viết sẽ sử dụng dữ liệu JSON và sẽ không thể hiểu các kiểu dữ liệu khác.
  • Đối với Bí mật , hãy nhập password bí mật cho webhook này.Bạn sẽ sử dụng bí mật này trong server Node.js của bạn để xác thực các yêu cầu và đảm bảo chúng đến từ GitHub.
  • Đối với sự kiện nào bạn muốn kích hoạt webhook này , chỉ chọn sự kiện đẩy . Ta chỉ cần sự kiện đẩy vì đó là khi mã được cập nhật và cần được đồng bộ hóa với server của ta .
  • Chọn hộp kiểm Hoạt động .
  • Xem lại các trường và nhấp vào Thêm webhook để tạo nó.

Lúc đầu, ping sẽ không thành công, nhưng hãy yên tâm rằng webhook của bạn hiện đã được cấu hình . Bây giờ hãy lấy repository được nhân bản vào server .

Bước 2 - Sao chép Kho lưu trữ vào Server

Tập lệnh của ta có thể cập nhật repository , nhưng nó không thể xử lý việc cài đặt repository ban đầu, vì vậy ta sẽ thực hiện điều đó ngay bây giờ. Đăng nhập vào server của bạn:

  • ssh sammy@your_server_ip

Đảm bảo bạn đang ở trong folder chính của bạn . Sau đó, sử dụng Git để sao chép repository của bạn. Đảm bảo thay sammy bằng tên user GitHub và hello_hapi bằng tên dự án Github của bạn.

  • cd
  • git clone https://github.com/sammy/hello_hapi.git

Thao tác này sẽ tạo một folder mới chứa dự án của bạn. Bạn sẽ sử dụng folder này trong bước tiếp theo.

Với dự án của bạn được nhân bản, bạn có thể tạo tập lệnh webhook.

Bước 3 - Tạo tập lệnh Webhook

Hãy tạo server của ta để lắng nghe các yêu cầu webhook đó từ GitHub. Ta sẽ viết một tập lệnh Node.js để chạy một web server trên cổng 8080 . Server sẽ lắng nghe các yêu cầu từ webhook, xác minh bí mật mà ta đã chỉ định và lấy version mã mới nhất từ GitHub.

Điều hướng đến folder chính của bạn:

  • cd ~

Tạo một folder mới cho tập lệnh webhook của bạn có tên là NodeWebhooks :

  • mkdir ~/NodeWebhooks

Sau đó chuyển đến folder mới:

  • cd ~/NodeWebhooks

Tạo một file mới có tên là webhook.js bên trong folder NodeWebhooks .

  • nano webhook.js

Thêm hai dòng sau vào script:

webhook.js
var secret = "your_secret_here"; var repo = "/home/sammy/hello_hapi"; 

Dòng đầu tiên xác định một biến để giữ bí mật bạn đã tạo ở Bước 1, xác minh các yêu cầu đến từ GitHub. Dòng thứ hai xác định một biến chứa đường dẫn đầy đủ đến repository mà bạn muốn cập nhật trên đĩa local của bạn . Điều này sẽ trỏ đến repository bạn đã kiểm tra ở Bước 2.

Tiếp theo, thêm các dòng này nhập các ký tự crypto http và tiền điện tử vào tập lệnh. Ta sẽ sử dụng những thứ này để tạo web server của bạn và băm bí mật để ta có thể so sánh nó với những gì ta nhận được từ GitHub:

webhook.js
let http = require('http'); let crypto = require('crypto'); 

Tiếp theo, bao gồm thư viện child_process để bạn có thể thực thi các lệnh shell từ tập lệnh của bạn :

webhook.js
const exec = require('child_process').exec; 

Tiếp theo, thêm mã này để xác định một web server mới xử lý các yêu cầu GitHub webhook và kéo version mã mới xuống nếu đó là một yêu cầu xác thực:

webhook.js
http.createServer(function (req, res) {     req.on('data', function(chunk) {         let sig = "sha1=" + crypto.createHmac('sha1', secret).update(chunk.toString()).digest('hex');          if (req.headers['x-hub-signature'] == sig) {             exec('cd ' + repo + ' && git pull');         }     });      res.end(); }).listen(8080); 

Hàm http.createServer() khởi động web server trên cổng 8080 , server này sẽ lắng nghe các yêu cầu đến từ Github. Vì mục đích bảo mật, ta xác thực rằng bí mật có trong yêu cầu trùng với bí mật mà ta đã chỉ định khi tạo webhook ở Bước 1. Bí mật được chuyển vào tiêu đề x-hub-signature dưới dạng chuỗi băm SHA1, vì vậy ta băm bí mật của bạn và so sánh nó với những gì GitHub gửi cho ta .

Nếu yêu cầu là xác thực, ta thực hiện lệnh shell để cập nhật repository local của ta bằng cách sử dụng git pull .

Tập lệnh đã hoàn thành trông như thế này:

webhook.js
const secret = "your_secret_here"; const repo = "~/your_repo_path_here/";  const http = require('http'); const crypto = require('crypto'); const exec = require('child_process').exec;  http.createServer(function (req, res) {     req.on('data', function(chunk) {         let sig = "sha1=" + crypto.createHmac('sha1', secret).update(chunk.toString()).digest('hex');          if (req.headers['x-hub-signature'] == sig) {             exec('cd ' + repo + ' && git pull');         }     });      res.end(); }).listen(8080); 

Nếu bạn đã làm theo hướng dẫn cài đặt server ban đầu, bạn cần cho phép web server này giao tiếp với web bên ngoài bằng cách cho phép lưu lượng truy cập trên cổng 8080 :

  • sudo ufw allow 8080/tcp

Bây giờ tập lệnh của ta đã có, hãy đảm bảo nó đang hoạt động bình thường.

Bước 4 - Kiểm tra Webhook

Ta có thể kiểm tra webhook của bạn bằng cách sử dụng node để chạy nó trong dòng lệnh. Bắt đầu tập lệnh và để quá trình mở trong terminal của bạn:

  • cd ~/NodeWebhooks
  • nodejs webhook.js

Quay lại trang dự án của bạn trên Github.com . Nhấp vào tab Cài đặt ở thanh menu trên cùng trên trang của repository của bạn, sau đó nhấp vào Webhooks trong menu chuyển bên trái. Nhấp vào Chỉnh sửa bên cạnh webhook bạn đã cài đặt ở Bước 1. Cuộn xuống cho đến khi bạn thấy phần Giao hàng gần đây , như trong hình ảnh sau:

Chỉnh sửa Webhook

Nhấn vào ba dấu chấm ở ngoài cùng bên phải để hiển thị nút Phân phối lại . Với server nút đang chạy, hãy nhấp vào Phân phối lại để gửi lại yêu cầu. Sau khi xác nhận bạn muốn gửi yêu cầu, bạn sẽ thấy phản hồi thành công. Điều này được biểu thị bằng mã phản hồi 200 OK sau khi gửi lại ping.

Bây giờ ta có thể chuyển sang việc đảm bảo tập lệnh của ta chạy ở chế độ nền và bắt đầu khi server khởi động . Sử dụng CTRL+C dừng web server hook nút.

Bước 5 - Cài đặt Webhook làm dịch vụ Systemd

systemd là trình quản lý tác vụ mà Ubuntu sử dụng để kiểm soát các dịch vụ. Ta sẽ cài đặt một dịch vụ cho phép ta bắt đầu tập lệnh webhook của bạn khi khởi động và sử dụng các lệnh systemd để quản lý nó giống như ta làm với bất kỳ dịch vụ nào khác.

Bắt đầu bằng cách tạo file dịch vụ mới:

  • sudo nano /etc/systemd/system/webhook.service

Thêm cấu hình sau vào file dịch vụ cho systemd biết cách chạy tập lệnh. Điều này cho Systemd biết nơi tìm tập lệnh nút của ta và mô tả dịch vụ của ta .

Đảm bảo thay thế sammy bằng tên user của bạn.

/etc/systemd/system/webhook.service
[Unit] Description=Github webhook After=network.target  [Service] Environment=NODE_PORT=8080 Type=simple User=sammy ExecStart=/usr/bin/nodejs /home/sammy/NodeWebhooks/webhook.js Restart=on-failure  [Install] WantedBy=multi-user.target 

Bật dịch vụ mới để nó bắt đầu khi hệ thống khởi động:

  • sudo systemctl enable webhook.service

Bây giờ bắt đầu dịch vụ:

  • sudo systemctl start webhook

Đảm bảo dịch vụ được bắt đầu:

  • sudo systemctl status webhook

Bạn sẽ thấy kết quả sau cho biết rằng dịch vụ đang hoạt động:

Output
● webhook.service - Github webhook Loaded: loaded (/etc/systemd/system/webhook.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2018-08-17 19:28:41 UTC; 6s ago Main PID: 9912 (nodejs) Tasks: 6 Memory: 7.6M CPU: 95ms CGroup: /system.slice/webhook.service └─9912 /usr/bin/nodejs /home/sammy/NodeWebhooks/webhook.js

Đến đây bạn có thể đẩy các commit mới vào repository của bạn và xem các thay đổi trên server của bạn.

Từ máy tính để bàn của bạn, sao chép repository :

  • git clone https://github.com/sammy/hello_hapi.git

Thực hiện thay đổi đối với một trong các file trong repository lưu trữ. Sau đó commit file và đẩy mã của bạn lên GitHub.

  • git add index.js
  • git commit -m "Update index file"
  • git push origin master

Webhook sẽ kích hoạt và các thay đổi sẽ xuất hiện trên server của bạn.

Kết luận

Bạn đã cài đặt một tập lệnh Node.js sẽ tự động triển khai các commit mới cho một repository từ xa. Bạn có thể sử dụng quy trình này để cài đặt các repository bổ sung mà bạn muốn theo dõi. Bạn thậm chí có thể cấu hình nó để triển khai một trang web hoặc ứng dụng vào production khi bạn đẩy repository của bạn .


Tags:

Các tin liên quan