From f1e3b5a49eea5d8c5a19088e5637bc394bfd2de3 Mon Sep 17 00:00:00 2001 From: klaus Date: Mon, 29 Jun 2026 16:40:18 +0900 Subject: [PATCH] =?UTF-8?q?docs(release):=20release=20=EC=84=9C=EB=AA=85?= =?UTF-8?q?=20=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=EC=9D=84=20=EA=B8=B0?= =?UTF-8?q?=EB=A1=9D=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plan-task.md | 77 +++++++++++++++++++ .../prd.md | 59 ++++++++++++++ 2 files changed, 136 insertions(+) create mode 100644 docs/20260627_release_서명_정보_입력_구성/plan-task.md create mode 100644 docs/20260627_release_서명_정보_입력_구성/prd.md diff --git a/docs/20260627_release_서명_정보_입력_구성/plan-task.md b/docs/20260627_release_서명_정보_입력_구성/plan-task.md new file mode 100644 index 00000000..9805a578 --- /dev/null +++ b/docs/20260627_release_서명_정보_입력_구성/plan-task.md @@ -0,0 +1,77 @@ +# release 서명 정보 입력 구성 Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** `release` build variant가 git에 비밀값을 남기지 않고 서명 정보를 입력받아 실행될 수 있게 한다. + +**Architecture:** `app/build.gradle`이 `local.properties`의 release signing 값을 읽고 `signingConfigs.release`에 연결한다. release 관련 task 실행 시 필수 값이 누락되면 Gradle 구성은 유지하되 실행 직전에 명확한 오류를 낸다. + +**Tech Stack:** Android Gradle Plugin 8.13.0, Groovy Gradle DSL, `local.properties`, `.gitignore` + +--- + +## File Structure +- Modify: `app/build.gradle` - `local.properties` 로더, release signing config, release task 검증을 추가한다. +- Modify: `.gitignore` - 키스토어 확장자 ignore 규칙을 활성화한다. +- Create: `docs/20260627_release_서명_정보_입력_구성/prd.md` - 요구사항을 기록한다. +- Create/Modify: `docs/20260627_release_서명_정보_입력_구성/plan-task.md` - 구현 계획과 검증 기록을 누적한다. + +### Phase 1: 문서 준비 +- [x] **Task 1.1: PRD 문서 작성** + - 파일: `docs/20260627_release_서명_정보_입력_구성/prd.md` + - 검증 기준: release signing 입력 위치, 비밀값 미커밋, 키스토어 ignore 요구사항이 명시되어야 한다. + - 검증 기록: 2026-06-27 문서 생성 시 요구사항을 PRD에 반영했다. + +- [x] **Task 1.2: 구현 계획 작성** + - 파일: `docs/20260627_release_서명_정보_입력_구성/plan-task.md` + - 검증 기준: 변경 파일, phase, task, 검증 명령이 명시되어야 한다. + - 검증 기록: 2026-06-27 구현 전 변경 파일과 검증 기준을 계획 문서에 기록했다. + +### Phase 2: release signing 입력 연결 +- [x] **Task 2.1: local.properties 기반 signing config 추가** + - 파일: `app/build.gradle` + - 구현 내용: + - `local.properties`를 `Properties`로 읽는다. + - `RELEASE_STORE_FILE`, `RELEASE_STORE_PASSWORD`, `RELEASE_KEY_ALIAS`, `RELEASE_KEY_PASSWORD`를 release signing config에 연결한다. + - `buildTypes.release`에 `signingConfig signingConfigs.release`를 지정한다. + - 검증 기준: + - `app/build.gradle`에 실제 비밀번호나 alias 값이 하드코딩되지 않아야 한다. + - `./gradlew tasks --all`이 성공해야 한다. + - 검증 기록: 2026-06-27 `app/build.gradle`에 `local.properties` 기반 release signing config를 추가하고 실제 비밀번호/alias 값은 하드코딩하지 않았다. `./gradlew tasks --all` 실행 결과 BUILD SUCCESSFUL을 확인했다. + +- [x] **Task 2.2: release task 누락 값 검증 추가** + - 파일: `app/build.gradle` + - 구현 내용: + - release 관련 task 실행 시 필수 property 누락 목록을 포함한 `GradleException`을 발생시킨다. + - debug 관련 task는 release signing 값이 없어도 실행 가능해야 한다. + - 검증 기준: + - `./gradlew :app:assembleRelease` 실행 시 실제 서명 값이 없으면 누락 property명을 안내해야 한다. + - `./gradlew tasks --all`은 release signing 값 없이도 성공해야 한다. + - 검증 기록: 2026-06-27 `./gradlew :app:assembleRelease` 실행 시 `RELEASE_STORE_FILE`, `RELEASE_STORE_PASSWORD`, `RELEASE_KEY_ALIAS`, `RELEASE_KEY_PASSWORD` 누락 안내와 함께 의도된 실패를 확인했다. `./gradlew :app:compileDebugKotlin`은 BUILD SUCCESSFUL로 완료되어 debug 경로가 release signing 값 없이 동작함을 확인했다. + +### Phase 3: git 비밀값 보호 +- [x] **Task 3.1: 키스토어 ignore 규칙 활성화** + - 파일: `.gitignore` + - 구현 내용: + - `*.jks`, `*.keystore`, `*.p12`, `*.pem`, `*.key`를 ignore한다. + - 기존 `local.properties` ignore 규칙은 유지한다. + - 검증 기준: + - `.gitignore`에 키스토어 확장자가 주석이 아닌 ignore 규칙으로 존재해야 한다. + - 검증 기록: 2026-06-27 `.gitignore`에서 `*.jks`, `*.keystore`, `*.p12`, `*.pem`, `*.key`가 주석이 아닌 ignore 규칙으로 존재함을 확인했다. 기존 `local.properties` ignore 규칙도 유지했다. + +### Phase 4: 검증 +- [x] **Task 4.1: Gradle 설정 검증** + - 파일: `docs/20260627_release_서명_정보_입력_구성/plan-task.md` + - 실행 명령: + - `./gradlew tasks --all` + - `./gradlew :app:assembleRelease` + - `./gradlew :app:compileDebugKotlin` + - 기대 결과: + - `tasks --all`은 성공한다. + - 실제 release signing 값이 없는 환경에서는 `assembleRelease`가 누락 property명을 포함한 오류로 실패한다. + - debug Kotlin 컴파일은 release signing 값 없이 성공한다. + - 검증 기록: 2026-06-27 `./gradlew tasks --all`은 BUILD SUCCESSFUL, `./gradlew :app:assembleRelease`는 release signing property 4개 누락 안내로 의도된 실패, `./gradlew :app:compileDebugKotlin`은 BUILD SUCCESSFUL을 확인했다. + +## Verification Log +- 2026-06-27: 구현 전 `app/build.gradle`에 `signingConfigs`가 없고 `.gitignore`에 `local.properties`가 ignore되어 있음을 확인했다. +- 2026-06-27: 최초 `./gradlew tasks --all` 검증에서 Gradle `plugins {}` 블록 앞 실행문 배치 오류를 확인했다. `local.properties` 로딩 코드를 `plugins {}` 뒤로 이동한 뒤 동일 명령이 BUILD SUCCESSFUL로 완료됐다. diff --git a/docs/20260627_release_서명_정보_입력_구성/prd.md b/docs/20260627_release_서명_정보_입력_구성/prd.md new file mode 100644 index 00000000..d8cff04d --- /dev/null +++ b/docs/20260627_release_서명_정보_입력_구성/prd.md @@ -0,0 +1,59 @@ +# PRD: release 서명 정보 입력 구성 + +## 1. Overview +`release` build variant를 실행할 수 있도록 Android release signing 입력 위치를 마련한다. + +## 2. Problem +- 현재 `app/build.gradle`에는 release signing 설정이 없어 Android Studio에서 `release` build variant 실행에 필요한 서명 정보를 연결할 수 없다. +- `build.gradle`에 key password, key store password, key alias를 직접 쓰면 저장소에 비밀값이 포함될 위험이 있다. +- git에 키스토어 파일이나 서명 비밀값이 포함되지 않아야 한다. + +## 3. Goals +- `local.properties`에 release 서명 정보를 입력할 수 있다. +- `app/build.gradle`에는 실제 key password, key store password, key alias 값이 남지 않는다. +- git ignore 규칙으로 키스토어 파일이 실수로 커밋되지 않도록 한다. +- release 빌드/실행 시 서명 정보가 누락되면 어떤 값을 입력해야 하는지 알 수 있는 오류를 제공한다. + +## 4. Non-Goals +- 실제 키스토어 파일이나 실제 비밀번호 값을 생성하거나 저장하지 않는다. +- 기존 `debug` build variant 설정은 변경하지 않는다. +- `BuildConfig`에 존재하는 기존 값 정리는 이번 범위에 포함하지 않는다. + +## 5. Target Users +- Android Studio에서 `release` build variant로 앱을 실행하거나 release APK/AAB를 생성해야 하는 개발자. + +## 6. User Stories +- 개발자는 `local.properties`에 `RELEASE_STORE_FILE`, `RELEASE_STORE_PASSWORD`, `RELEASE_KEY_ALIAS`, `RELEASE_KEY_PASSWORD`를 입력하고 release variant를 실행하고 싶다. +- 개발자는 서명 비밀값이 `build.gradle`이나 git에 포함되지 않기를 원한다. + +## 7. Core Features + +### Feature A: release signing properties +`app/build.gradle`에서 `local.properties`를 읽어 release signing config에 연결한다. + +#### Requirements +- `RELEASE_STORE_FILE`은 키스토어 파일 경로로 사용한다. +- `RELEASE_STORE_PASSWORD`는 key store password로 사용한다. +- `RELEASE_KEY_ALIAS`는 key alias로 사용한다. +- `RELEASE_KEY_PASSWORD`는 key password로 사용한다. +- 위 값은 `build.gradle`에 하드코딩하지 않는다. +- release 관련 Gradle task 실행 시 누락된 키가 있으면 명확한 오류를 발생시킨다. + +#### Edge Cases +- `local.properties`가 없거나 일부 값이 비어 있으면 debug 빌드 설정에는 영향을 주지 않는다. +- release 관련 task 실행 시 누락된 값 목록을 안내한다. + +### Feature B: git 비밀값 보호 +키스토어 확장자를 `.gitignore`에서 실제 ignore 대상으로 활성화한다. + +#### Requirements +- `*.jks`, `*.keystore`, `*.p12`, `*.pem`, `*.key`를 ignore한다. +- `local.properties`는 기존처럼 ignore 상태를 유지한다. + +## 8. Technical Constraints +- Android Gradle Groovy DSL인 `app/build.gradle`을 사용한다. +- 저장소 루트에서 Gradle 명령을 실행한다. +- 변경은 `app/build.gradle`, `.gitignore`, 작업 문서로 제한한다. + +## 9. Open Questions +- 없음. 키스토어 파일 경로까지 `local.properties`에 입력하는 설계로 진행한다.