Files
tetrig/scripts/release.sh
tkrmagid da0f355b98 release.sh: Gitea 푸시에 토큰 인증 붙이기
자격증명 헬퍼가 없어 'could not read Username' 으로 푸시가 실패했다.
토큰을 URL 에 실어 보낸다.
2026-09-24 16:29:46 +09:00

80 lines
3.4 KiB
Bash
Executable File

#!/usr/bin/env bash
# TETRIG 릴리스 스크립트
#
# scripts/release.sh [major|minor|patch] # 기본 patch
#
# 하는 일:
# 1) app/gradle.properties 의 appVersionName 을 semver 로 올리고 appVersionCode 를 +1
# 2) 테스트 → 릴리스 APK/AAB 빌드 (keystore.properties 로 서명)
# 3) 버전 커밋 + vX.Y.Z 태그 + push
# 4) Gitea 릴리스 생성 후 APK/AAB 업로드
#
# 필요 환경:
# JAVA_HOME (JDK 17+), ANDROID_HOME, app/keystore.properties
# GITEA_TOKEN (없으면 ~/.config/ejclaw/secrets.json 의 git.tkrmagid.kr 토큰 사용)
set -euo pipefail
BUMP="${1:-patch}"
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
PROPS="$ROOT/app/gradle.properties"
GITEA_HOST="https://git.tkrmagid.kr"
REPO="tkrmagid/tetrig"
[ -f "$ROOT/app/keystore.properties" ] || { echo "app/keystore.properties 가 없습니다 (서명 불가)"; exit 1; }
cur_name=$(grep -E '^appVersionName=' "$PROPS" | cut -d= -f2)
cur_code=$(grep -E '^appVersionCode=' "$PROPS" | cut -d= -f2)
IFS=. read -r MA MI PA <<< "$cur_name"
case "$BUMP" in
major) MA=$((MA+1)); MI=0; PA=0 ;;
minor) MI=$((MI+1)); PA=0 ;;
patch) PA=$((PA+1)) ;;
*) echo "usage: $0 [major|minor|patch]"; exit 1 ;;
esac
new_name="$MA.$MI.$PA"
new_code=$((cur_code+1))
echo "버전: $cur_name($cur_code) → $new_name($new_code)"
sed -i "s/^appVersionName=.*/appVersionName=$new_name/" "$PROPS"
sed -i "s/^appVersionCode=.*/appVersionCode=$new_code/" "$PROPS"
cd "$ROOT/app"
./gradlew :composeApp:testDebugUnitTest :composeApp:assembleRelease :composeApp:bundleRelease \
-PappVersionName="$new_name" -PappVersionCode="$new_code"
OUT="$ROOT/app/composeApp/build/outputs"
APK="$OUT/apk/release/composeApp-release.apk"
AAB="$OUT/bundle/release/composeApp-release.aab"
[ -f "$APK" ] || { echo "APK 빌드 실패"; exit 1; }
DIST="$ROOT/app/build/dist"
mkdir -p "$DIST"
cp "$APK" "$DIST/TETRIG-v$new_name.apk"
cp "$AAB" "$DIST/TETRIG-v$new_name.aab"
cd "$ROOT"
git add app/gradle.properties
git commit -m "release: v$new_name (versionCode $new_code)"
git tag -a "v$new_name" -m "TETRIG v$new_name"
TOKEN="${GITEA_TOKEN:-$(node -e 'console.log(require(process.env.HOME+"/.config/ejclaw/secrets.json").credentials["git.tkrmagid.kr"].token)' 2>/dev/null || true)}"
[ -n "$TOKEN" ] || { echo "GITEA_TOKEN 이 없습니다"; exit 1; }
# 토큰을 URL 에 넣어 푸시한다. 그냥 호스트만 주면 자격증명 헬퍼가 없어
# "could not read Username" 으로 죽는다. URL 은 로그에 남지 않게 변수로만 쓴다.
git push "https://oauth2:${TOKEN}@${GITEA_HOST#https://}/$REPO.git" HEAD:main --tags
echo "Gitea 릴리스 생성..."
REL_ID=$(curl -sS -X POST "$GITEA_HOST/api/v1/repos/$REPO/releases" \
-H "Authorization: token $TOKEN" -H "Content-Type: application/json" \
-d "{\"tag_name\":\"v$new_name\",\"name\":\"TETRIG v$new_name\",\"body\":\"versionCode $new_code\\n\\n안드로이드: TETRIG-v$new_name.apk 를 내려받아 설치하세요.\\nPlay Console 업로드: TETRIG-v$new_name.aab\",\"draft\":false,\"prerelease\":false}" \
| node -e 'let d="";process.stdin.on("data",c=>d+=c).on("end",()=>{const j=JSON.parse(d);if(!j.id){console.error(d);process.exit(1)}console.log(j.id)})')
for f in "TETRIG-v$new_name.apk" "TETRIG-v$new_name.aab"; do
echo " 업로드: $f"
curl -sS -X POST "$GITEA_HOST/api/v1/repos/$REPO/releases/$REL_ID/assets?name=$f" \
-H "Authorization: token $TOKEN" -F "attachment=@$DIST/$f" > /dev/null
done
echo "완료: $GITEA_HOST/$REPO/releases/tag/v$new_name"