version-management

GitHub Actions 기반 중앙 배포형 “자동 버전 관리 + 릴리스 생성” (Spring Boot · Next.js · Plain 지원)
기본 브랜치(main)에서 규칙에 맞는 커밋이 푸시되면 버전 증가 → 프로젝트 파일 동기화 → CHANGELOG 갱신 → Git Tag 생성/푸시 → GitHub Release 생성(자동 노트)를 표준화된 방식으로 수행합니다.
또한 버전이 실제로 증가했을 때만 repository_dispatch 이벤트를 보내 후속 워크플로우(예: apk-build.yml)를 조건부로 트리거합니다.

English versionREADME.en.md


🚀 핵심 기능


📦 저장소 구조

version-management/
├─ action.yml                        # 컴포지트 액션 엔트리 (직접 사용 가능)
├─ scripts/
│  ├─ compute-bump.mjs               # 커밋 검사 + 버전 계산
│  ├─ sync-files.mjs                 # 파일 동기화 + 커밋 (spring/next/plain)
│  ├─ update-changelog.mjs           # CHANGELOG prepend (+ 최초 배너)
│  └─ create-tag.mjs                 # 태그 생성/푸시 + 릴리즈 커밋 정리
└─ .github/
   └─ workflows/
      └─ auto-version.yml            # 재사용(Workflow Call) 오케스트레이터

왜 분리했나요?
재사용 워크플로는 권한/동시성/디스패치/릴리스 생성 등 파이프라인 오케스트레이션을 담당하고,
컴포지트 액션은 실제 로직(버전계산/파일수정/체인지로그/태깅) 을 패키징해서 어디서든 재사용할 수 있게 합니다.


🧭 빠른 시작 (소비자 레포)

1) 중앙 재사용 워크플로 전체 사용 (권장)

소비자 레포: .github/workflows/chuseok22-version-management.yml

name: Version Management (from chuseok22/version-management)

on:
  push:
    branches: [ main ]
  workflow_dispatch:

permissions:
  contents: write
  actions: read

jobs:
  chuseok22-version-bump:
    uses: chuseok22/version-management/.github/workflows/auto-version.yml@v1
    with:
      project_type: "auto"                 # spring | next | plain | auto
      default_branch: "main"
      tag_prefix: "v"
      default_version: "0.0.0"
      next_constants_path: "src/constants/version.ts"  # Next.js만 대상
      sync_app_yaml: "false"               # Spring application.yml version 치환
      workdir: ""                          # 모노레포면 "backend"/"web" 등 하위 경로
      dispatch_on_bump: "true"             # 버전 증가시에만 후속 트리거
      dispatch_event_type: "version-bumped"
      plain_version_file: "VERSION"        # Plain 프로젝트일 때 버전 파일 경로

      # 릴리스 옵션 (워크플로 설정에 따라 사용)
      create_release: "true"               # 버전 증가 시 릴리스 생성
      release_latest: "true"               # 최신 릴리스로 표시
      release_prerelease: "false"          # 프리릴리스로 표시(예: M1, RC)

2) (고급) 기존 CI에서 로직만 사용

원하는 Job에서 컴포지트 액션을 직접 호출합니다.

jobs:
  some-job:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with: { fetch-depth: 0 }
      - uses: actions/setup-node@v4
        with: { node-version: 20 }

      - name: Version bump only
        uses: chuseok22/version-management@v1
        with:
          project_type: auto
          default_branch: main
          tag_prefix: v
          default_version: 0.0.0
          next_constants_path: src/constants/version.ts
          sync_app_yaml: "false"
          workdir: ""
          plain_version_file: VERSION

✍️ 커밋 규칙 (필수)

커밋 제목(subject) 으로 판정합니다.

예시:

version(major): drop legacy API
version(minor): add CSV export
version(patch): fix null check

⚙️ 입력 파라미터 (요약)

재사용 워크플로 .github/workflows/auto-version.yml (on: workflow_call)

입력 기본값 설명
project_type auto spring | next | plain | auto(자동 탐지: package.json → next, build.gradle → spring, 그 외 → plain)
default_branch main 이 브랜치에서만 버전 증가 처리
tag_prefix v 태그 접두어 (예: v1.2.3)
default_version 0.0.0 최초 태그/파일 모두 없을 때 시드 버전
next_constants_path src/constants/version.ts Next.js 상수 파일 경로
sync_app_yaml false Spring src/main/resources/application.ymlversion: 키 치환(존재 시)
workdir "" 모노레포 하위 경로 (예: backend, web)
dispatch_on_bump true 버전 증가시에만 repository_dispatch 송신
dispatch_event_type version-bumped 후속 워크플로에서 수신할 이벤트 타입
plain_version_file VERSION Plain 프로젝트의 버전 파일 경로(없으면 생성, 있으면 내용 전체를 새 버전 한 줄로 치환)
create_release true 버전 증가 시 GitHub Release 생성 여부
release_latest true 생성된 릴리스를 최신으로 표시
release_prerelease false 프리릴리스로 표시 (M1/RC 등)

컴포지트 액션(action.yml)도 동일/유사 입력을 받습니다.


🧩 CHANGELOG 정책

배너(예시):

<!-- vm-banner-start -->
🔧 **Version Management 자동 변경 이력**

이 파일은 중앙 배포 워크플로(**Version Management**)가 자동 생성·유지합니다.
This file is automatically generated and maintained by the centralized workflow (**Version Management**).
제작자(Author): **Chuseok22** · https://github.com/Chuseok22
워크플로 저장소(Workflow repository): https://github.com/Chuseok22/version-management

※ 절대로 이 파일을 임의로 수정하지 마세요
※ Do not edit this file manually.
<!-- vm-banner:end -->

🔒 권한 & 요구사항


만든 사람: Chuseok22 · 저장소: https://github.com/Chuseok22/version-management