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 생성, 릴리스 노트 생성이 모두 가능합니다.