Yarn으로 패키지 게시
GitLab v19.5요약
Yarn 1 (Classic) 및 Yarn 2+로 패키지를 게시하고 설치할 수 있습니다. 배포 컨테이너에서 사용하는 Yarn 버전을 확인하려면 yarn publish를 호출하는 CI/CD 스크립트 job 블록의 script 블록에서 yarn --version을 실행합니다.
Yarn 1 (Classic) 및 Yarn 2+로 패키지를 게시하고 설치할 수 있습니다.
배포 컨테이너에서 사용하는 Yarn 버전을 확인하려면 yarn publish를 호출하는 CI/CD 스크립트
job 블록의 script 블록에서 yarn --version을 실행합니다. Yarn 버전은 파이프라인 출력에 표시됩니다.
패키지 레지스트리 인증#
패키지 레지스트리와 상호 작용하려면 토큰이 필요합니다. 목적에 따라 사용할 수 있는 토큰이 다릅니다. 자세한 내용은 토큰 안내를 참고합니다.
- 조직에서 이중 인증(2FA)을 사용한다면 범위를
api로 설정한 개인 액세스 토큰을 사용해야 합니다. - CI/CD 파이프라인으로 패키지를 게시한다면 개인 러너와 함께 CI/CD job 토큰을 사용할 수 있습니다. 인스턴스 러너에는 변수를 등록할 수도 있습니다.
게시를 위한 Yarn 구성#
패키지 레지스트리에 게시하도록 Yarn을 구성하려면 .yarnrc.yml 파일을 편집합니다.
이 파일은 package.json 파일과 같은 위치인 프로젝트 루트 디렉터리에 있습니다.
-
.yarnrc.yml을 편집해 다음 구성을 추가합니다.npmScopes: <my-org>: npmPublishRegistry: 'https://<domain>/api/v4/projects/<project_id>/packages/npm/' npmAlwaysAuth: true npmAuthToken: '<token>'이 구성에서 각 값은 다음과 같이 바꿉니다.
<my-org>는 조직 범위로 바꿉니다.@기호는 포함하지 않습니다.<domain>은 도메인 이름으로 바꿉니다.<project_id>는 프로젝트 개요 페이지에서 확인할 수 있는 프로젝트 ID로 바꿉니다.<token>은 배포 토큰, 그룹 액세스 토큰, 프로젝트 액세스 토큰, 개인 액세스 토큰 중 하나로 바꿉니다.
Yarn Classic에서는 publishConfig["@scope:registry"]로 범위를 지정한 레지스트리를 지원하지 않습니다. 자세한 내용은 Yarn pull request 7829를 참고합니다.
대신 package.json 파일에서 publishConfig를 registry로 설정합니다.
패키지 게시#
명령줄에서 또는 GitLab CI/CD로 패키지를 게시할 수 있습니다.
명령줄 사용#
패키지를 수동으로 게시하는 방법은 다음과 같습니다.
-
다음 명령을 실행합니다.
# Yarn 1 (Classic) yarn publish # Yarn 2+ yarn npm publish
CI/CD 사용#
인스턴스 러너(기본) 또는 개인 러너(고급)로 패키지를 자동으로 게시할 수 있습니다. CI/CD로 게시할 때는 파이프라인 변수를 사용할 수 있습니다.
-
프로젝트 또는 그룹의 인증 토큰을 만듭니다.
- 상단 표시줄에서 Search or go to를 선택하고 프로젝트 또는 그룹을 찾습니다.
- 왼쪽 사이드바에서 Settings > Repository > Deploy Tokens를 선택합니다.
read_package_registry및write_package_registry범위를 가진 배포 토큰을 만들고 생성된 토큰을 복사합니다.- 왼쪽 사이드바에서 Settings > CI/CD > Variables를 선택합니다.
Add variable을 선택하고 다음 설정을 사용합니다.
필드 값 key NPM_AUTH_TOKENvalue type Variable Protected variable CHECKEDMask variable CHECKEDExpand variable CHECKED -
선택 사항. 보호된 변수를 사용하려면 다음을 진행합니다.
- Yarn 패키지 소스 코드가 있는 리포지터리로 이동합니다.
- 왼쪽 사이드바에서 Settings > Repository를 선택합니다.
- 태그가 있는 브랜치에서 빌드한다면 Protected Tags를 선택하고 시맨틱 버전 관리를 위해
v*(와일드카드)를 추가합니다. - 태그가 없는 브랜치에서 빌드한다면 Branch rules를 선택합니다.
- 태그가 있는 브랜치에서 빌드한다면 Protected Tags를 선택하고 시맨틱 버전 관리를 위해
-
package.json이 있는 패키지 프로젝트 루트 디렉터리의.yarnrc.yml구성에 앞에서 만든NPM_AUTH_TOKEN을 추가합니다.npmScopes: <my-org>: npmPublishRegistry: '${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/npm/' npmAlwaysAuth: true npmAuthToken: '${NPM_AUTH_TOKEN}'이 구성에서
<my-org>는@기호를 제외한 조직 범위로 바꿉니다.
-
package.json이 있는 패키지 프로젝트 루트 디렉터리의.yarnrc.yml구성에CI_JOB_TOKEN을 추가합니다.npmScopes: <my-org>: npmPublishRegistry: '${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/npm/' npmAlwaysAuth: true npmAuthToken: '${CI_JOB_TOKEN}'이 구성에서
<my-org>는@기호를 제외한 조직 범위로 바꿉니다. -
.yarnrc.yml이 있는 GitLab 프로젝트에서.gitlab-ci.yml파일을 편집하거나 새로 만듭니다. 예를 들어 태그 푸시에서만 트리거하려면 다음과 같이 작성합니다.Yarn 1의 경우:
image: node:lts stages: - deploy rules: - if: $CI_COMMIT_TAG deploy: stage: deploy script: - yarn publishYarn 2 이상의 경우:
image: node:lts stages: - deploy rules: - if: $CI_COMMIT_TAG deploy: stage: deploy before_script: - corepack enable - yarn set version stable script: - yarn npm publish
파이프라인이 실행되면 패키지가 패키지 레지스트리에 추가됩니다.
패키지 설치#
인스턴스 또는 프로젝트에서 설치할 수 있습니다. 이름과 버전이 같은 패키지가 여러 개 있으면 패키지를 설치할 때 가장 최근에 게시된 패키지만 가져옵니다.
범위가 지정된 패키지 이름#
인스턴스에서 설치하려면 패키지 이름에 범위가 지정되어 있어야 합니다.
패키지 범위는 .yarnrc.yml 파일과 package.json의 publishConfig 옵션에서 설정할 수 있습니다.
프로젝트나 그룹에서 설치한다면 패키지 이름 규칙을 따르지 않아도 됩니다.
패키지 범위는 @로 시작하며 @owner/package-name 형식을 따릅니다.
@owner는 패키지 소스 코드가 있는 프로젝트의 루트가 아니라 패키지를 호스팅하는 최상위 프로젝트입니다.- 패키지 이름은 무엇이든 가능합니다.
예를 들면 다음과 같습니다.
| 프로젝트 URL | 패키지 레지스트리 | 조직 범위 | 전체 패키지 이름 |
|---|---|---|---|
https://gitlab.com/<my-org>/<group-name>/<package-name-example> |
Package Name Example | @my-org |
@my-org/package-name |
https://gitlab.com/<example-org>/<group-name>/<project-name> |
Project Name | @example-org |
@example-org/project-name |
인스턴스에서 설치#
같은 조직 범위에서 여러 패키지를 다룬다면 인스턴스에서 설치하는 방안을 고려합니다.
-
조직 범위를 구성합니다.
.yarnrc.yml파일에 다음을 추가합니다.npmScopes: <my-org>: npmRegistryServer: 'https://<domain_name>/api/v4/packages/npm'<my-org>는 패키지를 설치할 프로젝트의 루트 수준 그룹으로 바꾸고@기호는 제외합니다.<domain_name>은 도메인 이름으로 바꿉니다(예:gitlab.com).
-
선택 사항. 패키지가 비공개라면 패키지 레지스트리 액세스를 구성해야 합니다.
npmRegistries: //<domain_name>/api/v4/packages/npm: npmAlwaysAuth: true npmAuthToken: '<token>'<domain_name>은 도메인 이름으로 바꿉니다(예:gitlab.com).<token>은 배포 토큰(권장), 그룹 액세스 토큰, 프로젝트 액세스 토큰, 개인 액세스 토큰 중 하나로 바꿉니다.
그룹 또는 프로젝트에서 설치#
일회성 패키지라면 그룹이나 프로젝트에서 설치할 수 있습니다.
-
그룹 범위를 구성합니다.
.yarnrc.yml파일에 다음을 추가합니다.npmScopes: <my-org>: npmRegistryServer: 'https://<domain_name>/api/v4/groups/<group_id>/-/packages/npm'<my-org>는 설치하려는 그룹을 포함하는 최상위 그룹으로 바꿉니다.@기호는 제외합니다.<domain_name>은 도메인 이름으로 바꿉니다(예:gitlab.com).<group_id>는 그룹 개요 페이지에서 확인할 수 있는 그룹 ID로 바꿉니다.
-
선택 사항. 패키지가 비공개라면 레지스트리를 설정해야 합니다.
npmRegistries: //<domain_name>/api/v4/groups/<group_id>/-/packages/npm: npmAlwaysAuth: true npmAuthToken: "<token>"<domain_name>은 도메인 이름으로 바꿉니다(예:gitlab.com).<token>은 배포 토큰(권장), 그룹 액세스 토큰, 프로젝트 액세스 토큰, 개인 액세스 토큰 중 하나로 바꿉니다.<group_id>는 그룹 개요 페이지에서 확인할 수 있는 그룹 ID로 바꿉니다.
-
프로젝트 범위를 구성합니다.
.yarnrc.yml파일에 다음을 추가합니다.npmScopes: <my-org>: npmRegistryServer: "https://<domain_name>/api/v4/projects/<project_id>/packages/npm"<my-org>는 설치하려는 프로젝트를 포함하는 최상위 그룹으로 바꿉니다.@기호는 제외합니다.<domain_name>은 도메인 이름으로 바꿉니다(예:gitlab.com).<project_id>는 프로젝트 개요 페이지에서 확인할 수 있는 프로젝트 ID로 바꿉니다.
-
선택 사항. 패키지가 비공개라면 레지스트리를 설정해야 합니다.
npmRegistries: //<domain_name>/api/v4/projects/<project_id>/packages/npm: npmAlwaysAuth: true npmAuthToken: "<token>"<domain_name>은 도메인 이름으로 바꿉니다(예:gitlab.com).<token>은 배포 토큰(권장), 그룹 액세스 토큰, 프로젝트 액세스 토큰, 개인 액세스 토큰 중 하나로 바꿉니다.<project_id>는 프로젝트 개요 페이지에서 확인할 수 있는 프로젝트 ID로 바꿉니다.
Yarn으로 설치#
- 명령줄이나 CI/CD 파이프라인에서
yarn add를 실행합니다.
yarn add @scope/my-package
Yarn Classic에는 .npmrc 파일과 .yarnrc 파일이 모두 필요합니다.
자세한 내용은 Yarn issue 4451을 참고합니다.
-
자격 증명은
.npmrc파일에, 범위가 지정된 레지스트리는.yarnrc파일에 넣습니다.# .npmrc ## For the instance //<domain_name>/api/v4/packages/npm/:_authToken='<token>' ## For the group //<domain_name>/api/v4/groups/<group_id>/-/packages/npm/:_authToken='<token>' ## For the project //<domain_name>/api/v4/projects/<project_id>/packages/npm/:_authToken='<token>' # .yarnrc ## For the instance '@scope:registry' 'https://<domain_name>/api/v4/packages/npm/' ## For the group '@scope:registry' 'https://<domain_name>/api/v4/groups/<group_id>/-/packages/npm/' ## For the project '@scope:registry' 'https://<domain_name>/api/v4/projects/<project_id>/packages/npm/' -
명령줄이나 CI/CD 파이프라인에서
yarn add를 실행합니다.yarn add @scope/my-package
Yarn 패키지 삭제#
사전 요구 사항:
- Maintainer 또는 Owner 권한이 있어야 합니다.
패키지를 삭제하기 전에 관련 보안 위험을 파악해야 합니다.
패키지를 삭제하는 방법은 다음 두 가지입니다.
관련 주제#
문제 해결#
npm 레지스트리의 패키지 레지스트리에서 Yarn 실행 오류#
Yarn을 npm 레지스트리와 함께 사용하면 다음과 같은 오류 메시지가 나타날 수 있습니다.
yarn install v1.15.2
warning package.json: No license field
info No lockfile found.
warning XXX: No license field
[1/4] 🔍 Resolving packages...
[2/4] 🚚 Fetching packages...
error An unexpected error occurred: "https://gitlab.example.com/api/v4/projects/XXX/packages/npm/XXX/XXX/-/XXX/XXX-X.X.X.tgz: Request failed \"404 Not Found\"".
info If you think this is a bug, please open a bug report with the information provided in "/Users/XXX/gitlab-migration/module-util/yarn-error.log".
info Visit https://classic.yarnpkg.com/en/docs/cli/install for documentation about this command
이 경우 다음 명령은 현재 디렉터리에 .yarnrc라는 파일을 만듭니다. 전역 구성이라면 사용자 홈 디렉터리에서, 프로젝트별 구성이라면 프로젝트 루트에서 실행해야 합니다.
yarn config set '//gitlab.example.com/api/v4/projects/<project_id>/packages/npm/:_authToken' '<token>'
yarn config set '//gitlab.example.com/api/v4/packages/npm/:_authToken' '<token>'
그룹 설치에서 tarball을 가져올 때 Yarn Classic 이 404 Not Found를 반환#
Yarn Classic으로 그룹의 레지스트리에서 패키지를 설치하면 패키지 확인은 성공하지만 tarball 다운로드가 404 Not Found 오류로 실패할 수 있습니다.
[1/4] Resolving packages...
[2/4] Fetching packages...
error Error: https://gitlab.example.com/api/v4/projects/<project_id>/packages/npm/@scope/my-package/-/@scope/my-package-1.0.0.tgz: Request failed "404 Not Found"
이 오류는 그룹 레지스트리가 반환하는 패키지 메타데이터에 프로젝트
엔드포인트를 가리키는 tarball 다운로드 URL 이 들어 있기 때문에
발생합니다. .npmrc 파일에 그룹 엔드포인트의 인증 토큰만 있으면
프로젝트 엔드포인트로 보내는 요청은 인증되지 않은 상태가 되어
404를 반환합니다.
이 문제를 해결하려면 .npmrc 파일에 그룹 엔드포인트와 프로젝트
엔드포인트의 인증 토큰을 모두 추가합니다.
# .npmrc
//gitlab.example.com/api/v4/groups/<group_id>/-/packages/npm/:_authToken='<token>'
//gitlab.example.com/api/v4/projects/<project_id>/packages/npm/:_authToken='<token>'
단축된 인증 경로에서 Yarn Classic 이 401 Unauthorized를 반환#
Yarn Classic을 GitLab 패키지 레지스트리와 함께 사용할 때 인증 토큰이
유효한데도 401 Unauthorized 오류가 발생할 수 있습니다.
오류 메시지는 다음과 같은 형태입니다.
error Couldn't find package "@scope/my-package" on the "npm" registry.
--verbose 플래그를 사용하면 로그에 401 상태 코드가 표시됩니다.
verbose Performing "GET" request to "https://gitlab.com/api/v4/groups/<group_id>/-/packages/npm/..."
verbose Request "https://gitlab.com/api/v4/groups/<group_id>/-/packages/npm/..." finished with status code 401.
이 문제는 .npmrc의 _authToken 항목이 전체 엔드포인트 경로가 아니라
단축된 상위 경로를 사용할 때 발생합니다. 예를 들면 다음과 같습니다.
# Does NOT work with Yarn Classic
//gitlab.com/api/v4/:_authToken='<token>'
npm 8 이상은 계층적 인증 매칭(상위 경로에 설정한 토큰이 모든 하위 경로에
적용되는 방식)을 지원하지만, Yarn Classic은 _authToken 항목과 레지스트리
URL의 경로가 정확히 일치해야 합니다.
이 문제를 해결하려면 .npmrc 파일에서 인증하는 레지스트리마다 전체
엔드포인트 경로를 사용합니다. 예를 들어 패키지가 특정 프로젝트에 호스팅된
그룹 레지스트리에서 설치하는 경우는 다음과 같습니다.
# .npmrc
//gitlab.com/api/v4/groups/<group_id>/-/packages/npm/:_authToken='<token>'
//gitlab.com/api/v4/projects/<project_id>/packages/npm/:_authToken='<token>'
그룹 엔드포인트가 반환하는 패키지 메타데이터에 프로젝트 엔드포인트를 가리키는 tarball 다운로드 URL 이 들어 있으므로 프로젝트 항목이 필요합니다.
yarn install 이 의존성으로 리포지터리를 클론하는 데 실패#
Dockerfile에서 yarn install을 사용하면 Dockerfile을 빌드할 때 다음과 같은 오류가 발생할 수 있습니다.
...
#6 8.621 fatal: unable to access 'https://gitlab.com/path/to/project/': Problem with the SSL CA cert (path? access rights?)
#6 8.621 info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.
#6 ...
이 문제를 해결하려면 .dockerignore 파일의 Yarn 관련 경로마다 느낌표(!)를 추가합니다.
**
!./package.json
!./yarn.lock
...