semantic-release를 사용하여 GitLab 패키지 레지스트리에 npm 패키지 발행하기

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

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

전체 예제 소스를 확인하거나 복제할 수도 있습니다.

모듈 초기화

  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. files 키를 수정하여 발행된 모듈에 포함해야 하는 모든 파일을 선택하는 glob 패턴을 추가합니다. 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 작업을 실행하는 단일 작업인 release를 포함하여 파이프라인을 구성합니다. semantic-release 라이브러리는 npm 패키지의 새 버전을 발행하고 필요한 경우 새로운 GitLab 릴리스를 생성합니다.

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

CI/CD 변수 설정

패키지를 발행하는 일환으로 semantic-release는 package.json에서 버전 번호를 증가시킵니다. 이 변경 사항을 커밋하고 GitLab에 푸시하도록 semantic-release를 구성하려면 파이프라인에 GITLAB_TOKEN이라는 사용자 지정 CI/CD 변수가 필요합니다. 이 변수를 생성하려면 다음 단계를 수행하세요:

  1. 왼쪽 사이드바에서 아바타를 선택합니다.
  2. Preferences > Access Tokens를 선택합니다.
  3. Token name 상자에 토큰 이름을 입력합니다.
  4. select scopes 아래에서 api 확인란을 선택합니다.
  5. Create project access token을 선택합니다.
  6. 값을 복사합니다.
  7. 왼쪽 사이드바에서 Search or go to을 선택하여 프로젝트를 찾습니다.
  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: 테스트 패치 릴리즈

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

마이너 릴리즈를 생성하려면 다음과 같은 커밋 메시지를 사용하세요:

feat: 테스트 마이너 릴리즈

또는, 메이저 변경 사항을 위해서:

feat: 테스트 메이저 릴리즈

BREAKING CHANGE: 이것은 메이저 변경 사항입니다.

커밋 메시지가 릴리즈에 어떻게 매핑되는지에 대한 자세한 정보는 semantic-releases 문서에서 찾을 수 있습니다.

프로젝트에서 모듈 사용하기

게시된 모듈을 사용하려면, 프로젝트에 모듈에 종속되는 .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가 주 저장소에 태그를 다시 생성합니다.

이 동작을 피하려면 다음 중 하나를 수행할 수 있습니다: