GitHub Package RegistryBeta

GitHub에서 베타 서비스 중인 Package Registry에 무스마도 베타 유저로 참여하게 되었습니다.

image


GitHub Package Registry가 무엇인가요?

About GitHub Package Registry

GitHub Package Registry is a software package hosting service, similar to npmjs.org, rubygems.org, or hub.docker.com, that allows you to host your packages and code in one place. You can host software packages privately or publicly and use them as dependencies in your projects.

Node.js는 NPM 저장소, Java는 Maven 저장소, Ruby는 Rubygems, C#은 NuGet, 도커는 DockerHub 등등, 사람들이 많이 쓰는 사실상의 표준 패키지 저장소들이 있습니다.

그런데 이들 저장소 대부분 오픈소스 패키지에만 서비스를 무료로 제공하고, 사내 프로젝트에서 쓰이는 패키지를 호스팅 하려면 사설 저장소 플랜을 구독해야 하는 경우가 많습니다.

아예 사내 네트워크에 사설 저장소를 호스팅하는 경우도 있는데(Sonatype Nexus, JFrog Artifactory 등), 이렇게 되면 비용도 비용이지만 관리해야할 포인트가 더 늘어나게 됩니다.

이제 GitHub Package Registry가 나오면서, 패키지 검색, 배포, 호스팅을 GitHub 플랫폼 안에서 해결할 수 있게 되었습니다.


무엇이 좋아지나요?

개발 워크 플로우의 결과물을 아티팩트(artifact)라고 부릅니다.

Node.js 프로젝트에서 npm 패키지 아티팩트가 나오고, 또 Docker 이미지 아티팩트가 나올 수 있습니다.

그동안 무스마에서는 Node.js 프로젝트에 대해서 사설 저장소를 사용하지 않아서, 공통적으로 사용되는 모듈에 대한 공유가 이루어지지 않았습니다.

새 프로젝트의 구조를 만들 때, 기존 프로젝트에서 복사-붙여넣기를 해서 만드는 경우가 많았습니다.

하지만 이제 GitHub Package Registry를 사용함으로써, 공통 모듈을 프로젝트 간에 seamless하게(마치 npm 저장소에서 패키지를 받는 것처럼) 공유할 수 있게 되었습니다.

그리고 Docker 이미지도 ECR에 배포하는 대신 GitHub Package Registry에 바로 올릴 수 있게 되었습니다.

npm 따로 Docker Hub나 AWS ECR 따로 관리하는 것이 아니라,

개발 워크 플로우의 중심이 되는 코드 저장소(GitHub)를 중심으로 통합 관리가 이루어지기 때문에 훨씬 수월합니다.

그리고 각각의 서비스를 구독하는 대신 GitHub에서 올인원(All-in-One)으로 해결함으로써 비용도 줄일 수 있습니다.


TODO: 팀원들이 해야할 것

GitHub Package Registry 서비스는 Beta 상태인데, 나중에는 모르겠지만 지금은 완전한 Public Access가 되지 않습니다. (Anonymous 유저가 패키지를 다운로드할 수 없습니다.)

우선 GitHub 계정이 있고 Package Registry에 접근할 권한이 있어야 합니다.


GitHub -> 사용자 -> Settings에 들어갑니다.

image


Developer settings에 들어갑니다.

image


Personal access tokens에 들어갑니다.

image


Generate new token을 클릭합니다.

image


write:packages, read:packages에 체크하고(repo는 자동으로 체크됨) Generate token을 클릭합니다.

image


생성된 토큰을 복사합니다.

화면을 넘기기 전에 복사하세요. 화면을 넘기면 다시는 볼 수 없습니다.

image


터미널을 열고 ~/.npmrc에 토큰을 저장합니다.

$ vi ~/.npmrc

아래와 같이 아까 생성된 토큰을 입력하세요. (밑에거 그대로 치지 말고요 😅)

//npm.pkg.github.com/:_authToken=85362b251e4e2554d7b94971a38786ca5991e9


옵션: 프로젝트에 .npmrc 생성

프로젝트 루트에 .npmrc가 없다면 생성해줍니다.

$ vi .npmrc
@musma:registry=https://npm.pkg.github.com/

package.json 파일에서 @musma/eslint-config 같이 앞에 @musma가 붙는 패키지에 대해서는 공식 npm 저장소 http://registry.npmjs.org/ 대신 GitHub Package Registry https://npm.pkg.github.com/에서 찾아서 다운로드하겠다는 의미입니다.


read:packages 패키지 저장소 접근 범위

앞서 생성하고 저장한 토큰은 내 GitHub 계정 앞으로 부여된 것입니다.

토큰의 허용 범위에 read:packages가 포함되어 있으면,

  • 다른 Public 저장소의 패키지를 가져올 수 있고,
  • 내가 소속된 조직 혹은 내 소유의 private 저장소에서 패키지를 가져올 수 있습니다.


패키지 배포 하기

이번엔 패키지를 배포(publish)하는 방법입니다.

앞서 수행한 내용을 다 마친 상태여야 합니다.
(토큰 발급, global .npmrc에 저장, 프로젝트 .npmrc 생성 등)

배포할 프로젝트의 package.json을 수정합니다.

  • private: true가 있으면 제거해주세요. (private: true이면 publish가 되지 않습니다.)
  • name에 앞부분에 @(조직이름)/를 붙여주세요.
    • 예) @musma/eslint-config
    • (조직이름에 대문자가 들어가도 소문자로 바꿔서 적어줍니다. Musma => musma)
  • description, author, license, keyword 필드를 채워주세요.
  • repository 필드를 명시적으로 채워줍니다.

    • 예)

      "repository": {
        "type": "git",
        "url": "https://github.com/Musma/eslint-config.git"
      },
      
  • main, files 필드를 채워주세요.
    • main: 진입점 파일 (.js)
    • files: 패키지에 포함될 파일 (개발시에만 사용되는 파일이나 소스코드를 제외할 수 있습니다.)
  • publishConfig 필드를 입력합니다.

    • 예)

      "publishConfig": {
        "registry": "https://npm.pkg.github.com/"
      }
      
    • 이 패키지는 npm저장소가 아니라 GitHub Package Regsitry에 배포한다는 뜻입니다.


publish (패키지 올리기)

package.json에서 version을 변경하고, 패키지 매니저의 publish 명령으로 배포합니다.

$ yarn publish

# 혹은

$ npm publish

주의: 특정 version으로 한 번 배포한 후에는 수정을 할 수 없습니다.

삭제도 안 됩니다. 신중하게 배포하십시오.


보너스: yarn integrity 이슈 해결

Node.js 프로젝트에서 패키지 매니저로 yarn을 사용할 경우, npm과는 다르게 동작하는 이슈가 있습니다.

제가 이미 GitHub에 이슈 리포트를 했으니 Beta가 지나가면 해결이 될 것으로 기대합니다.

npm으로는 문제가 없습니다.

yarn install을 하면 아래와 같이 에러가 발생하면서 설치가 안 될 수 있습니다.

error https://npm.pkg.github.com/download/@musma/some-package/0.0.x/e37a70267a4d11ea1a6bff3721d9e03de44a3840e83497fc7162a2f227751baa: Integrity checked failed for "@musma/some-package" (none of the specified algorithms are supported)

Integrity checked failed, algorithms 등의 문구가 등장하는데, npm과 yarn의 Hash Validation(위변조된 패키지인지 무결성 검사) 알고리즘의 차이에서 나오는 문제인 것 같습니다.

해시 알고리즘 SHA-1, SHA-512를 혼용하는데 GitHub Package Registry의 npm 저장소에서는 이 부분의 처리가 아직 미비한 것 같습니다.

이때 yarn install –update-checksums를 하면 설치가 됩니다.

$ yarn install --update-checksums

# 혹은, 그냥

$ yarn --update-checksums

평소에는 --update-checksums를 붙이지 않으니, 처음 GitHub Package Registry npm 저장소를 yarn과 함께 사용하면 당황스러울 수도 있습니다.

빨리 해결되어야할 문제입니다만, Beta가 끝날 때까지 당분간 이렇게 사용하시면 되겠습니다.


결론 및 소감

점차 올인원(All-in-One) 서비스가 되어가는 GitHub을 볼 때마다 참 실한 서비스라는 생각이 듭니다.

몇 푼 하지는 않더라도 그동안 npmjs, DockerHub 같은 서비스를 돈 내고 쓰기가 망설여졌는데,

이 기능들이 GitHub 플랫폼에 통합되면서 개발 워크플로우에 새로운 시도를 해볼 수 있게 되었습니다.

이제 공통 모듈을 프로젝트 간에 공유하면서 효율적으로 개발하는 방향으로 나아가길 바랍니다.

감사합니다.


References