npm을 이용한 Semantic Versioning 자동화(feat. semantic-release)

Jeerryy·2022년 12월 26일
0

Node.js

목록 보기
2/2
post-thumbnail

semantic-release npm은 Node Version 14.17 혹은 이상의 Version이 필요합니다.

[JS/TS] husky를 곁들인 효율적인 커밋 작성법의 후속편입니다. conventional commits 적용 후에 설정해주세요.

CreatePAT를 통해 PAT 발급이 필요합니다.

Semantic Versioning이란?

MAJOR.MINOR.PATCH

Semantic Version(Semver)에서 명시된 형식으로 자리별 역할을 의미합니다.

기존 버전과 호환되지 않게 API가 변경되면 "MAJOR 버전"을 올린다.

기존 버전과 호환되면서 새로운 기능이 추가 되었을 때는 "MINOR 버전"을 올린다.

기존 버전과 호환되면서 버그를 수정했을 경우 "PATCH 버전" 을 올린다.

출처

그래서 Semantic Versioning을 왜 해야하죠?

SemVer을 통해서 대략적으로 업데이트의 중요도를 파악할 수 있도록 도와줍니다.

다양한 프로젝트가 존재할 경우 이러한 규칙을 정해두지 않는다면 프로젝트 별로 버저닝 기준이 달라져 해당 프로젝트 담당자가 아닌 이상 Release 히스토리 파악이 힘들뿐더러 기준 또한 알 수 없습니다.

때문에 이 문제를 해결하기 위해서 이를 통일화해줄 수 있는 것이 SemVer이다.
node.js 환경에서 이를 간편하게 도와주는 semantic-releasenpm이 존재한다.
이와 유사한 npm으로 release-it이 있다.

semantic-release는 무엇인가?

위에서 언급한 Semantic Versioning을 자동화 시켜주는 npm 입니다. git-flow 프로젝트 기준으로 main branch에 commit push가 있을 경우 이전까지의 Commit Msg를 분석하여 SemVer의 규약에 맞는 버저닝을 제공해줄 뿐만 아니라 자동으로 Tag를 생성해주고 Release Note를 작성해줍니다.

프로젝트 설정

  1. npm 설치

    npm i -D semantic-release @semantic-release/git

  2. package.json repository property 추가 (이미 ssh-url이 적용 돼있을 경우 생략)

    • ssh 주소 확인법

      git remote get-url origin

    "repository": {
        "type": "git",
        "url": "ssh-url를 넣어주세요."
      },
  3. package.json script 추가

    	"semantic-release": "semantic-release --no-ci --dry-run false"
  4. .releaserc 파일 생성

    {
      "plugins": [
        "@semantic-release/commit-analyzer",
        "@semantic-release/release-notes-generator",
        "@semantic-release/npm",
        "@semantic-release/github",
      ]
    }
  • option

    • 진행중인 프로젝트에 적용하기
      • semantic-release 적용하기 전 vx.x.x(ex: v2.1.4) tag로 release 작업 실시
        • 사전 릴리즈 작업 후 semantic release 를 적용하여 release 시 이전에 적용된 버전에 맞게 버저닝 됩니다.
    • npm publish 막는법
      • package.json에서 "private": true 적용
        • .releaserc 내 @semantic-release/npm 삭제

          삭제시 package.json 버전 동기화가 안됩니다.

    • .releaserc 내 @semantic-release/npm 수정
    ["@semantic-release/npm",
      {
        "npmPublish": false,
      }
    ]
    • package.json 버전 동기화 시키기

      a. @semantic-release/git 설치

      - npm install @semantic-release/git -D

      b. .releaserc 내 @semantic-release/git 수정

      [
      "@semantic-release/git",
        {
          "assets": "package.json",
          "message": "chore(release): ${nextRelease.version} [skip ci]\\n\\n${nextRelease.notes}"
        }
      ]
      	```
  1. cloudbuild.yaml (gcp 기준)
steps:
  - id: 'checkout branch'
    name: 'gcr.io/cloud-builders/git'
    args: ['checkout', '-b', 'main']
  - id: 'npm install'
    name: node:$_NODE_VERSION
    entrypoint: npm
    args:
      - 'install'
  - id: 'run semantic-release'
    name: node:$_NODE_VERSION
    entrypoint: npm
    args:
      - 'run'
      - 'semantic-release'
    env:
      - 'GH_TOKEN=$_GH_TOKEN'

CloudBuild 설정

  • semantic-release용 Trigger 생성

적용 결과

  1. CloudBuild
  1. Releases
profile
다양한 경험을 해보고자 하는 Backend-Engineer. [2023년은 내실 다지기의 해]

0개의 댓글