Skip to content

Commit f2e42e9

Browse files
committed
ci: add release workflow for APK builds
1 parent 1a66415 commit f2e42e9

3 files changed

Lines changed: 110 additions & 9 deletions

File tree

.github/workflows/ci.yml

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,30 @@
1-
name: ci
2-
on: [push, pull_request]
1+
name: CI
2+
3+
on:
4+
push:
5+
pull_request:
6+
7+
permissions:
8+
contents: read
9+
10+
concurrency:
11+
group: ci-${{ github.ref }}
12+
cancel-in-progress: true
13+
314
jobs:
415
build:
516
runs-on: ubuntu-latest
617
steps:
7-
- uses: actions/checkout@v2
18+
- uses: actions/checkout@v4
819
with:
920
submodules: recursive
10-
- uses: actions/setup-java@v1
21+
- uses: gradle/actions/wrapper-validation@v3
22+
- uses: actions/setup-java@v4
1123
with:
12-
java-version: 17
13-
- name: Create google json
14-
run: echo '${{ secrets.GOOGLE_JSON }}' | base64 --decode > app/google-services.json
15-
- uses: gradle/wrapper-validation-action@v1
16-
- run: ./gradlew build
24+
distribution: temurin
25+
java-version: '17'
26+
cache: gradle
27+
- name: Grant execute permission for gradlew
28+
run: chmod +x gradlew
29+
- name: Build debug app and unit tests
30+
run: ./gradlew --no-daemon testDebugUnitTest assembleDebug

.github/workflows/release.yml

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
name: Release APK
2+
3+
on:
4+
workflow_dispatch:
5+
push:
6+
tags:
7+
- 'v*'
8+
9+
permissions:
10+
contents: write
11+
12+
concurrency:
13+
group: release-${{ github.ref }}
14+
cancel-in-progress: false
15+
16+
jobs:
17+
release:
18+
runs-on: ubuntu-latest
19+
steps:
20+
- uses: actions/checkout@v4
21+
with:
22+
submodules: recursive
23+
24+
- uses: gradle/actions/wrapper-validation@v3
25+
26+
- uses: actions/setup-java@v4
27+
with:
28+
distribution: temurin
29+
java-version: '17'
30+
cache: gradle
31+
32+
- name: Grant execute permission for gradlew
33+
run: chmod +x gradlew
34+
35+
- name: Build release APK
36+
run: ./gradlew --no-daemon assembleRelease
37+
38+
- name: Sign APK
39+
if: ${{ secrets.KEYSTORE_BASE64 != '' && secrets.KEY_ALIAS != '' && secrets.KEYSTORE_PASSWORD != '' && secrets.KEY_PASSWORD != '' }}
40+
id: sign_app
41+
uses: r0adkll/sign-android-release@v1
42+
with:
43+
releaseDirectory: app/build/outputs/apk/release
44+
signingKeyBase64: ${{ secrets.KEYSTORE_BASE64 }}
45+
alias: ${{ secrets.KEY_ALIAS }}
46+
keyStorePassword: ${{ secrets.KEYSTORE_PASSWORD }}
47+
keyPassword: ${{ secrets.KEY_PASSWORD }}
48+
49+
- name: Select APK artifact
50+
id: artifact
51+
shell: bash
52+
run: |
53+
signed_path="${{ steps.sign_app.outputs.signedReleaseFile }}"
54+
if [ -n "$signed_path" ]; then
55+
artifact_path="$signed_path"
56+
release_body=""
57+
else
58+
artifact_path="app/build/outputs/apk/release/app-release-unsigned.apk"
59+
release_body="> Note: This APK is unsigned because signing secrets were not configured for this workflow run."
60+
fi
61+
62+
echo "path=$artifact_path" >> "$GITHUB_OUTPUT"
63+
echo "name=$(basename "$artifact_path")" >> "$GITHUB_OUTPUT"
64+
65+
{
66+
echo "body<<EOF"
67+
echo "$release_body"
68+
echo "EOF"
69+
} >> "$GITHUB_OUTPUT"
70+
71+
- name: Upload APK artifact
72+
if: ${{ github.event_name == 'workflow_dispatch' }}
73+
uses: actions/upload-artifact@v4
74+
with:
75+
name: ${{ steps.artifact.outputs.name }}
76+
path: ${{ steps.artifact.outputs.path }}
77+
78+
- name: Publish GitHub release
79+
if: ${{ startsWith(github.ref, 'refs/tags/') }}
80+
uses: softprops/action-gh-release@v2
81+
with:
82+
files: ${{ steps.artifact.outputs.path }}
83+
generate_release_notes: true
84+
body: ${{ steps.artifact.outputs.body }}

docs/maintenance/implementation-log.ko.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
| --- | --- | --- | --- | --- |
99
| 빌드 기준선 복구 | 테스트 가능 기준선을 다시 세우고 유지보수 문서 세트를 추가 | 이후 이슈 작업 전에 재현, 분류, 검증 흐름을 고정할 수 있게 기반을 만들었다 | `agent.md`, `docs/maintenance/issue-triage.md`, `docs/maintenance/roadmap.md`, `docs/maintenance/anonymization-and-security.md`, `README.md` | 완료 |
1010
| 최신 Android 타게팅 필요 | `compileSdk``targetSdkVersion`을 35로 상향 | Play 최신 요구사항에 맞는 방향으로 기준선을 끌어올렸다. 아직 AGP 자체 업그레이드는 후속 작업이다 | `app/build.gradle`, `gradle.properties` | 완료 |
11+
| 이슈 `#719`, PR `#726` 릴리스 경로 부재 | tag push와 manual dispatch를 지원하는 `release.yml`을 추가하고 기존 CI를 최신 action 버전으로 정리 | 최신 브랜치에서 unsigned/signed APK를 GitHub Actions로 다시 만들고 배포할 수 있는 운영 경로를 복구했다 | `.github/workflows/ci.yml`, `.github/workflows/release.yml` | 완료 |
1112
| 저장소 정책 현대화 착수, 이슈 `#95` 대응 기반 | SAF 기반 선택 경로를 도입하고 `content://` 입력을 앱 내부 import 파일로 저장 | 외부 절대경로 전제를 줄이고, 재시작 이후에도 다시 열 수 있는 URI 권한 흐름을 시작했다 | `app/src/main/java/com/kyhsgeekcode/filechooser/NewFileChooserActivity.kt`, `app/src/main/java/com/kyhsgeekcode/disassembler/viewmodel/MainViewModel.kt`, `app/src/main/java/com/kyhsgeekcode/disassembler/PermissionUtils.kt` | 진행 중 |
1213
| broad storage 우회 경로 정리 | 더 이상 쓰지 않는 legacy picker 코드와 Android 11+의 `MANAGE_ALL_FILES_ACCESS` 유도 설정을 제거 | SAF 기반 경로를 기본 흐름으로 고정하고, 정책상 불리한 all-files access 진입점을 줄였다 | `app/src/main/java/com/kyhsgeekcode/disassembler/MainActivity.kt`, `app/src/main/java/com/kyhsgeekcode/disassembler/preference/SettingsFragment.kt`, `app/src/main/res/xml/pref_settings.xml`, `app/src/main/res/xml-v30/pref_settings.xml`, `app/src/main/res/values/array.xml` | 완료 |
1314
| 프로젝트 저장 모델 확장 | `sourceDescriptor`를 추가하고 새 프로젝트 생성 시 원본 유형을 함께 기록 | 기존 `sourceFilePath` 호환성은 유지하면서 이후 `Uri | file path | cache` 구분으로 넘어갈 발판을 만들었다 | `app/src/main/java/com/kyhsgeekcode/disassembler/project/models/ProjectModel.kt`, `app/src/main/java/com/kyhsgeekcode/disassembler/project/ProjectManager.kt`, `app/src/main/java/com/kyhsgeekcode/disassembler/viewmodel/MainViewModel.kt` | 완료 |
@@ -27,9 +28,11 @@
2728
| --- | --- | --- |
2829
| `./gradlew help` | 통과 | JDK 17 기준 |
2930
| `./gradlew testDebugUnitTest assembleDebug` | 통과 | JDK 17 기준 |
31+
| `./gradlew assembleRelease` | 통과 | unsigned release APK 생성 확인 |
3032
| 문서 비식별화 점검 | 통과 | 새 문서에는 저장소 상대 경로만 기록 |
3133
| 파워유저 import entry-point 테스트 | 통과 | standard mode는 SAF only, power-user mode는 advanced import 추가 |
3234
| 파워유저 advanced source catalog 테스트 | 통과 | power-user 비활성 시 advanced source 없음, 활성 시 선택된 source group만 노출 |
35+
| workflow YAML 파싱 | 통과 | `.github/workflows/ci.yml`, `.github/workflows/release.yml` 모두 Ruby YAML 파서 기준 확인 |
3336

3437
## 다음 웨이브 후보
3538

0 commit comments

Comments
 (0)