#!/usr/bin/env bash set -euo pipefail # ===== 설정 ===== OUTDIR="${OUTDIR:-offline-seed}" M2OUT="$OUTDIR/m2repo" LOGDIR="$OUTDIR/logs" mkdir -p "$M2OUT" "$LOGDIR" # Gradle이 실제로 사용하는 repo (build.gradle과 동일하게 유지) # - 네 build.gradle은 mavenCentral + osgeo release 를 사용 # - seed를 만들 땐 이 repo들이 열려 있어야 함 GRADLE_CMD=(./gradlew --no-daemon) # ===== 0) 깨끗하게 시작(선택) ===== # 너무 오래된 캐시 오염 방지용. 필요 없으면 주석 처리. # rm -rf "${GRADLE_USER_HOME:-$HOME/.gradle}/caches/modules-2" # ===== 1) 필요한 task로 "resolve를 전부" 트리거 ===== # - spotlessCheck 포함 (google-java-format 받게) # - testClasses 포함 (test deps + bom/parent 받게) # - build 포함 (네 build는 spotlessCheck에 dependsOn) # - 단, test 실행은 제외 echo "[1/4] Running Gradle to trigger ALL resolves..." "${GRADLE_CMD[@]}" \ clean compileJava testClasses spotlessCheck build \ -x test \ --refresh-dependencies \ --debug \ 2>&1 | tee "$LOGDIR/gradle-debug.log" # ===== 2) debug 로그에서 실제 접근한 Maven artifact URL 추출 ===== # Gradle은 내부적으로 "resource: " 같은 형태로 찍는 경우가 많아서 # http/https URL 중 Maven2 레이아웃에 해당하는 확장자만 뽑는다. echo "[2/4] Extracting artifact URLs from Gradle debug log..." grep -Eo 'https?://[^ ]+\.(pom|jar|module|aar|sha1|md5)(\?[^ ]+)?' "$LOGDIR/gradle-debug.log" \ | sed -E 's/\?.*$//' \ | sort -u \ > "$OUTDIR/artifact-urls.txt" echo " - URLs: $(wc -l < "$OUTDIR/artifact-urls.txt")" echo " - saved: $OUTDIR/artifact-urls.txt" # ===== 3) URL들을 m2 레이아웃으로 다운로드 ===== # URL 형태가 .../repository/maven-public/... 이거나 MavenCentral/osgeo 일 수 있음 # 공통점: Maven2 레이아웃(/groupId/artifactId/version/...)을 그대로 가지고 있음 echo "[3/4] Downloading artifacts into m2 layout..." download_one() { local url="$1" # Maven2 레이아웃에서 groupId부터의 상대경로를 잡는다. # 케이스: # - https://repo1.maven.org/maven2/ # - https://repo.osgeo.org/repository/release/ # - http://.../repository/maven-public/ local rel if [[ "$url" == *"/maven2/"* ]]; then rel="${url#*/maven2/}" elif [[ "$url" == *"/repository/"*"/"*"/"* ]]; then # /repository// 이후를 상대경로로 rel="$(echo "$url" | sed -E 's#^https?://[^/]+/repository/[^/]+/##')" else # 알 수 없는 형태면 스킵(대부분 없음) echo " - [SKIP] unknown url form: $url" return 0 fi # 저장 경로 local dest="$M2OUT/$rel" mkdir -p "$(dirname "$dest")" if [[ -f "$dest" ]]; then return 0 fi echo " - [GET] $rel" curl -fSL "$url" -o "$dest" || { # sha1/md5 같은 건 서버에 없을 수 있음 → 무시 echo " !! failed: $url" rm -f "$dest" 2>/dev/null || true return 0 } } export -f download_one export M2OUT # 순차 다운로드(안정성). 병렬 원하면 xargs -P로 바꿀 수 있음. while IFS= read -r url; do [[ -z "$url" ]] && continue download_one "$url" done < "$OUTDIR/artifact-urls.txt" # ===== 4) tgz 생성 ===== echo "[4/4] Packing seed..." tar -czf "$OUTDIR/m2repo-seed.tgz" -C "$OUTDIR" m2repo ls -lh "$OUTDIR/m2repo-seed.tgz" echo "OK: $OUTDIR/m2repo-seed.tgz"