← 글 목록

notes

MD - semantic-release

semantic-release의 버전·릴리스 노트 자동화와 CI/CD 연동 메모.

릴리스 case

  • MAJOR : Breaking Change, 기존 버전과 호환되지 않게 API가 바뀌면 “주(主) 버전”
  • MINOR : Feature, 기존 버전과 호환되면서 새로운 기능을 추가할 때는 “부(部) 버전”
  • PATCH : Fix, 기존 버전과 호환되면서 버그를 수정한 것이라면 “수(修) 버전”

plug in

  • @semantic-release/commit-analyzer : commit message를 분석하는 플러그인입니다.
  • @semantic-release/release-notes-generator : 분석된 commit message를 가지고 지정한 규칙에 따라 릴리즈 노트를 생성하는 플러그인입니다.
  • @semantic-release/npm : package.json에 version을 수정하고 npm 에 배포를 담당하는 플러그인입니다. 만약 npm이 아닌 yarn을 사용하신다면, semantic-release-yarn 을 npm 대신에 사용해주시면 됩니다.
  • @semantic-release/github : github release를 생성하고 해당 release를 pull request하는 플러그인입니다.

토큰 발급·플러그인 흐름은 semantic-release 설정 메모를 같이 본다.


Jenkins에서 semantic-release 사용하기

semantic-release는 GitHub Actions 전용이 아니며, Jenkins에서도 충분히 사용할 수 있습니다. 아래는 Jenkins 파이프라인에서 semantic-release를 설정하는 방법입니다.

1. Jenkins 파이프라인 설정 (Jenkinsfile)

확장자명 goovy

pipeline {
agent {
docker {
image 'node:16'
}
}
stages {
    stage('Install dependencies') {
        steps {
            sh 'npm install'
            sh 'npm install -g semantic-release @semantic-release/git @semantic-release/changelog'
        }
    }

    stage('Test') {
        steps {
            sh 'npm test'
        }
    }

    stage('Release') {
        steps {
            withCredentials([string(credentialsId: 'GH_TOKEN', variable: 'GH_TOKEN')]) {
                sh 'npx semantic-release'
            }
        }
    }
}
}

2. package.json 설정

{
  "name": "your-package",
  "version": "0.0.0-development",
  "release": {
    "branches": ["main", "master"],
    "plugins": [
      "@semantic-release/commit-analyzer",
      "@semantic-release/release-notes-generator",
      "@semantic-release/changelog",
      "@semantic-release/npm",
      ["@semantic-release/git", {
        "assets": ["package.json", "CHANGELOG.md"],
        "message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
      }],
      "@semantic-release/github"
    ]
  }
}

3. .releaserc 파일 설정

jsonApply to Configure.md...

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

Jenkins 특화 대안

GitHub Actions에 의존하지 않고 Jenkins 환경에 더 특화된 대안도 있습니다:

1. Jenkins Release Plugin

젠킨스 내장 기능으로 릴리스 관리를 수행할 수 있습니다.

2. Jenkins Pipeline과 Groovy 스크립트

커밋 메시지를 분석하여 버전 관리 및 CHANGELOG 생성 로직을 직접 구현할 수 있습니다:

def getCommitMessages() {
    return sh(returnStdout: true, script: 'git log --pretty=format:"%s" ${GIT_PREVIOUS_SUCCESSFUL_COMMIT}..HEAD').trim()
}

def generateChangelog(commits) {
    def features = []
    def fixes = []
    
    commits.eachLine { line ->
        if (line.startsWith("feat:")) {
            features.add("- " + line.minus("feat:").trim())
        } else if (line.startsWith("fix:")) {
            fixes.add("- " + line.minus("fix:").trim())
        }
    }
    
    def changelog = "# 릴리스 노트 v${env.BUILD_NUMBER}\n\n"
    
    if (features.size() > 0) {
        changelog += "## 새로운 기능\n\n"
        features.each { changelog += "${it}\n" }
        changelog += "\n"
    }
    
    if (fixes.size() > 0) {
        changelog += "## 버그 수정\n\n"
        fixes.each { changelog += "${it}\n" }
    }
    
    return changelog
}

3. Jenkins와 Node 스크립트 결합

젠킨스에서 release-it, standard-version 같은 도구를 사용할 수 있습니다:

stage('Generate Release Notes') {
    steps {
        sh 'npx standard-version --skip.bump --skip.tag --skip.commit'
    }
}

GitHub Actions vs Jenkins 차이점g

  • 환경 변수: GitHub Actions와 Jenkins의 환경 변수가 다릅니다 (예: GITHUB_TOKEN vs GH_TOKEN)
  • 인증 설정: Jenkins에서는 withCredentials 블록을 사용하여 인증을 관리합니다
  • 플러그인 호환성: 일부 semantic-release 플러그인은 GitHub API에 의존하므로 Jenkins에서 사용 시 추가 설정이 필요합니다

Jenkins에서 semantic-release를 사용하면 GitHub Actions와 동일한 기능을 얻을 수 있으며, 자동 버전 관리, CHANGELOG 생성, 릴리스 노트 생성이 모두 가능합니다.