홈 › CI/CD › 04 / 7

빌드 산출물과 버전

섹션 7진행 0 / 7

3. 코드 예제

예제 1: VERSION 파일과 실행 가능 jar 생성 — 01_build_artifact.sh 발췌

bash
echo "1.2.0" > VERSION
VER=$(cat VERSION)
cat > MANIFEST.MF <<EOF
Implementation-Title: app
Implementation-Version: $VER
EOF
"$JAVA_BIN/jar" --create --file "dist/app-$VER.jar" \
  --main-class Main --manifest=MANIFEST.MF \
  --date=2026-01-05T09:00:00+09:00 -C out .
"$JAVA_BIN/java" -jar "dist/app-$VER.jar"
text
VERSION 파일 내용: 1.2.0
산출물 이름: dist/app-1.2.0.jar (app-<버전> 규칙)
결과: 30

VERSION 파일 값을 읽어 매니페스트와 파일 이름에 그대로 넣었습니다. java -jar 로 실행되는 것으로 Main-Class 가 제대로 들어갔음을 확인합니다.

예제 2: 매니페스트 내용 확인 — 01_build_artifact.sh 발췌

bash
mkdir -p check
(cd check && "$JAVA_BIN/jar" xf "../dist/app-$VER.jar" META-INF/MANIFEST.MF)
cat check/META-INF/MANIFEST.MF
text
Manifest-Version: 1.0
Implementation-Title: app
Implementation-Version: 1.2.0
Created-By: 21.0.8 (Oracle Corporation)
Main-Class: Main

jar xf 로 산출물 안의 매니페스트만 꺼내 확인했습니다. Implementation-Version·Main-Class 가 원하는 값으로 들어가 있는지 이렇게 검사할 수 있습니다.

예제 3: 재현 가능한 빌드 확인 — 01_build_artifact.sh 발췌

bash
"$JAVA_BIN/jar" --create --file rebuild.jar \
  --main-class Main --manifest=MANIFEST.MF \
  --date=2026-01-05T09:00:00+09:00 -C out .
H1=$(sha256sum "dist/app-$VER.jar" | awk '{print $1}')
H2=$(sha256sum rebuild.jar | awk '{print $1}')
[ "$H1" = "$H2" ] && echo "재현 결과: 동일한 해시"
text
재현 결과: 동일한 해시 (SHA-256 229f342724e019e765b2561bc8d15b61c87fd55aa61b40c8b74435754d028a62)
--date 없는 빌드: 해시 다름 (빌드 시각이 jar 에 섞여 들어감)

같은 out/ 클래스에서 --date 를 고정해 두 번 빌드하니 해시가 완전히 같았습니다. 스크립트는 이어서 --date 없이 두 번 빌드해 보고, 이번에는 해시가 다름도 함께 확인합니다.

예제 4: 체크섬 생성과 손상 탐지 — 01_build_artifact.sh 발췌

bash
(cd dist && sha256sum "app-$VER.jar" > "app-$VER.jar.sha256")
(cd dist && sha256sum -c "app-$VER.jar.sha256")
cp "dist/app-$VER.jar" dist/corrupt.jar
printf 'X' >> dist/corrupt.jar
text
229f342724e019e765b2561bc8d15b61c87fd55aa61b40c8b74435754d028a62 *app-1.2.0.jar
app-1.2.0.jar: OK
검증 결과: 실패 감지 (손상된 파일을 정상적으로 걸러냄)

정상 파일은 OK 를 받았습니다. 파일 끝에 바이트 하나를 더 붙여 일부러 손상시킨 뒤 같은 방식으로 검증하면 실패가 감지됩니다. 전송 중 한 바이트만 깨져도 체크섬이 이를 잡아낸다는 뜻입니다.