ADR 0001Chấp nhận
ADR 0001. Binary tĩnh, không dùng CGO
- Trạng thái: Đã chấp nhận
- Ngày: 2026-09-30
Bối cảnh
Agent chạy trên nhiều bản phân phối Linux (glibc cũ như CentOS 7, glibc mới, musl) và Windows. Phụ thuộc thư viện hệ thống làm phức tạp việc đóng gói và gây lỗi khó tái hiện trên hàng nghìn máy.
Quyết định
Biên dịch với CGO_ENABLED=0, -trimpath, liên kết tĩnh. Một binary cho mỗi cặp hệ điều hành và kiến trúc. Không dùng thư viện cần CGO (ví dụ một số binding systemd, libvirt). Với systemd dùng D-Bus thuần Go hoặc gọi systemctl khi cần.
Hệ quả
- Chạy trên CentOS 7 (glibc 2.17), Alpine, kernel từ 3.10 mà không cần thư viện.
- Gói đơn giản, không khai báo phụ thuộc.
- Không thể dùng resolver
cgocủa Go: dùng resolver thuần Go, chấp nhận khác biệt nhỏ (ví dụnsswitchphức tạp). Ghi vào tài liệu vận hành. - Không dùng SQLite CGO cho WAL, tự viết WAL đơn giản (xem ADR 0002).
- CI kiểm tra binary không có CGO và kích thước không vượt 20 MB.
Phương án đã cân nhắc
| Phương án | Lý do không chọn |
|---|---|
| CGO với glibc | Vướng phiên bản glibc, phải dựng theo từng bản phân phối |
| Python hoặc script | Cần runtime trên máy, tài nguyên khó kiểm soát, khó ký và bảo vệ |
| Rust | Tốt, nhưng đội đã chọn Go để dùng chung kỹ năng với nhóm Collector và sinh mã giao thức từ cùng tệp .proto |