Giới thiệu
Khi tôi lần đầu đọc tweet nổi tiếng từ Joanna Maciejewska:
Tôi muốn AI làm công việc giặt giũ và rửa chén để tôi có thể tập trung vào nghệ thuật và viết lách, chứ không phải để AI làm nghệ thuật và viết lách cho tôi.
Tôi hoàn toàn đồng ý. Tôi yêu thích việc viết mã và không muốn AI thay thế những gì tôi đam mê. Tuy nhiên, tôi muốn AI thực hiện những công việc nhàm chán trong cuộc sống hàng ngày của lập trình viên. Nếu bạn biết tôi, bạn sẽ biết rằng tôi thích giữ số lượng cuộc họp ở mức tối thiểu, và không thích dành quá nhiều thời gian cho việc phân loại, lập kế hoạch và đánh giá. Vì vậy, khi tôi nghe về công cụ tự động hóa n8n, tôi ngay lập tức nghĩ đến việc xem nó có thể xử lý việc phân loại GitHub issue bằng cách sử dụng AI để làm phần suy nghĩ này hay không.
Tóm tắt: Có, nó có thể và rất dễ thiết lập. 😎
n8n là gì?
n8n là một công cụ tự động hóa workflow mã nguồn mở cho phép bạn kết nối các API và dịch vụ mà không cần tốn hàng giờ để tự làm lại. Nó có các nút tích hợp sẵn cho các dịch vụ như GitHub, Slack, Jira, Google Drive, Notion và nhiều hơn nữa, nhưng bạn cũng có thể sử dụng các yêu cầu HTTP thô hoặc hàm tùy chỉnh khi cần kiểm soát hoặc điều gì đó tùy chỉnh. Điều này giúp bạn tự động hóa mọi thứ nhanh chóng, tránh lãng phí thời gian viết mã.
Ngoài ra, n8n còn đi kèm với giao diện kéo thả trực quan, giúp toàn bộ quá trình dễ dàng và trực quan hơn. Bạn có thể thiết kế workflow một cách trực quan, kết nối các nút bằng cách kéo thả, và thấy rõ cách mà toàn bộ workflow trông như thế nào.
Kế hoạch
Trước tiên, chúng ta sẽ lập kế hoạch tổng thể và sau đó sẽ mở rộng thêm vào từng bước khi chúng ta đi tới đó.
- Thiết lập n8n trên máy cục bộ.
- Tạo một kho GitHub và chuẩn bị một số issue.
- Tạo logic workflow:
- Lấy tất cả các GitHub issue cần phân loại.
- Gửi yêu cầu đến AI cho mỗi issue với hướng dẫn chi tiết về cách thực hiện việc phân loại và dữ liệu cần trích xuất (nhãn và tóm tắt).
- Cập nhật mỗi GitHub issue với nhãn và tóm tắt được trả về bởi AI.
Thiết lập n8n
Việc bắt đầu là rất đơn giản với tài liệu chính thức về cách bắt đầu. Bạn có thể sử dụng n8n Cloud (họ cung cấp một gói miễn phí) hoặc chạy phiên bản tự lưu trữ. Nếu bạn chỉ muốn thử nghiệm, tôi khuyên bạn nên chọn tùy chọn tự lưu trữ: tải hình ảnh Docker và chạy nó cục bộ. Sau này, nếu bạn quyết định triển khai một cách nghiêm túc hơn, tài liệu cũng đề cập đến các thiết lập Docker Compose và Kubernetes.
Thiết lập kho GitHub
Đầu tiên, chúng ta cần tạo một kho GitHub và một số issue để có thể thử nghiệm ý tưởng. Tôi đã tạo một kho demo với 6 issue. Ý tưởng của tôi là khi issue được tạo ra, nó sẽ nhận nhãn needs-triage (phần này được xử lý bởi workflow GitHub và là một phần của kho), để tự động hóa chỉ nhắm vào những vấn đề đó và chúng ta không phân loại cùng một issue nhiều lần.
Vì tôi đang cố gắng xác minh ý tưởng của mình, tôi đã giữ mô tả issue ở mức tối thiểu và chắc chắn rằng chúng đa dạng.
Sau khi phân loại tự động, tôi muốn sắp xếp các issue và gán cho mỗi issue một loại, mức độ ưu tiên và nhãn độ phức tạp.
- loại:
bug,enhancement,question,documentationhoặctech-debt - ưu tiên:
priority: high,priority: mediumhoặcpriority: low - độ phức tạp:
good-first-issue,regular, hoặccomplex
Luồng tự động hóa sẽ là:
- Lấy tất cả các GitHub issue có nhãn needs-triage.
- Để AI phân tích chúng và gán nhãn, tạo tóm tắt ngắn cho từng issue.
- Cập nhật nhãn trên GitHub.
Bạn sẽ cần tạo một GitHub Personal Access Token với quyền truy cập repo (token cần có khả năng đọc và cập nhật issue) và một token API cho nút AI - tôi sẽ sử dụng OpenAI.
Vậy hãy cùng bắt đầu xây dựng!
Kích hoạt Workflow
Có một nút Schedule Trigger cho phép chúng ta lên lịch thực hiện hàng ngày, hàng tuần, v.v. Tôi cũng quyết định sử dụng nút kích hoạt Khi nhấp vào 'Thực hiện workflow' để có thể dễ dàng thử nghiệm luồng này.
Lấy Issues từ GitHub
Bước tiếp theo là lấy các issue từ GitHub với nhãn needs-triage. May mắn thay, n8n đã tích hợp sẵn GitHub, vì vậy chỉ cần tìm kiếm GitHub và sau đó chọn Lấy các issue của một kho. Cấu hình nút của tôi trông như thế này:
Và chúng ta chỉ cần kết nối nút này với các trình kích hoạt.
Triển khai Logic Phân loại
Nút GitHub trả về tất cả các issue, vì vậy bây giờ chúng ta cần cấu hình workflow để nó:
- lặp qua các mục
- cho mỗi mục, nó sử dụng AI để thực hiện việc phân loại
- cập nhật nhãn trên GitHub
Vậy hãy thêm nút Loop over Items và đặt kích thước lô là 1 (bởi vì chúng ta sẽ xử lý từng mục một). Và sau nút lặp, chúng ta kết nối nút Open AI Message a model. Chọn API key của bạn và mô hình mà bạn muốn sử dụng (tôi đã sử dụng mô hình GPT-5).
Phần quan trọng nhất là yêu cầu (prompt). Đây là yêu cầu tôi đã sử dụng - ở cuối bạn có thể thấy tôi đã truyền vào title và body của issue mà chúng tôi đang lặp qua.
json
Bạn là một trợ lý phân loại GitHub.
Dựa trên tiêu đề và nội dung của một issue mới, hãy trả về một đối tượng JSON với các khóa sau:
{
"type": "bug | enhancement | question | documentation | tech-debt",
"priority": "priority: high | priority: medium | priority: low",
"complexity": "good-first-issue | regular | complex",
"summary": "<tóm tắt ngắn gọn của issue dưới 50 từ>"
}
Quy tắc:
1. Phân loại loại:
- "bug" = chức năng bị hỏng.
- "enhancement" = yêu cầu hoặc cải tiến tính năng.
- "question" = câu hỏi hoặc làm rõ từ người dùng.
- "documentation" = vấn đề liên quan đến tài liệu.
- "tech-debt" = tái cấu trúc, dọn dẹp nội bộ, công việc bảo trì.
2. Phân loại độ ưu tiên:
- Cao = khẩn cấp hoặc quan trọng.
- Trung bình = quan trọng nhưng không khẩn cấp.
- Thấp = nhỏ, tầm thường hoặc thẩm mỹ.
3. Phân loại độ phức tạp:
- "good-first-issue" = đơn giản, rõ ràng, dễ cho người đóng góp mới (ví dụ: thay đổi kiểu dáng, sửa lỗi nhỏ). Độ ưu tiên không cao.
- "regular" = vấn đề tiêu chuẩn đòi hỏi một số kinh nghiệm hoặc hiểu biết về mã nguồn.
- "complex" = vấn đề khó, có thể liên quan đến nhiều thành phần, kiến thức nâng cao hoặc thay đổi có rủi ro cao.
4. Tóm tắt nên ngắn gọn (<50 từ).
5. Chỉ trả về JSON hợp lệ, không có văn bản thêm.
Ví dụ đầu vào:
Tiêu đề: "Sửa lỗi chính tả trong README"
Nội dung: "Có một lỗi chính tả nhỏ trong hướng dẫn cài đặt."
Ví dụ đầu ra:
{
"type": "documentation",
"priority": "priority: low",
"complexity": "good-first-issue",
"summary": "Sửa lỗi chính tả trong hướng dẫn cài đặt README."
}
Bây giờ hãy phân loại issue này:
Tiêu đề: {{$json["title"]}}
Nội dung: {{$json["body"]}}
💡 Mẹo: Đừng ngần ngại sử dụng công cụ AI để giúp bạn tạo yêu cầu.
Vậy là luồng của chúng ta giờ đây trông như thế này:
Bây giờ chúng ta chuyển sang phần kỹ thuật hơn. Nút AI chỉ trả về nhãn và tóm tắt cho mỗi issue, nhưng để có thể chỉnh sửa issue, chúng ta cũng cần số của issue đó. May mắn thay, n8n có một nút Merge cho phép chúng ta hợp nhất dữ liệu từ nhiều nút. Khi thêm nút hợp nhất, chúng ta có thể chọn cách mà chúng ta muốn hợp nhất xảy ra. Vì nguồn dữ liệu của chúng ta không có các trường chung, chúng ta sẽ sử dụng chế độ append và 2 đầu vào. Và chúng ta kết nối nút AI và nút lặp của chúng ta như là đầu vào.
Bây giờ chúng ta đã hợp nhất thành công dữ liệu từ GitHub và dữ liệu từ AI và sẵn sàng cho bước tiếp theo.
Tiếp theo, chúng ta cần truy cập dữ liệu từ cả hai nguồn và chúng ta sẽ làm điều này bằng cách sử dụng nút Code. Đây là một nút rất mạnh mẽ vì chúng ta có thể viết bất kỳ logic tùy chỉnh nào mà chúng ta muốn. Để minh họa, chúng ta sẽ giữ nó đơn giản và chỉ cần trích xuất và trả về dữ liệu cuối cùng mà chúng ta cần bằng cách thêm đoạn mã JavaScript đơn giản này:
javascript
const data = $input.all();
const aiResponse = data[0].json.message.content;
const loopItemData = data[1].json;
return [{
json: {
issueNumber: loopItemData.number,
type: aiResponse.type || "",
priority: aiResponse.priority || "",
complexity: aiResponse.complexity || "",
summary: aiResponse.summary || ""
}
}];
Và bước cuối cùng sẽ là thêm nút GitHub, nhưng lần này sẽ là nút Chỉnh sửa một issue. Chúng ta có thể cấu hình nút này để sử dụng số issue và nhãn mà chúng ta đã trả về từ nút trước đó để cập nhật mục.
Luồng cuối cùng trông như thế này:
Bây giờ chúng ta chỉ cần kích hoạt luồng và kiểm tra kết quả trên GitHub. Nó thực sự đã làm rất tốt và phân loại theo cách mà tôi sẽ làm. Tất nhiên, trong thực tế và với quá nhiều issue, chúng ta có thể cần điều chỉnh yêu cầu, nhưng tôi khá tự tin rằng điều này sẽ hoạt động rất tốt trong môi trường sản xuất.
Kết luận
Tôi phải nói rằng, tôi rất ấn tượng với những gì n8n có thể làm. Hầu hết các công việc nặng nề đã được tích hợp sẵn với các công cụ như GitHub, Slack, Jira, Google Drive, Notion và nhiều hơn nữa, giúp tự động hóa nhanh chóng và đơn giản. Đối với bất kỳ điều gì mà các nút tích hợp sẵn không bao phủ, khối Code cho phép bạn viết logic tùy chỉnh, gọi API trực tiếp hoặc xử lý dữ liệu theo cách bạn cần.
Giao diện để xây dựng workflow rất dễ sử dụng, vì vậy việc tạo mẫu giải pháp rất nhanh chóng và dễ dàng. Và nếu bạn không muốn bắt đầu từ đầu, n8n cung cấp các mẫu workflow đã được xây dựng sẵn có thể đơn giản tùy chỉnh theo nhu cầu của bạn. Bạn thậm chí có thể xây dựng các nút tùy chỉnh của riêng mình để mở rộng chức năng của n8n vượt ra ngoài những gì có sẵn ngay từ đầu.
Một số ý tưởng về những gì có thể tự động hóa:
- Thông báo trên Slack/Discord khi một PR được tạo hoặc gộp.
- Thông báo đánh giá PR.
- Lấy dữ liệu từ nhiều nguồn và tạo báo cáo.
- Kéo RSS feed và tạo một bản tin.
- Tiến hành onboarding nhân viên mới - tự động tạo tài khoản và thậm chí gán nhiệm vụ JIRA hoặc GitHub đầu tiên dựa trên nhãn/ưu tiên.
Cuối cùng, không có giới hạn nào ngoài trí tưởng tượng của bạn.