From 8231318f1410f83e1e6e457f236b2c6618c738c9 Mon Sep 17 00:00:00 2001 From: curry772 Date: Thu, 23 Jul 2026 11:44:35 +0900 Subject: [PATCH] =?UTF-8?q?version=20info=20=EC=83=9D=EC=84=B1=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + build.gradle | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/.gitignore b/.gitignore index 4a8f7f6..e1e6c23 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ gradle.properties src/main/generated WebContent/generated +src/main/resources/version.info # Eclipse # .metadata diff --git a/build.gradle b/build.gradle index 0f815bb..ef60f70 100644 --- a/build.gradle +++ b/build.gradle @@ -172,6 +172,54 @@ task initDirs() { file(generatedJavaDir).mkdirs() } +// version.info 를 classpath 리소스로 생성해 WAR의 WEB-INF/classes에 포함시킨다. +// elink-online-common 등 공유 라이브러리 모듈이 아니라, 실제 배포 아티팩트(eapim-online.war)를 +// 만드는 이 루트 프로젝트에서 생성해야 "지금 배포된 게이트웨이가 정확히 어느 커밋인지"를 +// eapim-online 소스 변경 여부와 무관하게 항상 최신으로 반영한다. +// ToolsController(/manage/tools/version, elink-online-common 모듈)는 이 파일을 +// Class.getResourceAsStream("/version.info")로 읽는데, WAR는 WEB-INF/classes와 +// WEB-INF/lib 전체가 하나의 클래스로더를 공유하므로 어느 모듈의 클래스에서 조회하든 찾을 수 있다. +// +// elink-online-common/elink-online-core/... 는 별도 저장소를 참조하는 git submodule이라 +// 루트(eapim-online)의 describe/dirty 만으로는 "어느 서브모듈이 바뀌었는지"를 알 수 없다 +// (서브모듈 포인터가 커밋되고 나면 루트는 다시 clean 해져서 -dirty 흔적도 사라진다). +// 그래서 서브모듈 각각에 대해서도 describe를 실행해 module.<이름>=<결과> 형식으로 함께 기록한다. +def describeGit(File dir) { + try { + def proc = "git describe --tags --always --dirty".execute(null, dir) + // proc.text는 JVM/OS 기본 charset(Windows 환경에선 CP949 등)으로 stdout을 디코딩한다. + // git 태그명은 UTF-8 바이트이므로 기본 charset이 UTF-8이 아니면 여기서 한글이 깨진다. + // stream을 명시적으로 UTF-8로 읽어서 이 문제를 피한다. + def output = proc.inputStream.getText("UTF-8") + proc.waitFor() + return (proc.exitValue() == 0) ? output.trim() : "unknown" + } catch (Exception e) { + logger.warn("${dir} git describe 실행 불가, unknown 으로 대체: ${e.message}") + return "unknown" + } +} + +task generateVersionInfo { + doLast { + def gitVersion = describeGit(projectDir) + + def sb = new StringBuilder() + sb.append("version=${gitVersion}\n") + sb.append("buildTime=${new Date().format("yyyy-MM-dd HH:mm:ss")}\n") + subprojects.sort { it.name }.each { sub -> + if (file("${sub.projectDir}/.git").exists()) { + sb.append("module.${sub.name}=${describeGit(sub.projectDir)}\n") + } + } + + def versionInfoFile = file("$projectDir/src/main/resources/version.info") + versionInfoFile.parentFile.mkdirs() + versionInfoFile.write(sb.toString(), "UTF-8") + } +} + +processResources.dependsOn generateVersionInfo + eclipse { wtp { component {