0

Xây Dựng và Quản Lý GitHub Actions Hiệu Quả với GitHub Actions Controller

GitHub Actions là một công cụ CI/CD tích hợp sẵn trong GitHub, giúp tự động hóa các công việc như kiểm tra mã nguồn, xây dựng, triển khai ứng dụng và nhiều tác vụ khác. Với sự phát triển không ngừng của phần mềm và độ phức tạp ngày càng tăng của hệ thống, việc quản lý nhiều workflows trong GitHub trở thành một thách thức lớn đối với các nhóm phát triển. Khi đó, GitHub Actions Controller ra đời như một giải pháp để tối ưu hóa và điều khiển các workflows, giúp quá trình CI/CD trở nên mượt mà và hiệu quả hơn.

Trong bài viết này, chúng ta sẽ cùng tìm hiểu về GitHub Actions, sau đó khám phá GitHub Actions Controller và cách tự xây dựng một hệ thống điều khiển các workflows GitHub của riêng bạn.


GitHub Actions

GitHub Actions là công cụ tự động hóa tích hợp trong GitHub, cho phép bạn định nghĩa và thực hiện các workflows để xử lý các tác vụ liên quan đến phát triển phần mềm như:

  • Continuous Integration (CI): Tự động kiểm tra mã nguồn khi có sự thay đổi.
  • Continuous Deployment (CD): Tự động triển khai ứng dụng lên các môi trường.
  • Automated Testing: Chạy các bộ test để kiểm tra tính đúng đắn của mã nguồn.

Một workflow trong GitHub Actions được định nghĩa trong các file YAML nằm trong thư mục .github/workflows/. Các file này mô tả chi tiết các bước thực thi tự động như setup môi trường, chạy test, build, lint, deploy,.... Các workflows có thể được kích hoạt bởi các sự kiện như push, pull request, hoặc theo lịch trình định kỳ.

Lợi ích

  • Tích hợp trực tiếp vào GitHub: Không cần cài đặt thêm công cụ bên ngoài.
  • Mở rộng và tùy chỉnh linh hoạt: GitHub Actions cung cấp một hệ sinh thái phong phú với hàng ngàn actions có sẵn, giúp bạn dễ dàng mở rộng quy trình CI/CD theo nhu cầu.
  • Đa nền tảng: Hỗ trợ nhiều hệ điều hành như Ubuntu, macOS và Windows.

GitHub Actions Controller

GitHub Actions Controller là gì?

GitHub Actions Controller không phải là một công cụ chính thức của GitHub, mà là một cách tiếp cận để quản lý và điều khiển các workflows trong GitHub một cách có hệ thống.

GitHub Actions Controller có thể được xây dựng như một công cụ tùy chỉnh kết hợp giữa Kubernetes, GitHub API, và các công cụ lập trình như Node.js hoặc Python.

Ưu điểm

  • Tự động hóa các quy trình phức tạp: Giúp điều phối các workflows từ nhiều repository, tạo các quy trình tự động phức tạp và liên kết các workflows lại với nhau.
  • Tăng tính linh hoạt: Cho phép kiểm soát và điều chỉnh các workflows từ bên ngoài GitHub, dễ dàng tích hợp với các hệ thống và công cụ khác.
  • Quản lý workflows từ nhiều repository: Dễ dàng quản lý các workflows trong nhiều repository một cách tập trung và có tổ chức.
  • Tăng tính bảo mật: Tự kiểm soát được môi trường chạy workflows, cho phép tùy biến chính sách bảo mật riêng.

Nhược điểm

  • Độ phức tạp cao: Việc xây dựng và duy trì một GitHub Actions Controller có thể làm tăng độ phức tạp của hệ thống CI/CD, đặc biệt khi có nhiều workflows và repository cần điều phối.
  • Yêu cầu kiến thức chuyên sâu: Cần hiểu rõ về GitHub API, các kỹ thuật lập trình công cụ điều phối, cũng như kiến thức vững về Kubernetes để triển khai và duy trì hệ thống.

Xây Dựng GitHub Actions Controller Trên Kubernetes

Bước 1: Tạo GitHub OAuth Token

Để GitHub Actions Controller có thể tương tác với GitHub API, bạn cần tạo một Personal Access Token từ GitHub. Token này cho phép truy cập và kích hoạt các workflows.

  • Truy cập vào Settings → Developer Settings → Personal Access Tokens → Generate New Token
  • Cấp quyền repo, workflow, admin:repo_hook

💡 Lưu ý: Không nên hardcode token vào mã nguồn. Hãy sử dụng biến môi trường hoặc secret trong Kubernetes để bảo mật.


Bước 2: Chuẩn Bị Docker Container Cho Controller

Mình sẽ tạo một ứng dụng nhỏ bằng Node.js để gọi GitHub API:

Dockerfile

FROM node:16

WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install

COPY . .

EXPOSE 8080
CMD ["node", "index.js"]
{
  "name": "github-actions-controller",
  "version": "1.0.0",
  "description": "A simple controller for GitHub Actions",
  "main": "index.js",
  "dependencies": {
    "axios": "^0.21.1",
    "express": "^4.17.1"
  }
}
const express = require('express');
const axios = require('axios');
const app = express();
const port = 8080;

const GITHUB_TOKEN = process.env.GITHUB_TOKEN;
const REPO = 'your-username/your-repo';
const WORKFLOW_FILE = 'ci.yml';

app.get('/trigger-workflow', async (req, res) => {
  try {
    await axios.post(
      `https://api.github.com/repos/${REPO}/actions/workflows/${WORKFLOW_FILE}/dispatches`,
      { ref: 'main' },
      {
        headers: {
          Authorization: `Bearer ${GITHUB_TOKEN}`,
          Accept: 'application/vnd.github.v3+json'
        }
      }
    );
    res.status(200).send('Workflow triggered successfully!');
  } catch (error) {
    res.status(500).send('Error triggering workflow');
  }
});

app.listen(port, () => {
  console.log(`GitHub Actions Controller is listening at http://localhost:${port}`);
});

Bước 3: Triển Khai Container Lên Kubernetes

Sau khi đã chuẩn bị xong Docker Image cho GitHub Actions Controller, bước tiếp theo là triển khai nó lên Kubernetes để chạy liên tục và có thể được gọi từ bên ngoài.

// tạo image từ Dockerfile
docker build -t github-actions-controller .

// Đẩy image này lên Docker Hub hoặc một Container Registry khác để Kubernetes có thể tải về khi deploy.
docker tag github-actions-controller your-username/github-actions-controller
docker push your-username/github-actions-controller

tạo secret với token GitHub

kubectl create secret generic github-token-secret --from-literal=token=YOUR_GITHUB_TOKEN

Tạo Deployment Trong Kubernetes**

apiVersion: apps/v1
kind: Deployment
metadata:
  name: github-actions-controller
spec:
  replicas: 1
  selector:
    matchLabels:
      app: github-actions-controller
  template:
    metadata:
      labels:
        app: github-actions-controller
    spec:
      containers:
        - name: github-actions-controller
          image: your-username/github-actions-controller
          ports:
            - containerPort: 8080
          env:
            - name: GITHUB_TOKEN
              valueFrom:
                secretKeyRef:
                  name: github-token-secret
                  key: token
  • replicas: 1: chỉ chạy 1 bản của pod này.
  • image: chính là Docker image bạn đã push ở bước trước.
  • containerPort: 8080: cổng mà ứng dụng Node.js của bạn đang lắng nghe.
  • env: khai báo biến môi trường GITHUB_TOKEN từ Kubernetes Secret để bảo mật token.


Tạo Service Để Expose Controller Ra Bên Ngoài

apiVersion: v1
kind: Service
metadata:
  name: github-actions-controller-service
spec:
  selector:
    app: github-actions-controller
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: LoadBalancer
  • selector: chọn pod có label app: github-actions-controller.
  • port: port bên ngoài service lắng nghe (port 80).
  • targetPort: cổng thực tế bên trong container (8080).
  • type: LoadBalancer: nếu cluster bạn chạy có hỗ trợ LoadBalancer (như trên cloud), nó sẽ cấp một IP public.


Deploy Lên Kubernetes

kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

Sau khi apply, controller sẽ được chạy trên Kubernetes. Bạn có thể truy cập controller qua địa chỉ IP public (nếu dùng cloud) hoặc thông qua port-forward khi dùng local cluster như minikube hoặc kind.

Ví dụ port-forward:

kubectl port-forward service/github-actions-controller-service 8080:80

// hoặc test
http://localhost:8080/trigger-workflow

Tổng Kết

Việc xây dựng một GitHub Actions Controller sử dụng Kubernetes không chỉ giúp bạn tự động hóa và điều khiển các workflows trong GitHub mà còn cung cấp một giải pháp mở rộng, quản lý linh hoạt và bảo mật tốt hơn cho hệ thống CI/CD.

Nhờ kết hợp giữa GitHub API và Kubernetes, bạn có thể kiểm soát quy trình CI/CD từ xa, điều phối nhiều workflows trên nhiều repository, đồng thời dễ dàng mở rộng hệ thống theo nhu cầu.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí