Nguyên tắc: việc rẻ và hay hỏng đặt trước, việc đắt đặt sau. Một bố cục thường dùng:
- Stage 1 (song song): lint, typecheck, unit test — chỉ cần source code, không phụ thuộc nhau.
- Stage 2: build → sinh ra một artifact duy nhất (image hoặc bundle).
- Stage 3 (song song): integration test, e2e, security scan — cùng lấy artifact của stage 2.
- Stage 4 (tuần tự): deploy staging → smoke test → deploy production.
yaml
jobs:
lint:
runs-on: ubuntu-latest
test:
runs-on: ubuntu-latest
build:
needs: [lint, test]
deploy:
needs: [build]Chỉ đặt ràng buộc tuần tự khi có phụ thuộc dữ liệu (job sau cần output job trước) hoặc phụ thuộc tài nguyên (hai job deploy cùng một môi trường). Ràng buộc thừa chỉ kéo dài thời gian chờ thực tế.
Thêm concurrency theo branch để hủy run cũ khi có commit mới — không tốn runner cho commit đã lỗi thời.