배포 자동화
3. 코드 예제
예제 1: 환경별 설정과 빌드 — 01_deploy.sh 발췌
# application-dev.properties 내용은 2.3 참고
diff config/application-dev.properties config/application-prod.properties
"$JAVA_BIN/javac" -encoding UTF-8 -d out src/Main.java
"$JAVA_BIN/jar" --create --file dist/app.jar --main-class Main -C out .
"${JRUN[@]}" -Dapp.env=dev -jar dist/app.jar환경별 설정 차이 (dev vs prod):
1,3c1,3
< app.port=8080
< db.url=jdbc:h2:mem:devdb
< log.level=DEBUG
---
> app.port=8443
> db.url=jdbc:postgresql://prod-db:5432/app
> log.level=WARN
빌드 완료: dist/app.jar
앱 시작 (env=dev)diff 결과의 < 는 dev, > 는 prod 쪽 줄입니다. 빌드는 04 레슨과 같은 방식이고, app.env 시스템 프로퍼티로 실행 환경을 넘깁니다.
예제 2: 헬스체크로 배포 차단 — 01_deploy.sh 발췌
# releases/2 는 status.flag 에 BAD 를 심어 헬스체크가 실패하게 만듦
if "${JRUN[@]}" -Dapp.env=dev -jar "releases/2/app.jar" \
--health "releases/2/status.flag"; then
echo 2 > current
else
echo "배포 차단: current 는 그대로입니다."
fi-- 릴리스 1 배포 시작 (env=dev) --
헬스체크 OK (env=dev)
전환 완료: current -> 1
-- 릴리스 2 배포 시작 (env=dev) --
헬스체크 FAIL (env=dev)
배포 차단: current 는 그대로입니다.
현재 활성 릴리스: 1릴리스 1 은 헬스체크를 통과해 current 가 1 로 바뀝니다. 릴리스 2 는 status.flag 에 BAD 를 심어 헬스체크가 실패하게 만들었고, current 는 1 에 그대로 머뭅니다.
예제 3: 정상 재배포와 수동 롤백 — 01_deploy.sh 발췌
deploy_release 3 dev OK
echo "운영 중 릴리스 3 에서 문제를 발견해 이전 릴리스로 되돌립니다."
PREV=1
echo "$PREV" > current
echo "롤백 완료: current -> $(cat current)"-- 릴리스 3 배포 시작 (env=dev) --
헬스체크 OK (env=dev)
전환 완료: current -> 3
운영 중 릴리스 3 에서 문제를 발견해 이전 릴리스로 되돌립니다.
롤백 완료: current -> 1
releases 폴더 목록:
1
2
3릴리스 3 은 헬스체크를 통과해 정상 전환됩니다. 이후 배포 시점에는 몰랐던 문제가 운영 중 발견됐다고 가정해 current 를 1 로 되돌렸고, releases 폴더에는 세 릴리스가 모두 남아 있어 원인 분석이 가능합니다.
예제 4: 원격 배포 명령과 systemd — 01_deploy.sh 발췌
cat <<'EOF'
scp dist/app.jar deploy@prod-1:/opt/app/releases/12/app.jar
ssh deploy@prod-1 "java -jar /opt/app/releases/12/app.jar --health \
/opt/app/releases/12/status.flag && \
echo 12 > /opt/app/current && \
sudo systemctl restart app.service"
EOFscp dist/app.jar deploy@prod-1:/opt/app/releases/12/app.jar
scp config/application-prod.properties \
deploy@prod-1:/opt/app/releases/12/application.properties
ssh deploy@prod-1 "java -jar /opt/app/releases/12/app.jar --health \
/opt/app/releases/12/status.flag && \
echo 12 > /opt/app/current && \
sudo systemctl restart app.service"실제 서버가 없어 이 명령은 실행하지 않고 텍스트로만 보여줍니다. 헬스체크가 성공해야 && 뒤의 전환·재시작 명령이 이어지는 구조는 로컬 스크립트와 같습니다.