- CollectDB 다중 신호 수집 → S&P Global AIS API 단일 수집으로 전환 - sig_src_cd + target_id 이중 식별자 → mmsi(VARCHAR) 단일 식별자 - t_vessel_latest_position → t_ais_position 테이블 전환 - 레거시 배치/유틸 ~30개 클래스 삭제 (VesselAggregationJobConfig, ShipKindCodeConverter 등) - AisTargetCacheManager 기반 캐시 이중 구조 (최신위치 + 트랙 버퍼) - CacheBasedVesselTrackDataReader + CacheBasedTrackJobListener 신규 추가 - VesselStaticStepConfig: 정적정보 CDC 변경 검출 + hourly job 편승 - SignalKindCode enum: vesselType/extraInfo 기반 선종 자동 분류 - WebSocket/STOMP 전체 mmsi 전환 (StompTrackStreamingService ~40곳) - 모니터링/성능 최적화 코드 mmsi 기반 전환 - DataSource 설정 통합 (snpdb 단일 DB) - AreaBoundaryCache Polygon→Geometry 캐스트 수정 (MULTIPOLYGON 지원) - ConcurrentHashMap 적용 (VesselTrackStepConfig 동시성 버그 수정) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
171 lines
4.9 KiB
Bash
171 lines
4.9 KiB
Bash
#!/bin/bash
|
|
# =============================================================================
|
|
# sync-nexus.sh - 로컬 Maven 의존성을 Nexus에 동기화
|
|
#
|
|
# 사용법:
|
|
# ./scripts/sync-nexus.sh # 실제 업로드
|
|
# ./scripts/sync-nexus.sh --dry-run # 업로드 대상만 확인
|
|
# =============================================================================
|
|
|
|
set -eo pipefail
|
|
|
|
# --- SDKMAN 초기화 (set -u 전에 실행) ---
|
|
if [ -f "$HOME/.sdkman/bin/sdkman-init.sh" ]; then
|
|
source "$HOME/.sdkman/bin/sdkman-init.sh" 2>/dev/null || true
|
|
fi
|
|
|
|
# --- 설정 ---
|
|
NEXUS_URL="http://10.26.252.39:8081"
|
|
REPO_ID="mda-backend-repository"
|
|
NEXUS_USER="admin"
|
|
NEXUS_PASS="8932"
|
|
LOCAL_REPO="$HOME/.m2/repository"
|
|
|
|
# --- 옵션 파싱 ---
|
|
DRY_RUN=false
|
|
if [[ "${1:-}" == "--dry-run" ]]; then
|
|
DRY_RUN=true
|
|
echo "=== DRY RUN 모드 (업로드하지 않음) ==="
|
|
fi
|
|
|
|
# --- 카운터 ---
|
|
TOTAL=0
|
|
SKIPPED=0
|
|
UPLOADED=0
|
|
FAILED=0
|
|
|
|
# Nexus에 아티팩트 존재 여부 확인 (HTTP HEAD로 .pom 파일 체크)
|
|
check_exists() {
|
|
local group_path=$1
|
|
local artifact_id=$2
|
|
local version=$3
|
|
local pom_url="${NEXUS_URL}/repository/${REPO_ID}/${group_path}/${artifact_id}/${version}/${artifact_id}-${version}.pom"
|
|
local http_code
|
|
http_code=$(curl -s -o /dev/null -w "%{http_code}" -u "${NEXUS_USER}:${NEXUS_PASS}" --connect-timeout 5 "$pom_url" < /dev/null)
|
|
[[ "$http_code" == "200" ]]
|
|
}
|
|
|
|
# 파일 업로드 (HTTP PUT)
|
|
upload_file() {
|
|
local file_path=$1
|
|
local remote_path=$2
|
|
local url="${NEXUS_URL}/repository/${REPO_ID}/${remote_path}"
|
|
|
|
if [ ! -f "$file_path" ]; then
|
|
return 1
|
|
fi
|
|
|
|
local http_code
|
|
http_code=$(curl -s -o /dev/null -w "%{http_code}" -u "${NEXUS_USER}:${NEXUS_PASS}" --upload-file "$file_path" --connect-timeout 10 --max-time 120 "$url" < /dev/null)
|
|
[[ "$http_code" == "201" || "$http_code" == "200" ]]
|
|
}
|
|
|
|
# 아티팩트 업로드 (pom + jar + 기타)
|
|
upload_artifact() {
|
|
local group_id=$1
|
|
local artifact_id=$2
|
|
local version=$3
|
|
local packaging=$4
|
|
|
|
local group_path
|
|
group_path=$(echo "$group_id" | tr '.' '/')
|
|
local base_dir="${LOCAL_REPO}/${group_path}/${artifact_id}/${version}"
|
|
local base_name="${artifact_id}-${version}"
|
|
local remote_base="${group_path}/${artifact_id}/${version}"
|
|
|
|
local success=true
|
|
|
|
# POM 업로드 (필수)
|
|
local pom_file="${base_dir}/${base_name}.pom"
|
|
if [ -f "$pom_file" ]; then
|
|
if upload_file "$pom_file" "${remote_base}/${base_name}.pom"; then
|
|
:
|
|
else
|
|
echo " [FAIL] POM 업로드 실패"
|
|
success=false
|
|
fi
|
|
fi
|
|
|
|
# JAR 업로드 (pom 패키징이 아닌 경우)
|
|
if [[ "$packaging" != "pom" ]]; then
|
|
local jar_file="${base_dir}/${base_name}.${packaging}"
|
|
if [ -f "$jar_file" ]; then
|
|
if upload_file "$jar_file" "${remote_base}/${base_name}.${packaging}"; then
|
|
:
|
|
else
|
|
echo " [FAIL] ${packaging} 업로드 실패"
|
|
success=false
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
$success
|
|
}
|
|
|
|
echo ""
|
|
echo "=== Nexus 동기화 시작 ==="
|
|
echo " Nexus: ${NEXUS_URL}/repository/${REPO_ID}"
|
|
echo " 로컬: ${LOCAL_REPO}"
|
|
echo ""
|
|
|
|
# Nexus 연결 확인
|
|
if ! curl -s -o /dev/null -w "" -u "${NEXUS_USER}:${NEXUS_PASS}" --connect-timeout 5 "${NEXUS_URL}/service/rest/v1/repositories" 2>/dev/null; then
|
|
echo "[ERROR] Nexus(${NEXUS_URL})에 연결할 수 없습니다."
|
|
exit 1
|
|
fi
|
|
echo "[OK] Nexus 연결 확인"
|
|
echo ""
|
|
|
|
# Maven dependency:list로 GAV 목록 추출
|
|
echo "의존성 목록 추출 중..."
|
|
DEP_LIST=$(mvn dependency:list -DoutputAbsoluteArtifactFilename=true 2>/dev/null | grep "^\[INFO\] " | sed 's/\[INFO\] //' | sed 's/ -- .*//')
|
|
|
|
echo ""
|
|
echo "--- 동기화 진행 ---"
|
|
|
|
while IFS= read -r line; do
|
|
# 형식: groupId:artifactId:packaging:version:scope:/path/to/file
|
|
IFS=':' read -r group_id artifact_id packaging version scope rest <<< "$line"
|
|
|
|
if [[ -z "$group_id" || -z "$artifact_id" || -z "$version" ]]; then
|
|
continue
|
|
fi
|
|
|
|
TOTAL=$((TOTAL + 1))
|
|
local_group_path=$(echo "$group_id" | tr '.' '/')
|
|
|
|
# Nexus 존재 여부 확인
|
|
if check_exists "$local_group_path" "$artifact_id" "$version"; then
|
|
SKIPPED=$((SKIPPED + 1))
|
|
continue
|
|
fi
|
|
|
|
# 신규 아티팩트 발견
|
|
echo "[NEW] ${group_id}:${artifact_id}:${version} (${packaging})"
|
|
|
|
if $DRY_RUN; then
|
|
UPLOADED=$((UPLOADED + 1))
|
|
else
|
|
if upload_artifact "$group_id" "$artifact_id" "$version" "$packaging"; then
|
|
echo " -> 업로드 완료"
|
|
UPLOADED=$((UPLOADED + 1))
|
|
else
|
|
echo " -> 업로드 실패"
|
|
FAILED=$((FAILED + 1))
|
|
fi
|
|
fi
|
|
|
|
done <<< "$DEP_LIST"
|
|
|
|
echo ""
|
|
echo "=== 동기화 완료 ==="
|
|
echo " 전체: ${TOTAL}"
|
|
echo " 스킵 (이미 존재): ${SKIPPED}"
|
|
if $DRY_RUN; then
|
|
echo " 업로드 대상: ${UPLOADED}"
|
|
else
|
|
echo " 업로드 성공: ${UPLOADED}"
|
|
echo " 업로드 실패: ${FAILED}"
|
|
fi
|
|
echo ""
|