Sự hỗn loạn của các Dependency phân tán
Tôi đã từng dành cả tối thứ Sáu để nhìn pipeline CI/CD thất bại liên tục chỉ vì thiếu một dependency duy nhất. Chúng tôi không làm gì phức tạp; chỉ đang cố gắng đẩy một bản hotfix. Thủ phạm là một thư viện nhỏ trên registry công khai bị tác giả đột ngột xóa—một kịch bản nổi tiếng được biết đến với tên gọi sự cố ‘left-pad’. Vì chúng tôi tải trực tiếp từ internet, toàn bộ quy trình làm việc đã bị hỏng. Chúng tôi không có bản sao lưu cục bộ và hoàn toàn không có quyền kiểm soát.
Đây không chỉ là một sự cố hy hữu. Phụ thuộc hoàn toàn vào các registry công khai là một canh bạc. Docker Hub hiện áp đặt giới hạn nghiêm ngặt 100 lượt pull mỗi sáu giờ cho người dùng ẩn danh. Hơn nữa, các package công khai có thể bị xâm nhập hoặc biến mất mà không báo trước. Một kho lưu trữ artifact tập trung đóng vai trò như một mạng lưới an toàn nội bộ, một bộ nhớ cache tốc độ cao và một kho lưu trữ bảo mật cho mã nguồn độc quyền của nhóm bạn.
Chính xác thì Sonatype Nexus là gì?
Sonatype Nexus Repository Manager (OSS) là một công cụ miễn phí để lưu trữ và tổ chức các artifact phần mềm. Hãy coi nó như một phiên bản App Store riêng tư của công ty bạn. Mặc dù hỗ trợ hàng chục định dạng, hầu hết các nhóm dựa vào nó để quản lý Docker image, file Java JAR và các package JavaScript.
Hiểu về Proxy, Hosted và Group Repository
Thành công với Nexus bắt đầu từ việc hiểu ba loại repository cốt lõi của nó. Logic này là thứ giúp hệ thống hoạt động hiệu quả:
- Proxy Repositories: Đóng vai trò như một bộ nhớ cache nội bộ. Khi một lập trình viên yêu cầu một package từ Maven Central, Nexus sẽ tải xuống một lần và lưu lại bản sao. Người tiếp theo cần package đó sẽ nhận trực tiếp từ mạng nội bộ với tốc độ gigabit.
- Hosted Repositories: Đây là nơi lưu trữ mã nguồn nội bộ của bạn. Khi bạn xây dựng một thư viện riêng tư không muốn chia sẻ với thế giới, bạn sẽ publish nó tại đây.
- Group Repositories: Tính năng này gộp nhiều repository thành một URL duy nhất. Các công cụ build của bạn chỉ cần trỏ tới một endpoint để tìm thấy cả package công khai và riêng tư.
Thiết lập Instance Nexus của bạn
Chạy Nexus dưới dạng Docker container là cách nhanh nhất để bắt đầu. Nó giúp môi trường host của bạn sạch sẽ và đơn giản hóa việc nâng cấp trong tương lai.
# Tạo volume để lưu trữ dữ liệu bền vững
docker volume create nexus-data
# Chạy container Nexus
docker run -d -p 8081:8081 --name nexus -v nexus-data:/nexus-data sonatype/nexus3:latest
Đợi khoảng 60 giây để dịch vụ khởi tạo, sau đó truy cập vào http://localhost:8081. Bạn sẽ cần mật khẩu admin khởi tạo để đăng nhập. Lấy mật khẩu bằng cách chạy lệnh sau:
docker exec nexus cat /nexus-data/admin.password
Nexus sẽ yêu cầu bạn đổi mật khẩu này ngay lập tức. Đối với các nhóm nội bộ, tôi khuyên bạn nên cho phép quyền truy cập đọc ẩn danh (anonymous read access). Điều này cho phép các runner CI/CD của bạn pull các dependency mà không cần quản lý thông tin đăng nhập phức tạp, trong khi bạn vẫn giữ quyền ghi được bảo vệ nghiêm ngặt.
Lưu trữ các Package Maven riêng tư
Các bản build Java thường bị chậm khi phải tải xuống hàng trăm file JAR nhỏ. Để sử dụng Nexus làm trung tâm Maven, trước tiên bạn phải cấu hình file settings.xml, thường nằm trong thư mục ~/.m2/.
Sau khi tạo repository Maven2 (hosted) trong giao diện quản lý, hãy thêm thông tin đăng nhập này vào cài đặt cục bộ của bạn:
<settings>
<servers>
<server>
<id>nexus-snapshots</id>
<username>admin</username>
<password>your-new-password</password>
</server>
<server>
<id>nexus-releases</id>
<username>admin</username>
<password>your-new-password</password>
</server>
</servers>
</settings>
Tiếp theo, cập nhật file pom.xml của dự án để trỏ lệnh mvn deploy về instance Nexus của bạn:
<distributionManagement>
<repository>
<id>nexus-releases</id>
<url>http://localhost:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus-snapshots</id>
<url>http://localhost:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
Tăng tốc cài đặt NPM
Các dự án web hiện đại thường có thư mục node_modules rất lớn. Bằng cách thiết lập NPM (proxy) trong Nexus, bạn có thể cắt giảm thời gian chạy npm install xuống 50% hoặc hơn cho cả nhóm. Để trỏ môi trường cục bộ của bạn tới Nexus, hãy chạy:
npm config set registry http://localhost:8081/repository/npm-all/
Nếu bạn cần chia sẻ một thư viện UI component riêng tư giữa các microservice, hãy sử dụng repository NPM (hosted). Bạn có thể đăng nhập qua CLI bằng thông tin Nexus của mình:
npm login --registry=http://localhost:8081/repository/npm-internal/
Chạy một Docker Registry riêng tư
Nexus là một bước ngoặt lớn cho người dùng Docker. Bằng cách tự host registry, bạn có thể bỏ qua giới hạn lượt pull của Docker Hub và giữ các image lớn hàng GB trong mạng nội bộ. Điều này giúp các thao tác docker pull diễn ra gần như tức thời.
Khi bạn tạo repository Docker (hosted), hãy gán cho nó một cổng duy nhất như 8082. Docker CLI yêu cầu một cổng riêng để giao tiếp với registry API một cách chính xác. Nếu bạn không sử dụng HTTPS trong môi trường lab, hãy khai báo để Docker tin tưởng registry nội bộ này:
# Thêm nội dung này vào /etc/docker/daemon.json
{
"insecure-registries" : ["localhost:8082"]
}
Giờ đây bạn có thể tag và push image của mình chỉ trong vài giây:
docker login localhost:8082
docker tag my-app:latest localhost:8082/my-app:v1.0
docker push localhost:8082/my-app:v1.0
Các mẹo bảo trì thiết yếu
Dung lượng lưu trữ sẽ đầy nhanh hơn bạn tưởng. Một nhóm 10 lập trình viên có thể dễ dàng tạo ra 50GB artifact trong một tháng thông qua các bản build tự động. Luôn thiết lập Cleanup Policies (Chính sách dọn dẹp). Ví dụ: cấu hình Nexus để xóa các Docker image hoặc Maven snapshot không được tải xuống trong vòng 30 ngày.
Đừng quên sao lưu thư mục /nexus-data. Thư mục này chứa mọi cài đặt cấu hình và mọi artifact bạn từng lưu trữ. Nếu container gặp sự cố và bạn mất dữ liệu này, toàn bộ pipeline build của bạn sẽ bị ngừng trệ cho đến khi bạn upload lại thủ công từng dependency.
Lời kết
Chuyển sang chiến lược quản lý artifact tập trung là một bước tiến lớn hướng tới một pipeline DevOps trưởng thành. Nó mang lại sự ổn định, cắt giảm chi phí băng thông và cho phép bạn kiểm soát tuyệt đối chuỗi cung ứng phần mềm của mình. Thiết lập Nexus mất chưa đầy một giờ, nhưng sự tin cậy mà nó mang lại cho các bản build sẽ giúp bạn tránh được vô số rắc rối trong những lần triển khai quan trọng sắp tới.

