Skip to content

jihooooo6/svn-commit-extractor

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

svn-commit-extractor

SVN 커밋(리비전) 단위로 변경 파일을 추출해 운영 반영용 ZIP으로 묶어주는 작은 웹 도구. "이번 핫픽스에 들어가는 파일만 모아서 zip으로 주세요" 같은 상황을 손 작업 없이 자동화한다.

왜 만들었나

운영 환경에 손으로 파일 반영을 해야 하는 레거시 SI 환경에서는 매번 같은 작업을 반복한다.

  • 어느 리비전들이 이번 반영 대상인가
  • 그 리비전들의 변경 파일 목록을 일일이 확인
  • 각 파일을 워킹 카피에서 골라 zip 으로 묶기
  • 빌드까지 되면 .class 도 같이 묶기

이걸 SVN 리비전 번호 몇 개와 프로젝트명만 입력하면 끝나도록 만든 결과다.

핵심 기능

  • 리비전별 변경 파일 자동 추출 — 단일·범위·콤마 조합 모두 지원
    • 단일: 12345
    • 범위: 12340~12345
    • 조합: 12340~12345,12350,12360
  • Maven 빌드 자동 시도
    • 성공: 컴파일된 .class 파일로 ZIP 구성 (운영 반영 즉시 가능)
    • 실패: 소스 파일(.java / .xml / .jsp / 기타)을 타입별로 분류해서 ZIP
  • 변경 파일 경로 목록(file_list.txt) 자동 생성
  • 삭제(D) 타입 파일은 제외 — 운영에 반영할 일 없음
  • 같은 파일이 여러 리비전에 걸쳐 있으면 가장 최신 리비전 유지

스펙

항목 내용
프레임워크 Spring Boot 2.7.18
Java 8
SVN 라이브러리 SVNKit 1.10.11
Maven 실행 maven-invoker 3.2.0
템플릿 Thymeleaf, Bootstrap 5.3
기본 포트 8080

시작하기

1. SVN 서버 주소 설정

src/main/resources/application.yml을 본인 환경에 맞게 수정.

svn:
  base-url: svn://your-svn-server/svn/

maven:
  home: ${MAVEN_HOME:}      # 환경변수 MAVEN_HOME 또는 application.yml에 직접

app:
  temp-dir: ${java.io.tmpdir}/svn-extractor

2. 빌드·실행

mvn clean package -DskipTests
java -jar target/svn-extractor-1.0.0.jar

브라우저에서 http://localhost:8080 접속.

사용 흐름

  1. 화면에서 SVN 사용자명/비밀번호 입력
  2. 프로젝트명 입력 (SVN 저장소 루트 하위 폴더명)
  3. 리비전 입력 (단일·범위·조합 자유)
  4. 추출하기 클릭
  5. ZIP 자동 다운로드

API 직접 호출

curl -X POST http://localhost:8080/api/extract \
  -H "Content-Type: application/json" \
  -d '{
    "username": "svn_user",
    "password": "svn_pass",
    "projectName": "my-project",
    "revision": "12345"
  }' \
  --output result.zip

ZIP 구조

Maven 빌드 성공

프로젝트명/
├── com/
│   └── example/
│       └── *.class
└── ...

Maven 빌드 실패 시 — 타입별 분류

프로젝트명/
├── file_list.txt      # 변경 파일 경로 목록
├── java/              # .java 파일
├── xml/               # .xml 파일
├── jsp/               # .jsp 파일
└── other/             # 기타 파일

구조

controller/ExtractController.java   # REST + 메인 페이지
service/
  SvnService.java                   # SVN 연동 (SVNKit, export 기반)
  BuildService.java                 # Maven 빌드 (maven-invoker)
  PackageService.java               # 파일 분류 + ZIP 생성
dto/
  ExtractRequest.java               # 요청 DTO
  ExtractResult.java                # 결과 DTO

디자인 결정 메모

  • **체크아웃이 아닌 svn export**를 쓴다. 워킹 카피 폴더(.svn)를 만들지 않으므로 정리 비용이 없다.
  • pom.xml만 HEAD 리비전으로 덮어쓰는 트릭 — 빌드에 필요한 의존성·플러그인 최신 정의를 받기 위해. 변경 리비전에 pom.xml이 없어도 빌드가 가능하다.
  • 각 변경 파일은 자기 리비전으로 가져온다. 단순히 HEAD로 가져오면 다른 리비전에 들어간 동일 파일까지 섞여 들어와서 사고가 난다.

운영 메모

  • application-prod.yml은 본 저장소에 포함하지 않았다. 운영 환경에서 직접 작성해서 사용.
  • 운영 서비스에 띄우는 경우 SVN 인증 정보가 평문으로 흐르지 않도록 HTTPS 종단(리버스 프록시) 뒤에 두는 것을 권장한다.
  • 임시 작업 디렉토리(app.temp-dir)는 ZIP 응답 직후 자동 정리된다.

보안

  • 인증 정보(사용자명/비밀번호)는 요청 파라미터로만 전달되고 서버에 저장하지 않는다.
  • 내부망 사용 전제로 만들어졌다. 외부 노출 시에는 인증 레이어를 앞단에 추가하라.

라이선스

MIT.

About

SVN 리비전별 변경 파일을 추출해 운영 반영용 ZIP으로 묶어주는 Spring Boot 웹 도구 (SVNKit + Maven Invoker)

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors