113 lines
4.8 KiB
Markdown
113 lines
4.8 KiB
Markdown
# DJB 커스텀 소스 납품본 수집
|
|
|
|
발주사 납품용으로, 기준 시점 이후 **신규로 추가된 커스텀 소스 파일**만 모아
|
|
디렉터리 구조를 유지한 채 한곳에 복사하고 `MANIFEST.csv` / `SUMMARY.md` / zip 을 만든다.
|
|
|
|
## 파일
|
|
|
|
| 파일 | 용도 |
|
|
|---|---|
|
|
| `export-custom.sh` | macOS / Linux 실행 스크립트 |
|
|
| `export-custom.ps1` | Windows PowerShell 실행 스크립트 (실제 로직) |
|
|
| `export-custom.bat` | Windows cmd 래퍼 — 인자를 `.ps1` 로 그대로 전달 |
|
|
| `modules.conf` | 대상 모듈 / 소스 경로 / 수집 확장자 |
|
|
| `export-filter.rules` | 포함·제외 규칙 (`.gitignore` 유사 문법) |
|
|
| `filelist.txt` | 마지막으로 뽑은 수집 대상 목록 (검토용, 재생성 가능) |
|
|
| `filelist-no-djb-marker.txt` | 그중 `djb` / `custom` 마커가 **없는** 파일 — 업그레이드 유입분 검토 대상 |
|
|
|
|
## 수집 방식
|
|
|
|
1. 모듈별로 **컷오프 날짜 직전의 마지막 커밋**을 base 로 잡는다.
|
|
`git rev-list -1 --before=<CUTOFF> HEAD`
|
|
컷오프 이전 커밋이 아예 없으면 저장소 전체를 신규로 본다.
|
|
2. `git diff --name-only --diff-filter=A -M <base> HEAD -- <소스경로>` 로
|
|
**신규 추가(A)** 파일만 뽑는다. `-M` 이라 단순 rename 은 신규로 잡히지 않는다.
|
|
3. `modules.conf` 의 확장자 allowlist 로 거른다. (확장자 없는 파일은 제외)
|
|
4. `export-filter.rules` 로 포함·제외를 최종 결정한다.
|
|
5. 남은 파일을 `<out>/src/<모듈>/<원래 경로>` 로 복사한다.
|
|
|
|
## 사용법
|
|
|
|
```bash
|
|
# macOS / Linux
|
|
./export-custom.sh --dry-run > filelist.txt # 목록만 뽑기 (로그는 stderr)
|
|
./export-custom.sh --show-excluded # 규칙에 걸려 빠진 목록 + 걸린 규칙
|
|
./export-custom.sh # 실제 수집
|
|
./export-custom.sh --zip # 수집 + zip
|
|
./export-custom.sh -c 2026-05-01 -m eapim-portal
|
|
```
|
|
|
|
```powershell
|
|
# Windows
|
|
.\export-custom.ps1 -DryRun > filelist.txt
|
|
.\export-custom.ps1 -ShowExcluded
|
|
.\export-custom.ps1 -Zip
|
|
.\export-custom.ps1 -Cutoff 2026-05-01 -Module eapim-portal,eapim-admin
|
|
|
|
# cmd 에서
|
|
export-custom.bat -DryRun > filelist.txt
|
|
```
|
|
|
|
### 주요 옵션
|
|
|
|
| sh | ps1 | 설명 |
|
|
|---|---|---|
|
|
| `-c, --cutoff` | `-Cutoff` | 기준 날짜 (기본 `2026-05-01`) |
|
|
| `-r, --root` | `-Root` | 저장소 루트. 미지정 시 스크립트 위치 기준 자동 탐지 |
|
|
| `-o, --out` | `-Out` | 출력 디렉터리 (기본 `<root>/build/djb-custom-export`) |
|
|
| `-m, --module` | `-Module` | 특정 모듈만 |
|
|
| `--zip` | `-Zip` | zip 생성 |
|
|
| `--include-untracked` | `-IncludeUntracked` | 미커밋 신규 파일도 포함 |
|
|
| `--dry-run` | `-DryRun` | 복사 없이 목록만 |
|
|
| `--show-excluded` | `-ShowExcluded` | 규칙에 걸려 빠진 목록 |
|
|
|
|
## `export-filter.rules` 문법
|
|
|
|
`.gitignore` 와 비슷하되 더 단순하다.
|
|
|
|
- 한 줄에 패턴 하나. `#` 주석, 빈 줄 무시
|
|
- 기본은 **모두 포함**. 패턴에 걸리면 제외
|
|
- `!` 로 시작하면 예외(다시 포함)
|
|
- **뒤에 오는 규칙이 앞 규칙을 덮는다** — 순서가 중요하다
|
|
- 패턴에 `/` 가 있으면 `<모듈>/<경로>` 전체와 매칭, 없으면 파일명만 매칭
|
|
- `/` 로 끝나면 그 디렉터리 하위 전체
|
|
- `*` 는 `/` 도 포함해 매칭한다 (단순 glob, `**` 없음)
|
|
|
|
매칭 대상 경로 예:
|
|
|
|
```
|
|
eapim-portal/src/main/java/com/eactive/apim/portal/djb/webhook/WebhookService.java
|
|
eapim-admin/WebContent/jsp/onl/apim/webhook/webhookList.jsp
|
|
```
|
|
|
|
규칙 파일은 세 구역으로 나뉜다.
|
|
|
|
1. **업그레이드 유입분 제외** — `filelist-no-djb-marker.txt` 를 검토하며 채운다
|
|
2. **`!*djb*` 예외** — djb 마커가 붙은 파일은 커스텀이므로 되살린다
|
|
3. **무조건 제외** — 빌드 산출물·서드파티. 2)보다 뒤에 있어 최종 승리한다
|
|
|
|
## 신규지만 커스텀이 아닌 파일 걸러내기
|
|
|
|
신규 파일이라도 제품 업그레이드로 딸려 온 것일 수 있다. 판별 순서:
|
|
|
|
```bash
|
|
# 1) 전체 목록
|
|
./export-custom.sh --dry-run > filelist.txt
|
|
|
|
# 2) djb / custom 마커가 없는 것 = 검토 대상
|
|
grep -vi djb filelist.txt | grep -v '/custom/' > filelist-no-djb-marker.txt
|
|
|
|
# 3) 검토 후 업그레이드 유입분을 export-filter.rules 의 1) 구역에 추가
|
|
|
|
# 4) 반영 확인
|
|
./export-custom.sh --show-excluded
|
|
```
|
|
|
|
## 주의
|
|
|
|
- 컷오프 이전 커밋이 없으면 base 가 **빈 트리**가 되어 저장소 전체가 신규로 잡힌다.
|
|
`SUMMARY.md` 의 base 컬럼에 `(컷오프 이전 커밋 없음 …)` 으로 표시된다.
|
|
- 모듈에 컷오프 직전 커밋이 드문드문 있으면 base 가 컷오프보다 훨씬 이전으로 잡힐 수 있다.
|
|
실행 로그의 `base:` 날짜를 항상 확인할 것.
|
|
- 추가된 뒤 삭제·이동된 파일은 현재 트리에 없으므로 건너뛰고, 건수를 `SUMMARY.md` 에 남긴다.
|