NPM private registry với AWS CodeArtifact

Bài đăng này sẽ trình bày cách tạo, tải lên và nhúng các package nodejs bằng AWS CodeArtifact, nó cho phép bạn chia sẻ mã trong tổ chức hoặc trong nhóm của mình mà không để lộ thông tin các package của bạn ra ngoài với chi phí gần như bằng không.

Bạn sẽ tạo một package chứa một chức năng để bạn có thể sử dụng ở các dự án khác của bạn. Ngoài ra bạn sẽ phải có một dự án nodejs khác để dùng package bạn vừa tạo. Bạn cũng học sẽ học được cách cấu trúc package của mình để tự động đăng nhập vào CodeArifact khi bạn muốn tải lên hoặc build package.

Tổng quan về AWS CodeArtifact

Sơ đồ sau minh hoạ về AWS CodeArtifact.

Các công việc cần thực hiện trước khi bắt đầu làm

  • Tạo tài khoản AWS
  • Cài đặt AWS Command Line Interface (AWS CLI). Code Artifact được hỗ trợ trong các phiên bản CLI này:
  • Tạo repository Code Artifact
  • Thêm các quyền IAM bắt buộc cho CodeArtifact

Tạo private npm package

Bạn có thể tạo gói npm của mình theo ba bước đơn giản là: thiết lập dự án, tạo script trong package.json để đăng nhập vào aws sử dụng CodeArtifact và xuất bản gói.

Khởi tạo project nodejs

Tạo một thư mục cho package npm mới của bạn. Mình thường đặt tên thư mục này là my-package bởi vì nó đóng vai trò là tên của package.Và Chúng ta nên sử dụng npm scope cho package, tại đây @myorg đại diện cho phạm vi mà tất cả các package của team/tổ trức được xuất bản. Điều này giúp chúng ta phân biệt package privatevà các packpage public cũng như các package của các team khác nhau. Hãy xem đoạn code sau: npm init --scope=@myorg -y
{
  "name": "@myorg/my-package",
  "version": "1.0.0",
  "description": "A sample private scoped npm package",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  }
}
Tệp package.json được chỉ định gọi vào file index.js. Tiếp theo, chúng ta tạo tệp đó và thêm chức năng của chúng ta vào nó:
module.exports.helloWorld = function() {
    console.log('Hello world!');
}

Tạo các lệnh npm


Trên bảng điều khiển CodeArtifact, chọn repository mà bạn đã tạo ở trên phần trên. Nếu bạn chưa có repository, hãy tạo một cái trước khi tiếp tục.


Chọn repository ở CodeArtifact của bạn và chọn Details để xem các chi tiết bổ sung cho kho lưu trữ của bạn.
Chúng ta sử dụng hai thư mục từ trang này:
  • Tên repository (my-repo)
  • Tên miền (my-domain)
Tạo script có tên là co:login trong package.json

{
  "name": "@myorg/my-package",
  "version": "1.0.0",
  "description": "A sample private scoped npm package",
  "main": "index.js",
  "scripts": {
    "co:login": "aws codeartifact login --tool npm --repository my-repo --domain my-domain",
    "test": "echo \"Error: no test specified\" && exit 1"
  }
}
Chạy script này sẽ cập nhập cấu hình npm của bạn để sử dụng repository CodeArtifact của bạn và lấy xác thực để sử dụng CodeArtiface, việc xác thực này chỉ dùng được trong 12 giờ, hết 12 giờ chúng ta lại phải chạy lại script này để đăng nhập: npm run co:login. Sau khi chạy command trên bạn sẽ nhận được đoạn sau:

> aws codeartifact login --tool npm --repository my-repo --domain my-domain
Successfully configured npm to use AWS CodeArtifact repository https://my-domain-<ACCOUNT ID>.d.codeartifact.us-east-1.amazonaws.com/npm/my-repo/
Login expires in 12 hours at 2020-09-04 02:16:17-04:00
Thêm prepare vào package.json:
{
  "name": "@myorg/my-package",
  "version": "1.0.0",
  "description": "A sample private scoped npm package",
  "main": "index.js",
  "scripts": {
    "prepare": "npm run co:login",
    "co:login": "aws codeartifact login --tool npm --repository my-repo --domain my-domain",
    "test": "echo \"Error: no test specified\" && exit 1"
  }
}
Điều này dùng để định cấu hình dự án, giúp tự động xác thực và tạo quyền truy cập bất cứ lúc nào khi các bạn dùng npm install hoặc npm publish trong dự án.
Nếu bạn thấy lỗi chứ "Invalid choice, valid choices are" thì bạn cần cập nhập AWS CLI theo các phiên bản mình đã liệt kê ở phần trên.

Tải package lên CodeArtifact

Để xuất bản gói mới trong lần đầu tiên, chạy npm publish.


Nếu quay lại CodeArtifact ở trình duyệt, bạn sẽ thấy package mới đã sẵn sàng để sử dụng


Cài đặt private package

Để cài đặt gói private package, trước tiên bạn cần thiết lập dự án và thêm các script để tự động hoá việc sử dụng CodeArtifact trong dự án.

Tạo dự án mới

Tạo thư mục cho dự án mới và đặt tên cho nó là my-app. Đây là dự án mà bạn muốn dùng private npm cái chúng ta đã xuất bản ở bước trước. Bạn có thể áp dụng cách này cho tất cả các dự ác khác mà bạn muốn dùng registry này: npm init -y
{
  "name": "my-app",
  "version": "1.0.0",
  "description": "A sample application consuming a private scoped npm package",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  }
}

Thêm cấu hình CodeArtifact

Sao chép các tập lệnh npm prepare và co:login đã tạo trước đó cho dự án mới:
{
  "name": "my-app",
  "version": "1.0.0",
  "description": "A sample application consuming a private scoped npm package",
  "main": "index.js",
  "scripts": {
    "prepare": "npm run co:login",
    "co:login": "aws codeartifact login --tool npm --repository my-repo --domain my-domain",
    "test": "echo \"Error: no test specified\" && exit 1"
  }
}

Cài đặt gói private npm mới

Nhập lệnh sau: npm install @myorg/my-package
Bây giờ package.json của bạn sẽ được liệt kê @myorg/my-package trong phần phụ thuộc:
{
  "name": "my-app",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "prepare": "npm run co:login",
    "co:login": "aws codeartifact login --tool npm --repository my-repo --domain my-domain",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "dependencies": {
    "@myorg/my-package": "^1.0.0"
  }
}

Sử dụng package npm

Trong thư mục my-app, hãy tạo index.js để chạy code từ package có chứa thông tin sau:
const { helloWorld } = require('@myorg/my-package');

helloWorld();
Chạy node index.js trong terminal để in thông báo từ hàm @myorg/my-package của mình.

Tổng kết

Trong bài đăng này, bạn đã biết được cách xuất bản thành công gói npm có phạm vi riêng tư được lưu trữ trong CodeArtifact, bạn có thể sử dụng lại gói này trên nhiều nhóm và dự án trong tổ chức của mình. Bạn có thể sử dụng npm scripts để hợp lý hoá quá trình xác thực và áp dụng mẫu này để tiết kiệm thời gian.