#!/usr/bin/env bash # ITMS 모바일 앱 배포 매니페스트 publish — APK 산출 후 1회 실행(웹 /mobile-app 자동 최신화). # · 역할: 서버 APK 옆에 itms-latest.json(버전·다운로드URL·빌드일자·크기·sha256)을 원자적으로 기록. # /mobile-app 페이지(또는 백엔드 공개 엔드포인트)가 이 파일을 읽어 QR/다운로드를 최신화. # · 보안: 자격증명·키스토어·EXPO 토큰 미취급. 공개 다운로드 URL만 기록. # · CAMP deploy/publish_app_manifest.sh 패턴 이식(솔루션=ITMS, 포트/도메인만 상이). # # 사용: publish_app_manifest.sh [download_url] # 예) cp itms-mobile-v1.0.0.apk /opt/itms/downloads/itms.apk # publish_app_manifest.sh 1.0.0 /opt/itms/downloads/itms.apk https://itms.wise.ai.kr/downloads/itms.apk set -euo pipefail VERSION="${1:?usage: publish_app_manifest.sh [download_url]}" APK_PATH="${2:?usage: publish_app_manifest.sh [download_url]}" DOWNLOAD_URL="${3:-${ITMS_APP_DOWNLOAD_URL:-https://itms.wise.ai.kr/downloads/itms.apk}}" MANIFEST="${ITMS_APP_MANIFEST:-/opt/itms/downloads/itms-latest.json}" APP_NAME="${ITMS_APP_NAME:-ITMS 유지보수관리 모바일 앱}" PLATFORM="${ITMS_APP_PLATFORM:-ANDROID}" BUILT_AT="$(date +%Y-%m-%d)" SIZE_BYTES="0"; SIZE_MB="null"; SHA256="null" if [ -f "$APK_PATH" ]; then SIZE_BYTES=$(stat -c%s "$APK_PATH" 2>/dev/null || wc -c < "$APK_PATH") SIZE_MB=$(awk -v b="$SIZE_BYTES" 'BEGIN { printf "%.1f", b/1048576 }') HASH=$(sha256sum "$APK_PATH" 2>/dev/null | awk '{print $1}') [ -n "$HASH" ] && SHA256="\"${HASH}\"" fi mkdir -p "$(dirname "$MANIFEST")" TMP="${MANIFEST}.tmp.$$" cat > "$TMP" </dev/null 2>&1; then qrencode -o "$(dirname "$MANIFEST")/itms-apk-qr.png" -s 8 "$DOWNLOAD_URL" || true echo "[publish] QR -> $(dirname "$MANIFEST")/itms-apk-qr.png" fi echo "[publish] manifest -> $MANIFEST" echo "[publish] version=$VERSION platform=$PLATFORM publishedAt=$BUILT_AT sizeBytes=$SIZE_BYTES sizeMb=$SIZE_MB" echo "[publish] apkUrl=$DOWNLOAD_URL"