9.8 KiB
9.8 KiB
Changelog 규칙 (Changelog Rules)
코어 및 확장(모듈, 플러그인, 템플릿)의 변경사항을 CHANGELOG.md에 기록하는 규정
TL;DR (5초 요약)
1. 확장/코어 버전 업 시 CHANGELOG.md에 변경사항 기록 필수 (미기록 시 버전 업 불가)
2. 형식: Keep a Changelog 표준 (## [버전] - 날짜 / ### 카테고리 / - 항목)
3. 허용 카테고리: Added, Changed, Deprecated, Removed, Fixed, Security
4. 확장 위치: 각 확장의 루트 디렉토리 (modules/_bundled/vendor-module/CHANGELOG.md)
5. 코어 위치: 프로젝트 루트 /CHANGELOG.md (코어 버전 변경 시 필수)
목차
1. CHANGELOG.md 작성 규칙
필수 사항
확장 버전 업 시 CHANGELOG.md에 변경사항 기록 필수
미기록 시 버전 업 작업 불완전으로 간주
릴리스 태깅 전 composer test-smoke 통과 필수 (Installation 스위트)
- 형식: Keep a Changelog 표준 준수
- 버전 관리: Semantic Versioning 준수
- 작성 언어: 한국어 (확장 대상이 한국어 사용자)
- 날짜 형식: YYYY-MM-DD (ISO 8601)
- 최신 버전: 파일 상단에 위치 (역순)
릴리스 전 Smoke Suite 통과
코어 또는 번들 확장의 버전 bump 시 다음을 충족해야 합니다:
# 릴리스 전 필수 검증
composer test-smoke
# 첫 실패에서 중단 (CI 모드)
composer test-smoke-ci
composer test-smoke는tests/Feature/Installation/및 각 번들 확장의tests/Feature/Installation/디렉토리를 실행합니다.- 스모크 통과 없이 릴리스 태깅을 진행하면 beta.2 #12 유형(마이그레이션–Repository 결합 누락) 회귀를 놓칠 수 있습니다.
- 상세: testing-guide.md#pre-release-smoke-suite
버전 섹션 형식
## [버전] - YYYY-MM-DD
예: ## [0.1.2] - 2026-02-25
항목 형식
### 카테고리
- 변경사항 설명
2. 카테고리 정의
| 카테고리 | 설명 | 사용 시점 |
|---|---|---|
Added |
새 기능 추가 | 새로운 기능, 화면, API 엔드포인트 추가 |
Changed |
기존 기능 변경 | 기존 동작 수정, 성능 개선, UI 변경 |
Deprecated |
향후 제거 예정 | 향후 삭제될 기능 경고 |
Removed |
기능 제거 | 기존 기능/API 삭제 |
Fixed |
버그 수정 | 기존 버그, 오류 수정 |
Security |
보안 취약점 수정 | 보안 관련 수정 |
3. 파일 위치
확장 (모듈/플러그인/템플릿)
modules/_bundled/vendor-module/CHANGELOG.md # 모듈 (예: sirsoft-board)
plugins/_bundled/vendor-plugin/CHANGELOG.md # 플러그인 (예: sirsoft-tosspayments)
templates/_bundled/vendor-template/CHANGELOG.md # 템플릿 (예: sirsoft-admin_basic)
- _bundled 디렉토리에서 작업 (활성 디렉토리 직접 수정 금지)
- 업데이트 프로세스를 통해 활성 디렉토리로 복사
코어
/CHANGELOG.md # 프로젝트 루트
- 코어 버전 변경 시 CHANGELOG.md에 변경사항 기록 필수 (미기록 시 버전 업 불가)
- 확장과 동일한 Keep a Changelog 형식 사용
- 코어 버전 변경 대상 파일:
config/app.php,.env.example,.env.testing - 버전 변경 시 반드시 CHANGELOG.md에 해당 버전 섹션 추가 후 버전 파일 수정
4. ChangelogParser 헬퍼
파일: app/Extension/Helpers/ChangelogParser.php
주요 메서드
| 메서드 | 설명 | 반환 |
|---|---|---|
parse(string $filePath) |
CHANGELOG.md 전체 파싱 | array (버전별 구조화 배열) |
getVersionRange(string $filePath, string $from, string $to) |
특정 범위 엔트리 추출 | array (from 초과 ~ to 이하) |
resolveChangelogPath(string $basePath, string $identifier, ?string $source) |
소스별 경로 결정 | ?string |
반환 형식
[
[
'version' => '0.1.2',
'date' => '2026-02-25',
'categories' => [
['name' => 'Added', 'items' => ['새 기능 A']],
['name' => 'Fixed', 'items' => ['버그 B 수정']],
],
],
]
5. API 엔드포인트
GET /api/admin/modules/{identifier}/changelog
GET /api/admin/plugins/{identifier}/changelog
GET /api/admin/templates/{identifier}/changelog
쿼리 파라미터
| 파라미터 | 설명 | 기본값 |
|---|---|---|
source |
CHANGELOG.md 읽을 위치 | active |
from_version |
이 버전 초과 항목만 반환 | - |
to_version |
이 버전 이하만 반환 | - |
사용 시나리오
- 상세 모달:
GET .../changelog(전체 조회) - 업데이트 모달:
GET .../changelog?source=bundled&from_version=0.1.1&to_version=0.1.2(변경분)
6. 관리 화면 표시
업데이트 모달
- 전역 상태:
_global.updateChangelog(3개 확장 타입 공통) - 표시 조건:
updateChangelog && updateChangelog.length > 0 - 표시 위치: 버전 정보 아래, 외부 링크(github_changelog_url) 위
- 스타일: blue 배경 (
bg-blue-50 dark:bg-blue-900/20) - 우선순위: 인라인 changelog > 외부 링크 (둘 다 있으면 둘 다 표시)
상세 모달
- 전역 상태:
_global.moduleChangelog,_global.pluginChangelog,_global.templateChangelog(타입별) - 섹션 ID:
changelog_section - 아이콘:
clock-rotate-left - empty state:
_global.xxxChangelog가 비어있으면 "변경 내역 정보가 없습니다." 표시
메인 리스트 액션 흐름
# 업데이트 버튼 클릭 시:
setState(selectedX) → apiCall(changelog?source=bundled&from_version=...&to_version=...)
→ onSuccess: setState(updateChangelog) + openModal(update_modal)
→ onError: setState(updateChangelog=[]) + openModal(update_modal)
# 상세 보기 버튼 클릭 시:
setState(selectedX) → apiCall(changelog)
→ onSuccess: setState(xChangelog) + openModal(detail_modal)
→ onError: setState(xChangelog=[]) + openModal(detail_modal)
7. 템플릿 예시
새 확장을 만들 때 아래 템플릿을 사용합니다:
# Changelog
이 프로젝트의 모든 주요 변경사항을 기록합니다.
형식은 [Keep a Changelog](https://keepachangelog.com/ko/1.1.0/)를 따르며,
[Semantic Versioning](https://semver.org/lang/ko/)을 준수합니다.
## [0.1.0] - YYYY-MM-DD
### Added
- 초기 기능 구현
8. 코어 버전 제약 정책
확장 manifest(module.json, plugin.json, template.json)의 g7_version 과 dependencies.{modules|plugins} 버전 제약 작성 규칙.
표기 규칙
- 형식:
>=X.Y.Z[-prerelease]통일 (공백 없음). 예:>=7.0.0-beta.2,>=1.0.0-beta.2 - 캐럿(
^), 틸드(~), 엄격 일치(=) 사용 금지 - placeholder 금지: 실존하지 않는 버전(
0.1.0,0.0.1등) 을 적어 사실상 "아무 버전이나 허용" 상태로 두지 않음
g7_version — 코어 최소 요구 버전
- 확장이 실제로 의존하는 코어 API/기능의 최초 도입 버전을 최소값으로 기재
- 확장
version이 bump 될 때g7_version재검토 필수 - 번들 확장은 일반적으로 코어의 현재 릴리스와 같은 단계(beta.X, rc.X, X.Y.Z)를 하한으로 둠
- 예: 알림 시스템 3계층(NotificationDefinition/Template) 을 사용하는 모듈은 최소
>=7.0.0-beta.2
dependencies.{modules|plugins} — 확장 간 버전 제약
- A 확장이 B 확장의 공개 Service/Contract/Model/Route/훅을 사용한다면
dependencies.{type}.B: ">=X.Y.Z"기재 - B 에서 공개 표면이 변경되거나 새 API 가 도입되어 A 가 그것을 소비하게 되면 A 의 최소 버전 제약을 그 API 최초 도입 버전으로 상향
- 실존하지 않는 placeholder 버전(
>=0.1.0등)은 금지 — 버전 게이팅 무효화 유발
버전 제약 재검토 트리거
다음 이벤트 발생 시 관련 확장 manifest 를 전수 재검토한다.
| 이벤트 | 재검토 대상 |
|---|---|
| 코어 공개 확장 표면 변경 (AbstractModule/AbstractPlugin/HookManager/Contracts 등) | 모든 번들 확장의 g7_version |
| 코어 minor/major/beta 번호 변경 | 번들 확장 전체 g7_version |
| 번들 모듈/플러그인의 공개 Service/Contract/Model/Route/훅/CHANGELOG 변경 | 해당 확장을 dependencies 에 선언한 모든 확장 |
CHANGELOG 기재
g7_version상향:### Changed에- 코어 최소 요구 버전을 X.Y.Z 로 상향dependencies.{id}상향:### Changed에- {id} 의존성 버전 제약을 실제 릴리스 버전에 맞춰 정비또는- {id} 최소 버전을 X.Y.Z 로 상향(변경 이유에 따라)
관련 파일
app/Extension/Helpers/ChangelogParser.php— Changelog 파서app/Http/Requests/Extension/ChangelogRequest.php— FormRequest 검증app/Http/Controllers/Api/Admin/ModuleController.php—changelog()메서드app/Http/Controllers/Api/Admin/PluginController.php—changelog()메서드app/Http/Controllers/Api/Admin/TemplateController.php—changelog()메서드app/Services/ModuleService.php—getModuleChangelog()메서드app/Services/PluginService.php—getPluginChangelog()메서드app/Services/TemplateService.php—getTemplateChangelog()메서드