ai-review/review/build-base.sh
2025-06-15 13:52:26 +00:00

218 lines
6.5 KiB
Bash
Executable File

#!/bin/bash
# build-base.sh - Base Image 빌드 스크립트
set -e
# 변수 설정
BASE_IMAGE_NAME="kakao-review-api-base"
BASE_IMAGE_TAG="${1:-latest}"
ACR_NAME="${2:-acrdigitalgarage03}" # ACR 이름 (예: acrdigitalgarage01)
RESOURCE_GROUP="${3:-rg-digitalgarage-03}" # 리소스 그룹
# ACR URL 자동 구성
if [ -n "${ACR_NAME}" ]; then
REGISTRY="${ACR_NAME}.azurecr.io"
FULL_BASE_IMAGE_NAME="${REGISTRY}/${BASE_IMAGE_NAME}:${BASE_IMAGE_TAG}"
else
FULL_BASE_IMAGE_NAME="${BASE_IMAGE_NAME}:${BASE_IMAGE_TAG}"
fi
# 고정된 Dockerfile 경로
BASE_DOCKERFILE_PATH="deployment/container/Dockerfile-base"
BUILD_CONTEXT="."
echo "====================================================="
echo " 카카오맵 리뷰 분석 API Base Image 빌드"
echo "====================================================="
echo "Base 이미지명: ${FULL_BASE_IMAGE_NAME}"
if [ -n "${ACR_NAME}" ]; then
echo "ACR 이름: ${ACR_NAME}"
echo "리소스 그룹: ${RESOURCE_GROUP}"
fi
echo "빌드 시작: $(date)"
echo ""
# 사용법 표시 함수
show_usage() {
echo "사용법:"
echo " $0 [BASE_IMAGE_TAG] [ACR_NAME] [RESOURCE_GROUP]"
echo ""
echo "파라미터:"
echo " BASE_IMAGE_TAG: Base 이미지 태그 (기본값: latest)"
echo " ACR_NAME : Azure Container Registry 이름"
echo " RESOURCE_GROUP: Azure 리소스 그룹"
echo ""
echo "예시:"
echo " $0 v1.0.0 # 로컬 빌드만"
echo " $0 v1.0.0 acrdigitalgarage01 rg-digitalgarage-03 # ACR 빌드 + 푸시"
echo ""
echo "주의: Base Image는 자주 빌드할 필요가 없습니다."
echo " Chrome 업데이트나 기본 패키지 변경 시에만 재빌드하세요."
}
# ACR 로그인 함수
acr_login() {
local acr_name="$1"
local resource_group="$2"
echo "🔐 Azure Container Registry 로그인 중..."
if ! command -v az &> /dev/null; then
echo "❌ Azure CLI (az)가 설치되지 않았습니다."
exit 1
fi
if ! command -v jq &> /dev/null; then
echo "❌ jq가 설치되지 않았습니다."
exit 1
fi
if ! az account show &> /dev/null; then
echo "❌ Azure에 로그인되지 않았습니다."
echo "로그인 명령: az login"
exit 1
fi
local credential_json
credential_json=$(az acr credential show --name "${acr_name}" --resource-group "${resource_group}" 2>/dev/null)
if [ $? -ne 0 ]; then
echo "❌ ACR credential 조회 실패"
exit 1
fi
local username
local password
username=$(echo "${credential_json}" | jq -r '.username')
password=$(echo "${credential_json}" | jq -r '.passwords[0].value')
if [ -z "${username}" ] || [ -z "${password}" ] || [ "${username}" == "null" ] || [ "${password}" == "null" ]; then
echo "❌ ACR credential 파싱 실패"
exit 1
fi
echo "🔐 Docker 로그인 실행 중..."
echo "${password}" | docker login "${REGISTRY}" -u "${username}" --password-stdin
if [ $? -eq 0 ]; then
echo "✅ ACR 로그인 성공!"
return 0
else
echo "❌ ACR 로그인 실패"
exit 1
fi
}
# 파라미터 검증
if [ "$1" == "--help" ] || [ "$1" == "-h" ]; then
show_usage
exit 0
fi
if [ -n "${ACR_NAME}" ] && [ -z "${RESOURCE_GROUP}" ]; then
echo "❌ ACR_NAME이 제공된 경우 RESOURCE_GROUP도 필요합니다."
echo ""
show_usage
exit 1
fi
# 필수 파일 확인
echo "📁 필수 파일 확인 중..."
if [ ! -f "${BASE_DOCKERFILE_PATH}" ]; then
echo "${BASE_DOCKERFILE_PATH} 파일을 찾을 수 없습니다."
exit 1
fi
echo "✅ Base Dockerfile 확인 완료"
echo "📄 Base Dockerfile: ${BASE_DOCKERFILE_PATH}"
# ACR 로그인 수행
if [ -n "${ACR_NAME}" ] && [ -n "${RESOURCE_GROUP}" ]; then
echo ""
acr_login "${ACR_NAME}" "${RESOURCE_GROUP}"
echo ""
fi
# Docker 빌드
echo "🔨 Base Image 빌드 시작... (시간이 다소 소요됩니다)"
echo "명령어: docker build -t \"${FULL_BASE_IMAGE_NAME}\" -f \"${BASE_DOCKERFILE_PATH}\" \"${BUILD_CONTEXT}\""
docker build -t "${FULL_BASE_IMAGE_NAME}" -f "${BASE_DOCKERFILE_PATH}" "${BUILD_CONTEXT}"
if [ $? -eq 0 ]; then
echo "✅ Base Image 빌드 완료!"
echo "이미지명: ${FULL_BASE_IMAGE_NAME}"
# 이미지 정보 표시
echo ""
echo "📊 Base Image 정보:"
docker images "${FULL_BASE_IMAGE_NAME}" --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}\t{{.CreatedAt}}"
# latest 태그 추가 생성
if [ "${BASE_IMAGE_TAG}" != "latest" ] && [ -n "${REGISTRY}" ]; then
echo ""
echo "🏷️ latest 태그 생성 중..."
docker tag "${FULL_BASE_IMAGE_NAME}" "${REGISTRY}/${BASE_IMAGE_NAME}:latest"
echo "✅ latest 태그 생성 완료: ${REGISTRY}/${BASE_IMAGE_NAME}:latest"
fi
# ACR 푸시
if [ -n "${ACR_NAME}" ]; then
echo ""
echo "🚀 ACR에 Base Image 푸시 중..."
echo "📤 푸시 중: ${FULL_BASE_IMAGE_NAME}"
docker push "${FULL_BASE_IMAGE_NAME}"
if [ $? -eq 0 ]; then
echo "✅ Base Image 푸시 성공"
if [ "${BASE_IMAGE_TAG}" != "latest" ]; then
echo "📤 푸시 중: ${REGISTRY}/${BASE_IMAGE_NAME}:latest"
docker push "${REGISTRY}/${BASE_IMAGE_NAME}:latest"
if [ $? -eq 0 ]; then
echo "✅ latest 태그 푸시 성공"
fi
fi
else
echo "❌ Base Image 푸시 실패"
exit 1
fi
fi
echo ""
echo "🎉 Base Image 빌드 완료!"
echo ""
echo "📋 완료된 작업:"
echo " ✅ Base Image 빌드: ${FULL_BASE_IMAGE_NAME}"
if [ "${BASE_IMAGE_TAG}" != "latest" ] && [ -n "${REGISTRY}" ]; then
echo " ✅ latest 태그: ${REGISTRY}/${BASE_IMAGE_NAME}:latest"
fi
if [ -n "${ACR_NAME}" ]; then
echo " ✅ ACR 푸시 완료"
fi
echo ""
echo "🧪 테스트 명령어:"
echo " docker run --rm ${FULL_BASE_IMAGE_NAME} google-chrome --version"
echo ""
echo "📝 다음 단계:"
echo " 이제 Service Image를 빌드하세요:"
if [ -n "${ACR_NAME}" ]; then
echo " ./scripts/build.sh v1.0.0 ${ACR_NAME} ${RESOURCE_GROUP}"
else
echo " ./scripts/build.sh v1.0.0"
fi
else
echo "❌ Base Image 빌드 실패!"
exit 1
fi
echo ""
echo "🏁 Base Image 빌드 프로세스 완료 - $(date)"