배포 스크립트 가이드 - KimGyuBek/Threadly GitHub Wiki
배포 과정에서 사용되는 스크립트 정리
| 스크립트 | 역할 |
|---|---|
build-deploy.sh |
배포 태그 생성 |
blue-green-deploy.sh |
무중단 배포 과정 수행 |
clean-old-images.sh |
구버전/미사용 Docker 이미지 정리 |
배포하는 이미지의 태그 생성
파일: build-deploy.sh
DATE=$(date +%Y%m%d) # 오늘 날짜 → 20250922
COMMIT=$(git rev-parse --short HEAD) # 현재 커밋 해시 앞 7자리 → a1b2c3d
IMAGE_TAG="${DATE}-${COMMIT}" # 조합 → 20250922-a1b2c3d- (날짜 + 현재 커밋 해시)의 조합으로 태그 생성
- 빌드 및 배포 과정에서 동일한 태그 사용
blue-green 방식의 무중단 배포 수행
1). Nginx 설정파일에서 현재 포트 조회
parse_current_port(){
local current_port
current_port=$(grep -Eo 'proxy_pass\s+http://[^:]+:([0-9]+);' "$NGINX_CONF" | awk -F: '{print $NF}' | tr -d ';' | tail -n1)
[[ -n "${current_port:-}" ]] || { error "NGINX proxy_pass 포트 파싱 실패: $NGINX_CONF"; exit 1; }
echo "$current_port"
}2). 새로운 버전 실행
compose_up(){
# ...
docker compose -f "$f" -p "$slot" up -d --build
# ...
}
compose_up "$NEXT"3). 새로운 버전 헬스 체크
health_check(){
local port="$1"
local url="http://localhost:${port}${HEALTH_PATH}"
# MAX_TRIES 만큼 반복
curl -fsS "$url" >/dev/null 2>&1;
}
health_check "$NEXT_PORT"4). 헬스 체크 성공 시 기존 버전 종료 및 Nginx 포트 변경
nginx_port_change(){
# ...
sudo sed -i "s/$current_port/$next_port/" "$NGINX_CONF"
# ...
}5). 무중단 배포 완료
[2025-09-13 22:33:42] [INFO ] ======Deploy start======
[2025-09-13 22:33:42] [INFO ] 현재 버전: blue (8080), 배포할 버전: green (8081)
[2025-09-13 22:33:43] [INFO ] 새로운 버전(green) 실행 중...
[2025-09-13 22:33:43] [INFO ] docker compose up -d (green): /home/ubuntu/threadly/infra/app/docker-compose.green.yml
[2025-09-13 22:33:55] [INFO ] Health Check 시작...
[2025-09-13 22:33:55] [INFO ] Health Check 시작...
[2025-09-13 22:34:55] [INFO ] 재시도..
[2025-09-13 22:35:08] [INFO ] Health check 성공!
[2025-09-13 22:35:08] [INFO ] Nginx 포트 전환 중...
[2025-09-13 22:35:08] [INFO ] Nginx Reload 완료
[2025-09-13 22:35:08] [INFO ] 기존 버전(blue) 종료 중...
[2025-09-13 22:35:08] [WARN ] docker compose down (blue): /home/ubuntu/threadly/infra/app/docker-compose.blue.yml
[2025-09-13 22:35:09] [WARN ] 버전: blue 종료 됨
[2025-09-13 22:35:09] [INFO ] ======Deploy Finish======
미사용 및 구버전 Docker 이미지 정리
1). 특정 {Repository}의 특정 {Tag}를 제외한 이미지 삭제
# ...
DELETE_TARGETS=$(docker images $IMAGE_NAME --format '{{.Repository}}:{{.Tag}}' | grep -v -e "${IMAGE_NAME}:${IMAGE_TAG}" || true)
# ...[2025-09-14 15:33:02] ======Cleaning old Docker images start======
[2025-09-14 15:33:02] -Target Repository=kimgyubek/threadly-notification
[2025-09-14 15:33:02] -Target Tag=20250914-d6d3a03
[2025-09-14 15:33:02] -Deleted Images:
[2025-09-14 15:33:02] - kimgyubek/threadly-notification:20250913-99d7d0e
[2025-09-14 15:33:02] ======Cleaning finished======