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

0 0 0

Người đăng: Nguyen Trung Giang

Theo Viblo Asia

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.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Cấu hình CI/CD với Github (phần 2): Trigger một work flow

Events trigger. Bạn có thể cấu hình cho workflows chạy khi có một sự kiện nào đó xảy ra trên GitHub, theo một lịch có sẵn hoặc cũng có thể là một sự kiện nào đó xảy ra ngoài GitHub.

0 0 97

- vừa được xem lúc

Khi Github Actions và CircleCI song kiếm hợp bích thì đỉnh không gì bằng [Phần 2]

Cách thức thực hiện. Có thể nói ưu điểm của Github Actions chính là số lượng trigger nhiều. Việc khởi động CircleCI sẽ gọi API của CircleCI từ phía Github Actions và kích hoạt trigger. Cho nên, ở setting của repository, hãy cài OFF cho Webhook.

0 0 58

- vừa được xem lúc

Khi Github Actions và CircleCI song kiếm hợp bích thì đỉnh không gì bằng [Phần 1]

(Sau đây xin được dịch lại bài báo nọ, ngôi xưng là "Chế"). .

0 0 53

- vừa được xem lúc

Cấu hình CI/CD với Github (phần 4): Các mẫu job cơ bản

Sau đây là một số mẫu Github action cơ bản mà các bạn có thể sử dụng để tạo một flow hoàn chỉnh, phụ thuộc vào yêu cầu của từng dự án khác nhau. .

0 1 137

- vừa được xem lúc

Cách tạo một trang blog cá nhân miễn phí dành cho dev

Vào một ngày đẹp trời, bỗng dưng mình nảy ra ý định làm một trang blog cá nhân thay vì viết Blog trên các nền tảng có sẵn. .

0 0 48

- vừa được xem lúc

Cài đặt đơn giản automating publishing Flutter app lên Google Play bằng Github Actions

Introduction. Mỗi developer hay gặp phải các công việc lặp đi lặp lại gây ra sự nhàm chán.

0 0 61