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

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

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

완벽한 예제 소스를 보거나 fork할 수도 있습니다.

모듈 초기화

  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 작업을 실행하는 단일 작업인 release 단계가 있는 파이프라인을 구성합니다. semantic-release 라이브러리는 npm 패키지의 새 버전을 발행하고 필요한 경우 새로운 GitLab 릴리스를 생성합니다.

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

CI/CD 변수 설정

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

  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: testing patch releases

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

마이너 버전을 만들려면 다음과 같은 커밋 메시지를 사용합니다:

feat: testing minor releases

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

feat: testing major releases

BREAKING CHANGE: This is a 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 태그는 GitLab 러너가 리포지터리의 캐시된 버전을 사용할 때 때로는 semantic-release에 의해 다시 생성될 수 있습니다. 리포지터리의 캐시된 버전에 해당 태그가 있는 러너에서 작업이 실행되면 semantic-release가 본 리포지터리에서 태그를 다시 만들 수 있습니다.

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