때로 회사에서 개발하다보면 외부에 공개하면 안되는 npm package들이 생기곤한다.

Github Actions, Docker에서 이 패키지를 설치할때 조금 번거롭지만 안전하게 사용해야하기 때문에 NPM Token은 격리 보관하도록하자.

먼저 Docker에서 npm private package 설치할때는 간단하다.

FROM node:lts-alpine3.13
WORKDIR /app

ENV NPM_TOKEN XXXXXXXXXXX
RUN apk add --update --no-cache git python3 make g++

RUN echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc

COPY . .

RUN yarn install --frozen-lockfile
RUN yarn build

ENTRYPOINT ["node", "build/api/index.js"]

위 Dockerfile은 nodejs 프로젝트 패키지 설치 후 빌드해서 사용하는 스크립트이다.

별거없고 NPM_TOKEN을 ENV에 주고 아래에 echo 로 .npmrc에 써주도록만 하면 끝이다. 그럼 알아서 패키지를 설치하고 빌드도 정상적으로 된다.

추가로 CI 에서도 필요한데 필자의 회사에서는 Github Actions을 메인으로 사용하기 때문에 이것만 설명한다.

name: ECR push

on:
  push:
    paths-ignore:
      - '.github/**'
      - '!.github/workflows'
    branches:
      - master
      - develop
      - stage
jobs:
  deploy:
    name: Deploy to ECR
    runs-on: ubuntu-latest

    steps:
      - name: Checkout source code
        uses: actions/checkout@v2

      - name: Get branch name
        id: branch-name
        uses: tj-actions/branch-names@v5

      - name: Configure AWS Credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: $
          aws-secret-access-key: $
          aws-region: ap-northeast-2
      - name: Login to AWS ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@v1

      - name: Push AWS ECR
        id: build-image
        run: |
          IMAGE_TAG=""
          [ $BRANCH == "master" ] && IMAGE_TAG="latest"
          [ $BRANCH == "develop" ] && IMAGE_TAG="dev"
          [ $BRANCH == "stage" ] && IMAGE_TAG="stage"
          echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> .npmrc
          docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
          docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
          echo "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG"
        env:
          BRANCH: $
          NPM_TOKEN: $
          ECR_REGISTRY: $
          ECR_REPOSITORY: $

위 스크립트는 Docker로 패키지들 설치 후 빌드 한 다음 이미지를 AWS ECR에 Push 하는 스크립트이다.

이때도 보면 별거 없고 run 스크립트 아래에 github secrets로 등록된 NPM_TOKEN을 가져와 docker container 안에 있는 .npmrc 파일에 써주게 된다.

이러면 문제 없이 Github actions에서도 npm private package를 사용할 수 있게 된다.

끝!