Dành cho ai
Bạn viết một công cụ dòng lệnh bằng Go và có người muốn cài nó. Tài liệu của GoReleaser tốt và miễn phí, và dựng được một .goreleaser.yaml chạy ổn mất một buổi chiều. Phần còn lại mới tốn thời gian: một lệnh version in ra đúng commit thật, một install.sh mà bạn không ngại khi người ta pipe nó từ curl, chuyện checksum, CI tự release khi có tag, một formula Homebrew không dính hash rỗng.
Bộ kit này là một bộ khung repo: bạn copy vào rồi đổi tên. Mọi thứ trong đó đã chạy trong container sạch, và kết quả được kèm theo để bạn thấy "chạy ổn" nghĩa là gì.
Trong bộ này có gì
.goreleaser.yamlcho Linux, macOS và Windows trên amd64 và arm64. Build tĩnh,-trimpath, version, commit và ngày commit được nhúng vào binary, có file checksum, và changelog gom nhóm theo tiền tố Conventional Commit.install.sh, một script cài biết kiểm tra, có tùy chọn ghim phiên bản và tùy chọn kiểm tra chữ ký GPG.- Một công cụ kiểm tra build lặp lại ra kết quả y hệt, build hai lần trong hai môi trường sạch riêng rồi so kết quả.
- Một script tăng version đọc commit của bạn và chọn tag kế tiếp.
- Trình sinh Homebrew và Scoop tạo formula và manifest từ checksum thật của bạn.
- Template CI cho GitHub Actions và GitLab: lint, test với race detector, release khi có tag.
- Một CLI mẫu chỉ dùng thư viện chuẩn, có test, kèm hướng dẫn từng bước cho lần release đầu tiên và một checklist.
Script cài đặt từ chối những gì
Script cài đặt tải một binary về rồi chạy nó, nên đó là chỗ đáng khắt khe. Trong test, install.sh dừng lại, không cài gì và để nguyên bản đang cài trong các trường hợp sau:
- archive không khớp SHA-256 (chúng tôi cố tình sửa một file để thử),
- file checksum không có dòng nào cho archive, hoặc có hai dòng,
- file checksum bị thiếu, hoặc release không tồn tại,
- URL là http thường,
- chuỗi version sai định dạng hoặc rỗng,
- nền tảng không nằm trong số bạn đã build. Việc nhận diện kiến trúc được test bằng một
unamegiả, gồm armv7, i686, riscv64, FreeBSD và shell trên Windows.
Khi đã cấu hình khóa GPG, khóa sai, file checksum bị sửa, thiếu chữ ký và thiếu file khóa đều bị từ chối, nên chữ ký bảo vệ chính file checksum.
Build lặp lại ra kết quả y hệt, có kiểm tra
repro-check.sh clone repo hai lần vào hai thư mục khác nhau, với môi trường trống và cache Go mới, cách nhau hai giây, rồi so binary, archive và file checksum. Với dự án mẫu, 13 trên 13 file giống hệt nhau. Hai lỗi cố tình gây ra, nhúng thời gian build vào ldflags và bỏ -trimpath, mỗi lỗi đều làm mọi file khác nhau. Vậy là phép kiểm tra báo lỗi đúng lúc cần báo.
Các con số
Cờ linker -s -w giảm kích thước archive khoảng một nửa trên ví dụ này: archive Linux amd64 là 770,338 byte khi dùng chúng và 1,531,872 khi không. Thời gian build phụ thuộc nhiều vào tình trạng cache, nên README ghi chúng cùng với cách đo.
Đã test thế nào
183 phép kiểm tự động trong một container Linux sạch với GoReleaser v2.20.0, cộng một lượt build và test bản mẫu trên Go 1.22. Chúng gồm: một snapshot release tạo ra sáu archive, chạy binary Linux vừa tạo rồi so đầu ra của --version, đối chiếu file checksum với các archive, một bản build có tag để thử changelog, khoảng 25 trường hợp cho script tăng version trên các repo git tạm, và actionlint cho các workflow GitHub.
Yêu cầu
Go, git và GoReleaser OSS. Thêm Docker nếu bạn muốn chạy test harness.
Câu hỏi hay gặp
Sao không dùng thẳng tài liệu của GoReleaser?
Dùng cũng được. Tài liệu đó nói về GoReleaser. Bộ kit này lo phần xung quanh và kiểm tra các mảnh ghép chạy được cùng nhau.
Có hỗ trợ GitLab không?
Có. Bộ này có template GitLab CI, kèm ghi chú về cách cấu hình token.
Tôi dùng module path và tên của riêng mình được không?
Được. Hướng dẫn release đầu tiên liệt kê mọi chỗ cần đổi tên.
Giấy phép
Dùng trong dự án của bạn. File LICENSE của bộ khung là của bạn, cứ thay. Xin đừng bán lại bộ kit.
Lịch sử thay đổi
- 0.1.0: bản đầu tiên.
Bài liên quan
- Verify a downloaded binary: checksums, GPG, minisign, cosign (tiếng Anh)
- Reproducible Go builds: build twice, compare the hashes (tiếng Anh)
- A GoReleaser v2 config for a small Go CLI, line by line (tiếng Anh)
- What a curl | sh installer for a Go binary should refuse (tiếng Anh)
Mua sản phẩm này
Polar lo thanh toán, thuế và hóa đơn (họ là merchant of record). Thanh toán xong bạn nhận link tải ngay.