GitLab 패키지 레지스트리를 활용하여 semantic-release를 사용하여 npm 패키지를 GitLab에 공개하는 방법

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

이 안내서는 semantic-release를 사용하여 GitLab 패키지 레지스트리에 자동으로 npm 패키지를 공개하는 방법을 보여줍니다.

전체 예제 소스를 보거나 포크할 수도 있습니다.

모듈 초기화

  1. 터미널을 열고 프로젝트 저장소로 이동합니다.
  2. npm init을 실행합니다. 프로젝트 경로가 gitlab-examples/semantic-release-npm인 경우 모듈의 이름을 @gitlab-examples/semantic-release-npm으로 지정합니다.

  3. 다음 npm 패키지를 설치합니다:

    npm install semantic-release @semantic-release/git @semantic-release/gitlab @semantic-release/npm --save-dev
    
  4. 다음과 같은 속성을 모듈의 package.json에 추가합니다:

    {
      "scripts": {
        "semantic-release": "semantic-release"
      },
      "publishConfig": {
        "access": "public"
      },
      "files": [ <파일 경로 입력> ]
    }
    
  5. 발행된 모듈에 포함해야 하는 모든 파일을 선택하는 glob 패턴으로 files 키를 업데이트합니다. files에 대한 자세한 정보는 npm 문서에서 확인할 수 있습니다.

  6. node_modules를 커밋하지 않기 위해 프로젝트에 .gitignore 파일을 추가합니다:

    node_modules
    

파이프라인 구성

다음 내용의 .gitlab-ci.yml을 생성합니다:

default:
  image: node:latest
  before_script:
    - npm ci --cache .npm --prefer-offline
    - |
      {
        echo "@${CI_PROJECT_ROOT_NAMESPACE}:registry=${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/npm/"
        echo "${CI_API_V4_URL#https?}/projects/${CI_PROJECT_ID}/packages/npm/:_authToken=\${CI_JOB_TOKEN}"
      } | tee -a .npmrc
  cache:
    key: ${CI_COMMIT_REF_SLUG}
    paths:
      - .npm/

workflow:
  rules:
    - if: $CI_COMMIT_BRANCH

variables:
  NPM_TOKEN: ${CI_JOB_TOKEN}

stages:
  - release

publish:
  stage: release
  script:
    - npm run semantic-release
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

이 예제는 publish 작업을 실행하는 파이프라인을 단일 작업으로 구성합니다. semantic-release 라이브러리는 npm 패키지의 새 버전을 게시하고 필요한 경우 새 GitLab 릴리스를 생성합니다.

기본 before_scriptpublish 작업 중에 패키지 레지스트리에 인증하는 데 사용되는 임시 .npmrc을 생성합니다.

CI/CD 변수 설정

패키지를 공개하는 과정에서 semantic-release는 package.json에 있는 버전 번호를 증가시킵니다. semantic-release가 이 변경 사항을 커밋하고 GitLab에 푸시하려면, 파이프라인에 GITLAB_TOKEN이라는 사용자 지정 CI/CD 변수가 필요합니다. 이 변수를 만들려면:

  1. 왼쪽 사이드바에서 아바타를 선택합니다.
  2. Preferences > Access tokens를 선택합니다.
  3. Token name 상자에 토큰 이름을 입력합니다.
  4. select scopes 아래에서 api 확인란을 선택합니다.
  5. Create project access token을 선택합니다.
  6. 값을 복사합니다.
  7. 왼쪽 사이드바에서 검색 또는 이동을 선택하여 프로젝트를 찾습니다.
  8. Settings > CI/CD를 선택합니다.
  9. Variables를 확장합니다.
  10. Add variable를 선택합니다.
  11. Key 상자에 GITLAB_TOKEN을 입력합니다.
  12. Value 상자에 토큰을 붙여넣기합니다.
  13. Mask variable 확인란을 선택합니다.
  14. Add variable를 선택합니다.

semantic-release 구성

semantic-release는 프로젝트의 루트에 있는 .releaserc.json 파일에서 구성 정보를 가져옵니다. 다음과 같이 .releaserc.json을 생성합니다:

{
  "branches": ["master"],
  "plugins": [
    "@semantic-release/commit-analyzer",
    "@semantic-release/release-notes-generator",
    "@semantic-release/gitlab",
    "@semantic-release/npm",
    [
      "@semantic-release/git",
      {
        "assets": ["package.json"],
        "message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
      }
    ]
  ]
}

배포 시작

하위 패치 릴리스를 테스트하는 메시지로 커밋을 만들어 파이프라인을 테스트하세요:

fix: testing patch releases

이 커밋을 기본 브랜치에 푸시합니다. 파이프라인은 프로젝트의 릴리스 페이지에 새 릴리스(v1.0.0)를 생성하고 프로젝트의 패키지 레지스트리 페이지에 새 버전의 패키지를 게시해야 합니다.

소규모 릴리스를 만들려면 다음과 같은 커밋 메시지를 사용할 수 있습니다:

feat: testing minor releases

또는 중요한 변경 사항이 있는 경우:

feat: testing major releases

BREAKING CHANGE: This is a breaking change.

커밋 메시지가 릴리스로 매핑되는 방법에 대한 자세한 정보는 semantic-release의 문서에서 확인할 수 있습니다.

프로젝트에서 모듈 사용

공개된 모듈을 사용하려면, 모듈에 종속되는 프로젝트에 .npmrc 파일을 추가하세요. 예를 들어, 예제 프로젝트 모듈을 사용하려면:

@gitlab-examples:registry=https://gitlab.com/api/v4/packages/npm/

그런 다음, 모듈을 설치합니다:

npm install --save @gitlab-examples/semantic-release-npm

문제 해결

삭제된 Git 태그가 다시 나타남

저장소에서 삭제된 Git 태그semantic-release가 저장소의 캐시된 버전을 사용하는 GitLab 실행기에서 가끔 다시 생성될 수 있습니다. 저장소의 캐시 버전에 태그가 남아 있는 러너에서 작업이 실행되면, semantic-release가 주 저장소에서 태그를 다시 만듭니다.

이러한 동작을 피하려면 다음을 수행할 수 있습니다: