feat: Android 폰·태블릿 다운로드·앱 내 업데이트 완료

CI에서 APK 버전 자동 bump, 앱 복귀 시 업데이트 확인·시스템 다운로드,
프론트 Android 전용 UI 정리(iPad는 향후).

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Macbook
2026-06-14 17:03:10 +09:00
parent be45247dc9
commit c840e09885
8 changed files with 193 additions and 130 deletions
+47
View File
@@ -0,0 +1,47 @@
#!/usr/bin/env bash
# CI: .env GC_MOBILE_APP_VERSION 또는 build.gradle 기준 patch bump + versionCode++
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
WORK_TREE="${WORK_TREE:-$ROOT}"
GRADLE="${GRADLE:-$ROOT/app/android/app/build.gradle}"
ENV_FILE="${ENV_FILE:-$WORK_TREE/.env}"
if [[ ! -f "$GRADLE" ]]; then
echo "build.gradle 없음: $GRADLE" >&2
exit 1
fi
ENV_VER=""
if [[ -f "$ENV_FILE" ]]; then
ENV_VER="$(grep '^GC_MOBILE_APP_VERSION=' "$ENV_FILE" 2>/dev/null | cut -d= -f2- | tr -d '\r' || true)"
fi
node -e "
const fs = require('fs');
const gradlePath = process.argv[1];
const envVersion = (process.argv[2] || '').trim();
let content = fs.readFileSync(gradlePath, 'utf8');
const vc = content.match(/versionCode\\s+(\\d+)/);
const vn = content.match(/versionName\\s+\"([^\"]+)\"/);
if (!vc || !vn) {
console.error('versionCode/versionName 파싱 실패');
process.exit(1);
}
let versionCode = parseInt(vc[1], 10);
let base = envVersion || vn[1];
const parts = base.split('.').map(n => parseInt(n, 10) || 0);
while (parts.length < 2) parts.push(0);
if (parts.length === 2) {
parts[1] += 1;
} else {
while (parts.length < 3) parts.push(0);
parts[2] += 1;
}
const versionName = parts.join('.');
versionCode += 1;
content = content.replace(/versionCode\\s+\\d+/, 'versionCode ' + versionCode);
content = content.replace(/versionName\\s+\"[^\"]+\"/, 'versionName \"' + versionName + '\"');
fs.writeFileSync(gradlePath, content);
console.log(versionName);
" "$GRADLE" "$ENV_VER"
+13
View File
@@ -30,6 +30,19 @@ fi
chmod +x "$ROOT/scripts/"*.sh 2>/dev/null || true
if [[ "${BUMP_VERSION:-}" == "0" ]]; then
log "version bump 스킵 (BUMP_VERSION=0)"
elif [[ -n "${BUILD_NUMBER:-}" && "${MOBILE_BUMP_ON_CI:-1}" == "1" ]]; then
ENV_FILE="$WORK_TREE/.env"
log "CI Android version bump (.env 기준)..."
NEW_VER="$("$ROOT/scripts/bump-android-version.sh")"
log "Android version → $NEW_VER"
elif [[ -n "${BUMP_VERSION:-}" ]]; then
log "CI Android version bump..."
NEW_VER="$("$ROOT/scripts/bump-android-version.sh")"
log "Android version → $NEW_VER"
fi
"$ROOT/scripts/build-mobile-apk.sh"
VERSION_NAME="$(grep -E 'versionName[[:space:]]+"' "$ROOT/app/android/app/build.gradle" | head -1 | sed -E 's/.*versionName[[:space:]]+"([^"]+)".*/\1/' || true)"
+1 -8
View File
@@ -59,16 +59,9 @@ export GC_MOBILE_JENKINS_USER="${DESKTOP_USER:-}"
export GC_MOBILE_JENKINS_TOKEN="${DESKTOP_TOKEN:-}"
"$WORK_TREE/scripts/trigger-mobile-jenkins-build.sh" || log "[WARN] Mobile Jenkins 트리거 실패"
if command -v pod >/dev/null 2>&1 && [[ -f "$WORK_TREE/app/ios/App/Podfile" ]]; then
log "iOS pod install"
(cd "$WORK_TREE/app/ios/App" && pod install) || log "[WARN] pod install 실패"
else
log "CocoaPods 없음 — iOS 빌드는 brew install cocoapods 후 pod install"
fi
log "API 확인"
sleep 4
curl -fsSL http://127.0.0.1:8080/api/mobile-app/info 2>/dev/null | python3 -m json.tool 2>/dev/null || \
curl -fsSL http://exdev.co.kr/api/mobile-app/info | python3 -m json.tool 2>/dev/null || true
log "완료"
log "완료 (Android APK · iPad는 향후 TestFlight)"