안녕하세요. 진부한 서버 개발자입니다.
계속해서 더 편리하고 새로운 기술들이 생겨나고 있지만,
멈춰버린 시간 속에 살고 있는 진부한 개발자는 오늘도 진부한 정보를 사용합니다.
시맨틱 릴리즈란?
버전 관리 자동화를 위해 사용되는 Semantic Release는 커밋 메시지를 기반으로 자동으로 버전을 업데이트하고, 깃 태그를 생성하고, 변경 로그까지 자동으로 작성해주는 도구입니다.
CI/CD 환경에서 매우 유용하며, 특히 팀 개발 시 일관된 버전 관리 정책을 유지하는 데 도움이 됩니다.
보통 package.json 안의 version 필드를 수정해서 버전관리를 합니다.
왜 우리는package.json을 수정 하지 않으려 했을까?
우리 팀의 빌드 코드에는 package.json이 변경되면 의존성을 다시 설치하는 코드가 있습니다.
이런 구조에서는 단순히 버전 번호만 바뀌어도 install을 합니다.
그래서 버전 번호는 관리하되, package.json은 건드리지 않는 방법이 필요했습니다.
그래서 어떻게 해결했을까?
Semantic Release는 version 정보를 반드시 package.json에 저장하지 않아도 동작할 수 있습니다.
다음과 같은 방법으로 대체 파일을 사용해보았습니다.
semantic-release 폴더 생성 후 아래 3개의 파일 생성
•
semantic-release.sh (release.json 파일에서 버전을 읽어서 변수에 저장)
import * as fs from 'fs';
import * as path from 'path';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const releaseConfigPath = path.join(__dirname, 'release.json');
const config = JSON.parse(fs.readFileSync(releaseConfigPath, 'utf-8'));
const version = config.version;
process.env.VERSION = version;
JavaScript
복사
•
release.json (package.json 대신 사용할 버전관리 파일)
{ "version": "1.13.0" }
JSON
복사
•
read-next-version.js (받은 버전으로 다음 버전을 적용)
#!/bin/bash
# 전달받은 버전
version=$1
releasePath=semantic-release/release.json
# 버전과 커밋 메시지를 출력 (디버깅용)
echo "Next release version: $version"
# release.json 파일에 버전과 메시지 저장
echo "{ \"version\": \"$version\" }" > $releasePath
# 변경 사항이 있는지 확인 (디버깅용)
git status
# release.json을 Git에 스테이징
git add $releasePath
# 변경 사항이 잘 스테이징 되었는지 확인 (디버깅용)
git status
# 커밋 메시지와 함께 커밋
git commit -m "🔖 The version has been updated automatically. [$version]"
# Git에 푸시
git push origin $(git rev-parse --abbrev-ref HEAD)
# 이미 만들어진 태그를 무시하고 새로 생성
git tag -f v${version}
# 강제 태그 부여
git push -f origin v${version}
Bash
복사
package.json아래에 설정할 내용
{
"release": {
"branches": [
"develop"
],
"publish": [
{
"path": "@semantic-release/exec",
"cmd": "node semantic-release/read-next-version.js"
},
{
"path": "@semantic-release/exec",
"cmd": "semantic-release/semantic-release.sh ${nextRelease.version}"
}
],
"plugins": [
"@semantic-release/commit-analyzer"
]
},
}
TypeScript
복사
이렇게 하면 package.json은 그대로 유지되면서도 버전 정보는 별도로 관리할 수 있게 됩니다.
다른 대안은 없을까?
물론, 버전 파일을 만들지 않고도 빌드 스크립트 쪽에서 package.json.version을 무시하도록 코드를 수정하는 방법도 있지만, 이런 기능이 있다는것을 공유 드리고 싶어서 작성했습니다.
나에게 새로운 정보가 누군가에게 진부한 정보 일지라도,
나에게 진부한 정보가 누군가에게는 새로운 정보가 되기를 바라며