VANHIEP.NET - Làm web giá rẻ - Thiết Kế Website - Thiết Kế Ứng Dụng Mobile

Hướng dẫn CI/CD Tự động clone code từ github về server khi có code mới

Có 2 cách để làm điều này với NodeJS

1. Kiểm tra định kỳ với Node.js

Bạn có thể sử dụng setInterval hoặc một thư viện như node-schedule để kiểm tra repository theo thời gian định kỳ.

const simpleGit = require('simple-git');
const path = require('path');

const repoPath = path.resolve(__dirname, 'your-clone-folder'); // Đường dẫn đến thư mục đã clone repo
const repoURL = 'https://github.com/username/repository-name.git'; // URL repo

const git = simpleGit(repoPath);

async function updateRepo() {
    try {
        console.log('Kiểm tra cập nhật...');
        await git.fetch(); // Tải thông tin cập nhật từ remote
        const status = await git.status();

        if (status.behind > 0) {
            console.log('Có thay đổi mới. Đang pull về...');
            await git.pull(); // Kéo code mới về
            console.log('Cập nhật thành công!');
        } else {
            console.log('Không có thay đổi mới.');
        }
    } catch (error) {
        console.error('Lỗi khi kiểm tra/cập nhật repository:', error);
    }
}

// Chạy định kỳ mỗi phút (60 giây)
setInterval(updateRepo, 60 * 1000);

2. Sử dụng GitHub Webhook

Đây là cách tốt nhất để tự động cập nhật code mỗi khi có thay đổi trên repository. Khi có push mới lên GitHub, webhook sẽ gửi thông báo đến server của bạn, và server sẽ kích hoạt việc cập nhật.

Cách làm:

  1. Tạo webhook trên GitHub:

    • Vào repository của bạn trên GitHub.
    • Đi tới Settings > Webhooks > Add webhook.
    • Nhập URL server của bạn (ví dụ: http://your-server-address/webhook) vào trường Payload URL.
    • Chọn Content typeapplication/json.
    • Chọn sự kiện Push events.
  2. Viết server Node.js để nhận webhook: Cài đặt expressbody-parser:

npm install express body-parser simple-git

Mã nguồn Node.js:

const express = require('express');
const bodyParser = require('body-parser');
const simpleGit = require('simple-git');
const path = require('path');

const app = express();
const PORT = 3000;

const repoPath = path.resolve(__dirname, 'your-clone-folder'); // Đường dẫn đến repo
const git = simpleGit(repoPath);

app.use(bodyParser.json());

// Endpoint nhận webhook
app.post('/webhook', async (req, res) => {
    console.log('Webhook received:', req.body);

    // Kiểm tra nếu có push event
    if (req.body.ref === 'refs/heads/main') { // Kiểm tra branch 'main'
        try {
            console.log('Pulling code...');
            await git.pull();
            console.log('Cập nhật code thành công!');
        } catch (error) {
            console.error('Lỗi khi pull code:', error);
        }
    }

    res.status(200).send('Webhook received');
});

app.listen(PORT, () => {
    console.log(`Server đang chạy tại http://localhost:${PORT}`);
});

 

Cách hoạt động:

  • Mỗi khi có push vào branch, webhook sẽ gửi thông báo đến server của bạn, server sẽ xử lý và cập nhật code thông qua git pull.