Tự động Deploy Website lên Server với GitHub Webhook: Hướng dẫn chi tiết

Chắc hẳn bạn đã từng trải qua cảm giác mệt mỏi khi phải thủ công deploy website mỗi khi có thay đổi code. Giờ đây, với Github Webhook Deploy Lên Server, quy trình này sẽ trở nên tự động hoàn toàn. Bài viết này sẽ cung cấp một hướng dẫn chi tiết, dễ hiểu, giúp bạn tiết kiệm thời gian và công sức, đồng thời giảm thiểu sai sót trong quá trình triển khai.

GitHub Webhook là gì và tại sao bạn nên sử dụng?

GitHub Webhook là một tính năng cho phép bạn thiết lập các thông báo tự động mỗi khi có sự kiện xảy ra trên repository của bạn. Ví dụ, khi có ai đó push code lên repository, GitHub sẽ gửi một HTTP POST request đến một URL do bạn chỉ định. URL này thường là một script trên server của bạn, script này sẽ tự động thực hiện các thao tác cần thiết, chẳng hạn như pull code mới nhất, build project và restart server.

Sử dụng GitHub Webhook mang lại nhiều lợi ích:

  • Tiết kiệm thời gian: Tự động hóa quá trình deploy giúp bạn không cần phải thực hiện thủ công các bước lặp đi lặp lại.
  • Giảm thiểu sai sót: Loại bỏ các thao tác thủ công làm giảm nguy cơ xảy ra lỗi do con người.
  • Triển khai nhanh chóng: Code mới được triển khai ngay lập tức khi có thay đổi, giúp website luôn cập nhật.
  • Cải thiện hiệu suất làm việc: Cho phép bạn tập trung vào việc phát triển code thay vì lo lắng về việc deploy.

“Việc sử dụng GitHub Webhook đã giúp team của tôi tiết kiệm được rất nhiều thời gian và công sức. Trước đây, chúng tôi mất hàng giờ mỗi tuần cho việc deploy thủ công, giờ đây mọi thứ diễn ra hoàn toàn tự động,” anh Nguyễn Văn Tùng, một kỹ sư DevOps có kinh nghiệm, chia sẻ.

Các sự kiện có thể kích hoạt Webhook

Webhook có thể được kích hoạt bởi nhiều sự kiện khác nhau trên GitHub, bao gồm:

  • Push: Khi code mới được push lên repository.
  • Pull Request: Khi một pull request được tạo, cập nhật hoặc merge.
  • Issues: Khi một issue được tạo, cập nhật hoặc đóng.
  • Releases: Khi một release được tạo.
  • … và nhiều sự kiện khác.

Trong bài viết này, chúng ta sẽ tập trung vào việc sử dụng Webhook để tự động deploy khi có sự kiện push lên repository.

Chuẩn bị môi trường

Trước khi bắt đầu, bạn cần đảm bảo đã chuẩn bị đầy đủ các điều kiện sau:

  • Một server: Có thể là VPS, dedicated server hoặc cloud server. Server này sẽ dùng để host website của bạn.
  • GitHub repository: Repository chứa code của website.
  • SSH access: Quyền truy cập SSH vào server.
  • Git: Đã cài đặt Git trên server.
  • Web server (ví dụ: Nginx, Apache): Đã cài đặt và cấu hình web server trên server.
  • Quyền sudo: Tài khoản người dùng trên server có quyền sudo.

“Việc chuẩn bị kỹ lưỡng môi trường là bước quan trọng để đảm bảo quá trình deploy diễn ra suôn sẻ. Hãy chắc chắn rằng bạn đã kiểm tra kỹ các yêu cầu cần thiết trước khi bắt đầu,” chị Trần Thị Lan Anh, một chuyên gia về hệ thống, nhấn mạnh.

Cấu trúc thư mục

Để dễ dàng quản lý, bạn nên tạo một cấu trúc thư mục rõ ràng trên server. Ví dụ:

/var/www/
├── your-website/         # Thư mục gốc của website
│   ├── .git/           # Thư mục Git (sau khi clone)
│   ├── public/          # Thư mục chứa các file public
│   ├── ...             # Các file và thư mục khác
└── webhook.php          # Script xử lý Webhook

Tạo Script xử lý Webhook (webhook.php)

Đây là trái tim của hệ thống tự động deploy. Script này sẽ nhận request từ GitHub, kiểm tra tính hợp lệ và thực hiện các thao tác cần thiết để deploy code mới.

<?php

$secret = 'YOUR_SECRET_KEY'; // Thay thế bằng secret key của bạn
$repo_path = '/var/www/your-website'; // Thay thế bằng đường dẫn đến repository của bạn

// Lấy nội dung JSON từ request
$payload = file_get_contents('php://input');

// Kiểm tra chữ ký
$signature = $_SERVER['HTTP_X_HUB_SIGNATURE_256'];
if (!$signature) {
    http_response_code(403);
    echo "Signature not found";
    exit;
}

list($algo, $hash) = explode('=', $signature, 2);
$payload_hash = hash_hmac($algo, $payload, $secret);

if ($hash !== $payload_hash) {
    http_response_code(403);
    echo "Invalid signature";
    exit;
}

// Thực hiện các thao tác deploy
$output = shell_exec("cd $repo_path && git pull 2>&1 && echo 'Deployment completed successfully'");

// Ghi log (tùy chọn)
file_put_contents('webhook.log', date('Y-m-d H:i:s') . " " . $output . "n", FILE_APPEND);

echo $output;

http_response_code(200);
?>

Giải thích code:

  1. $secret: Đây là secret key bạn sẽ sử dụng để xác minh request từ GitHub. Hãy thay thế 'YOUR_SECRET_KEY' bằng một chuỗi bí mật, khó đoán.
  2. $repo_path: Đường dẫn đến thư mục chứa repository của bạn trên server. Thay thế '/var/www/your-website' bằng đường dẫn thực tế.
  3. file_get_contents('php://input'): Lấy nội dung JSON từ request POST do GitHub gửi.
  4. Kiểm tra chữ ký: Đoạn code này kiểm tra xem request có thực sự đến từ GitHub hay không bằng cách sử dụng secret key.
  5. shell_exec(...): Thực thi các lệnh shell để pull code mới từ GitHub. Bạn có thể mở rộng script này để thực hiện các thao tác khác như build project, chạy migration, clear cache, v.v.
  6. Ghi log: (Tùy chọn) Ghi lại kết quả của quá trình deploy vào file webhook.log.
  7. http_response_code(200): Trả về mã trạng thái 200 OK để thông báo cho GitHub biết rằng request đã được xử lý thành công.

Lưu ý quan trọng:

  • Bảo mật: Secret key là rất quan trọng để bảo vệ hệ thống của bạn khỏi các request giả mạo. Hãy giữ bí mật và không chia sẻ nó với bất kỳ ai.
  • Quyền truy cập: Đảm bảo rằng user chạy web server (ví dụ: www-data, nginx) có quyền đọc và ghi vào thư mục chứa repository của bạn. Bạn có thể sử dụng lệnh chown để thay đổi quyền sở hữu của thư mục.
  • Lỗi: Xử lý lỗi cẩn thận trong script của bạn. Ghi log lỗi để dễ dàng theo dõi và khắc phục sự cố.

git hook post-receive là gì cũng là một lựa chọn khác để tự động hoá việc deploy, nhưng webhook đơn giản và dễ cấu hình hơn trong nhiều trường hợp.

Cấu hình Web Server

Bạn cần cấu hình web server để có thể truy cập script webhook.php qua URL. Ví dụ, nếu bạn sử dụng Nginx, bạn có thể thêm một block server như sau:

server {
    listen 80;
    server_name your-domain.com; # Thay thế bằng domain của bạn

    root /var/www/your-website;

    index index.php index.html index.htm;

    location /webhook {
        try_files $uri $uri/ /webhook.php?$args;
    }

    location ~ .php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.4-fpm.sock; # Thay đổi nếu bạn dùng phiên bản PHP khác
    }
}

Sau khi cấu hình xong, hãy restart web server để các thay đổi có hiệu lực.

Cấu hình Webhook trên GitHub

  1. Truy cập repository của bạn trên GitHub.
  2. Chọn “Settings” > “Webhooks” > “Add webhook”.
  3. Nhập URL của script webhook.php vào ô “Payload URL”. Ví dụ: http://your-domain.com/webhook.
  4. Chọn “application/json” làm “Content type”.
  5. Nhập secret key vào ô “Secret”. Đây phải là secret key bạn đã sử dụng trong script webhook.php.
  6. Chọn “Just the push event” để chỉ nhận thông báo khi có push code lên repository. Bạn có thể chọn các sự kiện khác nếu muốn.
  7. Đảm bảo ô “Active” được chọn.
  8. Nhấn “Add webhook” để lưu cấu hình.

“Cấu hình Webhook trên GitHub là bước cuối cùng nhưng không kém phần quan trọng. Hãy đảm bảo rằng bạn đã nhập đúng URL và secret key để hệ thống hoạt động chính xác,” anh Lê Hoàng Nam, một chuyên gia bảo mật, lưu ý.

Kiểm tra hoạt động

Để kiểm tra xem Webhook đã hoạt động hay chưa, bạn có thể thực hiện một push nhỏ lên repository của bạn. Sau đó, kiểm tra file log webhook.log trên server để xem kết quả. Nếu mọi thứ hoạt động bình thường, bạn sẽ thấy thông báo “Deployment completed successfully” trong file log.

Nếu gặp lỗi, hãy kiểm tra kỹ các bước cấu hình và script webhook.php để tìm ra nguyên nhân.

Mở rộng và tùy biến

Script webhook.php chỉ là một ví dụ cơ bản. Bạn có thể mở rộng và tùy biến nó để phù hợp với nhu cầu cụ thể của bạn. Ví dụ:

  • Build project: Nếu project của bạn cần được build (ví dụ: sử dụng npm, yarn, composer), bạn có thể thêm các lệnh build vào script.
  • Chạy migration: Nếu bạn sử dụng database, bạn có thể thêm các lệnh chạy migration vào script.
  • Clear cache: Bạn có thể thêm các lệnh clear cache để đảm bảo website luôn hiển thị phiên bản mới nhất.
  • Thông báo: Bạn có thể thêm các lệnh gửi thông báo đến Slack, Telegram hoặc email để thông báo về kết quả deploy.

Việc quản lý nhiều site bằng git có thể được thực hiện dễ dàng hơn với việc tự động hoá deploy bằng webhook.

Sử dụng các công cụ hỗ trợ

Ngoài việc viết script webhook.php từ đầu, bạn cũng có thể sử dụng các công cụ hỗ trợ để đơn giản hóa quá trình cấu hình Webhook. Một số công cụ phổ biến bao gồm:

  • Deployer: Một công cụ deploy PHP miễn phí và mã nguồn mở.
  • Envoyer: Một dịch vụ deploy PHP trả phí.
  • Jenkins: Một hệ thống tự động hóa mã nguồn mở.

Các công cụ này cung cấp giao diện người dùng thân thiện và nhiều tính năng hữu ích, giúp bạn dễ dàng cấu hình và quản lý quá trình deploy.

Các vấn đề thường gặp và cách khắc phục

  • Webhook không hoạt động: Kiểm tra lại URL, secret key và các sự kiện đã chọn trong cấu hình Webhook trên GitHub. Kiểm tra log trên server để xem có lỗi nào không.
  • Lỗi quyền truy cập: Đảm bảo rằng user chạy web server có quyền đọc và ghi vào thư mục chứa repository của bạn.
  • Lỗi script: Kiểm tra cú pháp và logic của script webhook.php. Sử dụng các công cụ debug để tìm ra lỗi.
  • Lỗi web server: Kiểm tra cấu hình web server và restart nếu cần.

Bảo mật

Bảo mật là một yếu tố quan trọng cần được xem xét khi sử dụng GitHub Webhook. Dưới đây là một số biện pháp bảo mật bạn nên áp dụng:

  • Sử dụng secret key mạnh: Secret key nên là một chuỗi ngẫu nhiên, khó đoán và đủ dài.
  • Xác minh chữ ký: Luôn xác minh chữ ký của request để đảm bảo rằng nó thực sự đến từ GitHub.
  • Hạn chế quyền truy cập: Chỉ cấp quyền truy cập cần thiết cho user chạy web server.
  • Sử dụng HTTPS: Sử dụng HTTPS cho URL của script webhook.php để bảo vệ dữ liệu truyền tải.
  • Giám sát log: Theo dõi log thường xuyên để phát hiện các hoạt động bất thường.

Việc cài đặt ssh key cho git server cũng là một biện pháp bảo mật quan trọng, đặc biệt khi bạn git clone qua ssh trên linux.

Kết luận

Sử dụng GitHub Webhook deploy lên server là một cách tuyệt vời để tự động hóa quá trình deploy website của bạn. Nó giúp bạn tiết kiệm thời gian, giảm thiểu sai sót và cải thiện hiệu suất làm việc. Bằng cách làm theo hướng dẫn chi tiết trong bài viết này, bạn có thể dễ dàng thiết lập một hệ thống tự động deploy cho website của mình. Hãy thử áp dụng ngay hôm nay và trải nghiệm sự khác biệt!

FAQ

1. GitHub Webhook có miễn phí không?

Có, GitHub Webhook là một tính năng miễn phí của GitHub.

2. Tôi có thể sử dụng GitHub Webhook với bất kỳ ngôn ngữ lập trình nào không?

Có, bạn có thể sử dụng GitHub Webhook với bất kỳ ngôn ngữ lập trình nào. Script xử lý Webhook có thể được viết bằng bất kỳ ngôn ngữ nào mà server của bạn hỗ trợ.

3. Làm thế nào để debug script webhook.php?

Bạn có thể sử dụng các công cụ debug như Xdebug hoặc đơn giản là thêm các lệnh echo vào script để in ra các giá trị biến. Kiểm tra file log webhook.log cũng là một cách hữu ích để tìm ra lỗi.

4. Tôi có thể sử dụng GitHub Webhook để deploy lên nhiều server không?

Có, bạn có thể cấu hình nhiều Webhook cho cùng một repository, mỗi Webhook trỏ đến một server khác nhau.

5. Làm thế nào để bảo vệ secret key?

Bạn nên lưu trữ secret key trong một biến môi trường thay vì hardcode nó trong script. Bạn cũng nên hạn chế quyền truy cập vào file chứa secret key.

6. Tôi có cần kiến thức lập trình nâng cao để sử dụng GitHub Webhook?

Không, kiến thức lập trình cơ bản là đủ để bạn có thể thiết lập và sử dụng GitHub Webhook. Bạn có thể tìm thấy nhiều ví dụ và hướng dẫn trên internet để giúp bạn bắt đầu.

7. GitHub Webhook có thể thay thế hoàn toàn quy trình CI/CD không?

Không hẳn. GitHub Webhook là một công cụ hữu ích để tự động hóa quá trình deploy, nhưng nó không thể thay thế hoàn toàn quy trình CI/CD. CI/CD (Continuous Integration/Continuous Deployment) là một quy trình phức tạp hơn, bao gồm nhiều giai đoạn như build, test, và deploy. GitHub Webhook thường được sử dụng như một phần của quy trình CI/CD. Nếu bạn cần một quy trình CI/CD đầy đủ, bạn nên sử dụng các công cụ như Jenkins, GitLab CI, hoặc CircleCI.

Hy vọng bài viết này đã cung cấp cho bạn những thông tin hữu ích về GitHub Webhook và cách sử dụng nó để tự động deploy website của bạn. Chúc bạn thành công! Đừng quên rằng, nếu bạn muốn tự host git server trên linux, việc hiểu và sử dụng webhook cũng rất quan trọng để tự động hóa quy trình làm việc.