Build lifecycle và quality gates
Quality gate tốt ghép nhiều tín hiệu độc lập, giữ build reproducible và bảo vệ risk cụ thể; nó không biến một metric thành mục tiêu để game.
1. Maven lifecycle
Luồng phổ biến là validate → compile → test → package → integration-test → verify → install → deploy. Surefire thường chạy unit test ở phase test; Failsafe chạy integration test và xác nhận ở verify để post-integration cleanup vẫn có cơ hội chạy.
Pin plugin version và gọi cùng lifecycle ở local/CI. Một build reproducible cần dependency/plugin version rõ, input/output được khai báo và không phụ thuộc state ngoài workspace.
2. Gradle task graph
Java plugin cung cấp task test; dự án có thể tạo source set/task integrationTest với dependency ordering rõ. Up-to-date check, build cache và parallel forks chỉ đáng tin khi input/output được khai báo và test không rò global state.
3. Coverage và mutation testing
JaCoCo đo instruction/branch đã thực thi, không đo assertion có đủ mạnh hay không. Dùng coverage để tìm vùng mù theo risk, không dùng một threshold đơn lẻ làm bằng chứng chất lượng.
PIT thay đổi bytecode; mutant sống gợi ý assertion thiếu, code không quan sát được hoặc equivalent mutant. Mutation testing phù hợp hơn với domain logic quan trọng so với generated/glue code.
- Line coverage cho biết code đã chạy.
- Branch coverage hữu ích cho decision logic nhưng vẫn có thể bị game.
- Mutation score kiểm tra test có phát hiện thay đổi logic hay không.
- Threshold phải có lý do và gắn với risk, không ép test vô nghĩa.
4. Static và supply-chain checks
| Gate | Câu hỏi nó trả lời | Caveat |
|---|---|---|
| Compiler/warnings | Code có compile và vi phạm type/safety signal không? | Không chứng minh runtime behavior. |
| Formatting/static analysis | Code có pattern lỗi, bug smell hoặc style drift không? | Rule noise cần owner và suppression có lý do. |
| Dependency vulnerability/license | Supply chain có risk đã biết hoặc license không phù hợp không? | Lock cũ vẫn có thể chứa vulnerability mới. |
| Secret scan | Credential có bị commit hoặc log ra không? | Cần rotate ngay khi phát hiện, không chỉ fail build. |
Dùng BOM/platform alignment và dependency locking để tăng reproducibility. Review dependency mới theo maintenance, license, vulnerability, footprint và necessity.
5. Thiết kế gate theo feedback flow
- Fail nhanh ở compile, unit và static checks.
- Chạy integration theo nhóm cô lập, có thể song song.
- Lưu XML/HTML report, logs và container output khi fail.
- Baseline legacy rồi ratchet chất lượng của code mới.
- Đo duration và false-positive cost của từng gate.
6. Checklist tự đánh giá
- Tôi mô tả được phase Maven và task graph Gradle cho unit/integration test.
- Tôi phân biệt coverage với mutation score.
- Tôi biết quality gate cần nhiều tín hiệu độc lập.
- Tôi review dependency version, vulnerability, license và lock file.
- Tôi lưu được artifact/log khi pipeline fail.
- Tôi có thể giải thích vì sao một threshold đẹp không đồng nghĩa quality tốt.