4 Commits

Author SHA1 Message Date
26fb793ab9 feat: v1.3.0 - versionCode 기반 업데이트 체크
- 버전 1.2.5 → 1.3.0 (versionCode 1130)
- AppUpdateManager: versionCode로 업데이트 비교
- versionName 비교 로직 제거
- 더 정확한 업데이트 감지

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-02-28 18:50:55 +09:00
597880e807 fix: build.gradle 버전 1.2.5로 업데이트
- versionCode: 1124 → 1125
- versionName: 1.2.4 → 1.2.5
- 무한 업데이트 버그 수정

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-02-28 18:43:29 +09:00
6fb83848f5 docs: Gitea 릴리즈 작업 가이드 추가
- 릴리즈 생성 절차 문서화
- API 엔드포인트 및 예시 명령어 정리
- 버전 업데이트 체크리스트 포함
- 인증 정보 및 주의사항 기록

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-02-28 18:37:32 +09:00
fef630d266 chore: 버전 업데이트 v1.2.5
- versionCode: 1124 → 1125
- versionName: 1.2.4 → 1.2.5
- changelog 업데이트

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-02-28 18:26:08 +09:00
6 changed files with 234 additions and 36 deletions

206
GITEA_RELEASE_GUIDE.md Normal file
View File

@@ -0,0 +1,206 @@
# Gitea 릴리즈 작업 가이드
> ShiftRing 프로젝트 Gitea 릴리즈 자동화 문서
> 저장소: https://git.webpluss.net/sanjeok77/ShiftRing
---
## 🔐 인증 정보
**Personal Access Token (PAT)**
- 위치: `.env.local` 파일
- 형식: `e3b515eaa0a6683c921ca3bf718e281ed30a6075`
- 사용자: `sanjeok77`
**인증 헤더**
```bash
-u "sanjeok77:TOKEN"
```
---
## 📋 릴리즈 생성 절차
### 1. 버전 업데이트 (3곳)
#### 1.1 `app/build.gradle.kts` - 앱 날부 버전
```kotlin
defaultConfig {
versionCode = 1125 // ← 이전: 1124
versionName = "1.2.5" // ← 이전: "1.2.4"
}
```
#### 1.2 `version.json` - 서버 버전 정보
```json
{
"versionCode": 1125,
"versionName": "1.2.5",
"apkUrl": "https://git.webpluss.net/attachments/{UUID}",
"changelog": "v1.2.5: 변경사항 요약",
"forceUpdate": false
}
```
#### 1.3 Git 태그 및 릴리즈
- 태그: `v1.2.5`
- 브랜치: `dev` (개발) → `main` (배포)
---
### 2. 릴리즈 생성 (API)
**엔드포인트**
```bash
POST https://git.webpluss.net/api/v1/repos/sanjeok77/ShiftRing/releases
```
**요청 예시**
```bash
curl -X POST \
-H "Content-Type: application/json" \
-u "sanjeok77:TOKEN" \
"https://git.webpluss.net/api/v1/repos/sanjeok77/ShiftRing/releases" \
-d '{
"tag_name": "v1.2.5",
"name": "v1.2.5 - 릴리즈 제목",
"body": "## 변경사항\n\n- 기능1\n- 기능2",
"prerelease": false,
"target_commitish": "dev"
}'
```
**응답 예시**
```json
{
"id": 30,
"tag_name": "v1.2.5",
"upload_url": "https://git.webpluss.net/api/v1/repos/sanjeok77/ShiftRing/releases/30/assets"
}
```
---
### 3. APK 빌드
**릴리즈 빌드**
```bash
./gradlew :app:assembleRelease
```
**출력 경로**
```
app/build/outputs/apk/release/app-release.apk
```
**서명 설정** (`keystore.properties`)
```properties
storePassword=비밀번호
keyAlias=별칭
keyPassword=비밀번호
storeFile=../release.jks
```
---
### 4. APK 업로드 (API)
**엔드포인트**
```bash
POST https://git.webpluss.net/api/v1/repos/sanjeok77/ShiftRing/releases/{release_id}/assets
```
**요청 예시**
```bash
curl -X POST \
-u "sanjeok77:TOKEN" \
-H "Content-Type: multipart/form-data" \
-F "attachment=@app/build/outputs/apk/release/app-release.apk" \
"https://git.webpluss.net/api/v1/repos/sanjeok77/ShiftRing/releases/30/assets?name=app.apk"
```
**응답 예시**
```json
{
"id": 37,
"name": "app.apk",
"size": 5236988,
"browser_download_url": "https://git.webpluss.net/attachments/b8f53c11-743f-416c-87ae-bd478c781abf"
}
```
---
### 5. version.json 업데이트
**APK URL 업데이트**
```json
{
"apkUrl": "https://git.webpluss.net/attachments/{UUID}"
}
```
**주의**: `releases/download/v1.2.5/app.apk` 형식이 아닌 `attachments/{UUID}` 형식 사용
---
## 🔧 유틸리티 명령어
### 릴리즈 조회
```bash
curl -s -u "sanjeok77:TOKEN" \
"https://git.webpluss.net/api/v1/repos/sanjeok77/ShiftRing/releases" | jq '.[].tag_name'
```
### 특정 릴리즈 조회
```bash
curl -s -u "sanjeok77:TOKEN" \
"https://git.webpluss.net/api/v1/repos/sanjeok77/ShiftRing/releases/30"
```
### 첨부파일 삭제
```bash
curl -s -u "sanjeok77:TOKEN" \
-X DELETE \
"https://git.webpluss.net/api/v1/repos/sanjeok77/ShiftRing/releases/30/assets/{asset_id}"
```
---
## ⚠️ 주의사항
1. **버전 일치**: `build.gradle.kts`, `version.json`, Git 태그 3곳 모두 동일 버전 사용
2. **APK 파일명**: 반드시 `app.apk`로 업로드 (클리어 이름 지정)
3. **UUID**: 업로드 후 반환된 UUID를 `version.json`에 반영
4. **브랜치**:
- 개발: `dev` 브랜치에 커밋
- 배포: `main` 브랜치에 cherry-pick
---
## 📁 관련 파일
| 파일 | 설명 |
|------|------|
| `app/build.gradle.kts` | 앱 날부 버전 설정 |
| `version.json` | 서버 버전 정보 |
| `keystore.properties` | 서명 키 설정 |
| `release.jks` | 서명 키스토어 |
| `.env.local` | API 토큰 저장 |
---
## 📝 변경 이력
| 날짜 | 버전 | 작업 |
|------|------|------|
| 2026-02-28 | v1.2.5 | 알람 시스템 단순화 릴리즈 |
| 2026-02-28 | v1.2.4 | 버그 수정 릴리즈 |
---
## 🔗 참고 링크
- 릴리즈 페이지: https://git.webpluss.net/sanjeok77/ShiftRing/releases
- API 문서: https://git.webpluss.net/api/swagger
- Swagger UI: https://git.webpluss.net/api/swagger#/repository/repoCreateRelease

View File

@@ -20,8 +20,10 @@ android {
applicationId = "com.example.shiftalarm" applicationId = "com.example.shiftalarm"
minSdk = 26 minSdk = 26
targetSdk = 35 targetSdk = 35
versionCode = 1124 versionCode = 1130
versionName = "1.2.4" versionName = "1.3.0"
versionName = "1.2.5"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
} }

View File

@@ -39,14 +39,21 @@ object AppUpdateManager {
reader.close() reader.close()
val json = JSONObject(result) val json = JSONObject(result)
val serverVersionCode = json.getInt("versionCode")
val serverVersionName = json.getString("versionName") val serverVersionName = json.getString("versionName")
val apkUrl = json.getString("apkUrl") val apkUrl = json.getString("apkUrl")
val changelog = json.optString("changelog", "버그 수정 및 성능 향상") val changelog = json.optString("changelog", "버그 수정 및 성능 향상")
val pInfo = ctx.packageManager.getPackageInfo(ctx.packageName, 0) val pInfo = ctx.packageManager.getPackageInfo(ctx.packageName, 0)
val currentVersionCode = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
pInfo.longVersionCode.toInt()
} else {
@Suppress("DEPRECATION")
pInfo.versionCode
}
val currentVersionName = pInfo.versionName ?: "0.0.0" val currentVersionName = pInfo.versionName ?: "0.0.0"
if (isNewerVersion(serverVersionName, currentVersionName)) { if (serverVersionCode > currentVersionCode) {
activity.runOnUiThread { activity.runOnUiThread {
showUpdateDialog(activity, serverVersionName, changelog, apkUrl) showUpdateDialog(activity, serverVersionName, changelog, apkUrl)
} }
@@ -71,29 +78,6 @@ object AppUpdateManager {
}.start() }.start()
} }
private fun isNewerVersion(server: String, current: String): Boolean {
try {
// Clean version strings (remove non-numeric suffixes if any)
val sClean = server.split("-")[0].split(" ")[0]
val cClean = current.split("-")[0].split(" ")[0]
val sParts = sClean.split(".").map { it.filter { char -> char.isDigit() }.let { p -> if (p.isEmpty()) 0 else p.toInt() } }
val cParts = cClean.split(".").map { it.filter { char -> char.isDigit() }.let { p -> if (p.isEmpty()) 0 else p.toInt() } }
val length = Math.max(sParts.size, cParts.size)
for (i in 0 until length) {
val s = if (i < sParts.size) sParts[i] else 0
val c = if (i < cParts.size) cParts[i] else 0
if (s > c) return true
if (s < c) return false
}
} catch (e: Exception) {
android.util.Log.e("AppUpdateManager", "Version comparison failed: ${e.message}")
return false
}
return false
}
private fun showUpdateDialog(activity: Activity, version: String, changelog: String, apkUrl: String) { private fun showUpdateDialog(activity: Activity, version: String, changelog: String, apkUrl: String) {
com.google.android.material.dialog.MaterialAlertDialogBuilder(activity) com.google.android.material.dialog.MaterialAlertDialogBuilder(activity)
.setTitle("새로운 업데이트 발견 (v$version)") .setTitle("새로운 업데이트 발견 (v$version)")

0
gradlew vendored Normal file → Executable file
View File

View File

@@ -1,7 +1,13 @@
{ {
"versionCode": 1124, "versionCode": 1130,
"versionName": "1.2.4", "versionName": "1.3.0",
"apkUrl": "https://git.webpluss.net/sanjeok77/ShiftRing/releases/download/v1.2.4/app.apk", "apkUrl": "https://git.webpluss.net/sanjeok77/ShiftRing/releases/download/v1.3.0/app.apk",
"changelog": "v1.2.4: Deprecation 경고 수정 및 삭제 알람 버그 수정", "changelog": "v1.3.0: versionCode 기반 업데이트 체크 개선",
"forceUpdate": false
}
"versionCode": 1125,
"versionName": "1.2.5",
"apkUrl": "https://git.webpluss.net/sanjeok77/ShiftRing/releases/download/v1.2.5/app.apk",
"changelog": "v1.2.5: 알람 시스템 단순화 - 삭제된 알람 버그 수정",
"forceUpdate": false "forceUpdate": false
} }