- Đây là một cấu hình CI đơn giản tự động hóa kiểm thử, build và di chuyển tệp bằng cách thêm hook
post-receivevào kho Git bare trên máy chủ cá nhân - So với CI hiện có với cấu hình YAML phức tạp, chạy chậm và khó tự host, trường hợp này không cần đến mức cô lập bản dựng hoàn toàn hay quản lý bí mật
- Nếu chạy tác vụ trực tiếp trong hook thì khi thất bại, push có thể bị từ chối hoặc bị chậm hoàn tất, nên dùng hàng đợi tác vụ tối giản
nqđể xử lý nền - Hook chỉ gọi
nq, còn log được kiểm tra bằngssh server nqtail -a, giúp vận hành nhanh và đơn giản - Khi cần, có thể cô lập build bằng landdown·Podman, quản lý bí mật bằng sops, hoặc mở rộng cách phát triển bằng bản vá Git qua email,
git-shell,git http-backend
Cấu hình post-receive hook và nq
- Trên máy chủ cá nhân, tạo kho bằng
ssh server git init --bare reporồi sao chép bằnggit clone server:repo - Đặt một
post-receivehook dưới dạng script shell trong thư mục hooks của kho bare để khởi chạy CI mỗi khi push - Nếu chạy tác vụ trực tiếp trong hook, sẽ phát sinh hai vấn đề
- Nếu script thất bại, push sẽ bị từ chối
- Nếu script chạy chậm, việc hoàn tất push cũng sẽ bị trì hoãn theo
- Trong hook, gọi hàng đợi tác vụ tối giản
nqđể thêm tác vụ vào hàng đợi nền- Có thể xem log bằng
ssh server nqtail -a - Quy trình thiết lập có thể xem trong hướng dẫn ngắn
- Có thể xem log bằng
Cô lập và mở rộng phương thức phát triển
- Nếu muốn chạy build trong sandbox, có thể dùng landdown
- Có thể dùng Podman để cô lập build khỏi môi trường host hoặc dùng sops để quản lý bí mật
- Với kiểu phát triển bazaar, cấu hình nhận bản vá Git qua email là phù hợp
- Với kiểu phát triển cathedral, có thể cấu hình bằng
git-shellhoặcgit http-backend
1 bình luận
Ý kiến trên Lobste.rs
CI có ít nhất hai vấn đề
Vấn đề dễ là chạy
make testkhi mã thay đổi, còn vấn đề khó là chạymake testtrên cả Linux, Windows và MacTôi luôn không hài lòng vì trải nghiệm lập trình viên và tính năng gỡ lỗi của các bộ máy hiện có thường bị xem nhẹ, nên đang tự xây một hệ thống CI tại https://ci.pico.sh . Tôi cũng ghét DSL, còn YAML nối tầng thì có cảm giác như từ từ hút cạn sinh lực
Tôi từng xây thứ này trên gitolite và chuyển sang Temporal để điều khiển quy trình build mà không bị giới hạn
Có thể từ chối push khi thực thi thất bại, nhưng thường thì tôi để hook cho qua rồi xử lý lỗi riêng; cấu hình cũng đơn giản và khá thú vị
Một CI tối giản khác cũng xoay quanh việc chạy shell script là laminar CI, và nó còn có giao diện web
Từ lâu trong một môi trường doanh nghiệp chỉ dùng Windows, chúng tôi từng đặt một chiếc Mac mini làm máy chủ CI cục bộ cho cả nhóm để build ứng dụng iOS; đó cũng là một trong những cách dùng Git mà tôi thử từ sớm
Tôi tìm thấy nó tại https://mccd.space/git/ , có vẻ đang dùng một bản fork của stagit
Cho tới vài tháng trước tôi còn vận hành Forgejo và Woodpecker, nhưng hầu hết tính năng đều không cần thiết nên đã gỡ hết và đang tìm một cấu hình nhẹ hơn tương tự như thế này. Việc tiếp theo của tôi cũng là CI, nên bài này đến rất đúng lúc; tôi cũng đang cân nhắc có nên mirror một thư viện nhỏ sắp công bố lên SourceHut hay không
Kho được công khai chỉ đọc trên web bằng git-daemon, và tôi đã ghi lại toàn bộ cách thiết lập tại đây
Đây là lần đầu tôi biết tới
nqqua bài này, nhưng có lẽ tôi sẽ dùngsystemd-runTôi dùng Nix cho gần như mọi runner, nên nếu xuất kết quả
nix flake checkthành metric và log OTLP thì có lẽ có thể giải quyết yêu cầu CI bằng chính hệ thống giám sátTôi thích kiểu tự host một nền tảng phát triển đơn giản như thế này
Có thể dễ dàng cấu hình bubblewrap, một hệ thống container nhẹ và đơn giản, để dùng cho CI. Tuy vậy, nếu dùng
nqthì có vẻ không thể từ chối push khi CI thất bại; tôi tò mò không biết xử lý việc đó thế nàoNếu cần cô lập hơn nữa thì có thể thêm Podman, Docker hoặc bubblewrap. Tôi không từ chối push khi CI thất bại cũng vì cùng lý do tôi không đặt pre-commit hook chạy test: đôi khi bạn vẫn cần commit hoặc push những thứ đang hỏng, và việc push có thể trở nên rất chậm. Nếu cần từ chối, chỉ việc chạy CI đồng bộ không qua
nqrồi chặn push khi mã thoát khác 0Hoặc có thể chạy bằng
nqcho các nhánh không phải main, còn riêng nhánh main thì chạy đồng bộCó vẻ liên kết
landdownđang bị lỗi