Skip to content

Commit 514db0f

Browse files
committed
ci: add beta release workflow to development
1 parent 70bf4d2 commit 514db0f

1 file changed

Lines changed: 199 additions & 0 deletions

File tree

‎.github/workflows/android-beta.yml‎

Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
1+
name: Android Beta
2+
3+
on:
4+
push:
5+
branches:
6+
- beta
7+
paths:
8+
- 'app/**'
9+
- 'player/**'
10+
- 'baseline-profile/**'
11+
- 'gradle/**'
12+
- '*.gradle.kts'
13+
- 'gradle.properties'
14+
- 'settings.gradle.kts'
15+
pull_request:
16+
branches:
17+
- beta
18+
paths:
19+
- 'app/**'
20+
- 'player/**'
21+
- 'baseline-profile/**'
22+
- 'gradle/**'
23+
- '*.gradle.kts'
24+
- 'gradle.properties'
25+
- 'settings.gradle.kts'
26+
workflow_dispatch:
27+
28+
permissions:
29+
contents: read
30+
31+
concurrency:
32+
group: android-beta
33+
cancel-in-progress: false
34+
35+
env:
36+
CI: true
37+
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
38+
JAVA_TOOL_OPTIONS: -Djava.awt.headless=true
39+
GRADLE_OPTS: -Dorg.gradle.workers.max=8 -Dorg.gradle.daemon.idletimeout=900000
40+
ANDROID_HOME: /opt/android-sdk
41+
ANDROID_SDK_ROOT: /opt/android-sdk
42+
JAVA_HOME: /usr/lib/jvm/java-26-openjdk
43+
GRADLE_USER_HOME: /var/tmp/typetype-android-gradle-user-home
44+
GITHUB_REPO: TypeType-Video/TypeType-Android
45+
46+
jobs:
47+
release:
48+
runs-on: [self-hosted, Linux, X64, ci-stack, android]
49+
timeout-minutes: 35
50+
permissions:
51+
contents: write
52+
steps:
53+
- name: Checkout
54+
uses: actions/checkout@v7.0.1
55+
56+
- name: Install Android SDK platform
57+
run: |
58+
platform="$ANDROID_HOME/platforms/android-37.0"
59+
(
60+
flock 9
61+
if [ ! -f "$platform/android.jar" ]; then
62+
rm -rf "$platform"
63+
"$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager" \
64+
--sdk_root="$ANDROID_HOME" \
65+
"platforms;android-37.0"
66+
fi
67+
test -f "$platform/android.jar"
68+
) 9>"$ANDROID_HOME/.platform-install.lock"
69+
70+
- name: Validate beta release version
71+
env:
72+
GH_TOKEN: ${{ github.token }}
73+
run: |
74+
version_name="$(sed -nE 's/^[[:space:]]*versionName = "([^"]+)"/\1/p' app/build.gradle.kts)"
75+
version_code="$(sed -nE 's/^[[:space:]]*versionCode = ([0-9]+)/\1/p' app/build.gradle.kts)"
76+
release_tag="v${version_name}"
77+
78+
[[ "$version_name" =~ ^[0-9]+\.[0-9]+\.[0-9]+-beta\.[1-9][0-9]*$ ]]
79+
[[ "$version_code" =~ ^[1-9][0-9]*$ ]]
80+
81+
latest_code="$(
82+
gh api \
83+
-H 'Accept: application/vnd.github+json' \
84+
--paginate "repos/${GITHUB_REPO}/releases" \
85+
--jq '.[] | select(.draft == false and .prerelease == true) | .assets[]?.name | capture("^dev\\.typetype\\.android_(?<code>[0-9]+)\\.apk$").code' \
86+
2>/dev/null | sort -nu | tail -n 1
87+
)"
88+
latest_code="${latest_code:-0}"
89+
90+
if [ "$version_code" -le "$latest_code" ]; then
91+
echo "versionCode $version_code must be greater than latest beta $latest_code" >&2
92+
exit 1
93+
fi
94+
95+
if gh api "repos/${GITHUB_REPO}/git/ref/tags/${release_tag}" > /dev/null 2>&1; then
96+
echo "Tag ${release_tag} already exists" >&2
97+
exit 1
98+
fi
99+
100+
{
101+
echo "RELEASE_VERSION=${version_name}"
102+
echo "RELEASE_CODE=${version_code}"
103+
echo "RELEASE_TAG=${release_tag}"
104+
} >> "$GITHUB_ENV"
105+
106+
- name: Prepare signing
107+
env:
108+
ANDROID_KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
109+
ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
110+
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
111+
ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
112+
run: |
113+
test -n "$ANDROID_KEYSTORE_BASE64"
114+
test -n "$ANDROID_KEYSTORE_PASSWORD"
115+
test -n "$ANDROID_KEY_ALIAS"
116+
test -n "$ANDROID_KEY_PASSWORD"
117+
printf '%s' "$ANDROID_KEYSTORE_BASE64" | base64 --decode > release.keystore
118+
{
119+
printf 'storeFile=%s\n' "$PWD/release.keystore"
120+
printf 'storePassword=%s\n' "$ANDROID_KEYSTORE_PASSWORD"
121+
printf 'keyAlias=%s\n' "$ANDROID_KEY_ALIAS"
122+
printf 'keyPassword=%s\n' "$ANDROID_KEY_PASSWORD"
123+
} > keystore.properties
124+
125+
- name: Verify and build beta release
126+
timeout-minutes: 25
127+
run: |
128+
./gradlew --build-cache --stacktrace \
129+
:baseline-profile:assemble \
130+
:player:testDebugUnitTest \
131+
:app:testDebugUnitTest \
132+
:player:lintDebug \
133+
:app:lintDebug \
134+
:app:assembleDebug \
135+
:app:assembleRelease
136+
137+
- name: Upload lint report
138+
if: ${{ always() }}
139+
uses: actions/upload-artifact@v7.0.1
140+
with:
141+
name: typetype-beta-lint-report
142+
path: |
143+
app/build/reports/lint-results-debug.html
144+
player/build/reports/lint-results-debug.html
145+
if-no-files-found: ignore
146+
retention-days: 14
147+
148+
- name: Verify and prepare beta APK
149+
run: |
150+
mkdir -p artifacts
151+
apk="$(find app/build/outputs/apk/release -name '*.apk' | head -n 1)"
152+
test -n "$apk"
153+
build_tools="$(find "$ANDROID_HOME/build-tools" -mindepth 1 -maxdepth 1 -type d | sort -V | tail -n 1)"
154+
test -n "$build_tools"
155+
156+
"$build_tools/zipalign" -c -P 16 -v 4 "$apk"
157+
"$build_tools/apksigner" verify --verbose --print-certs "$apk"
158+
159+
apk_application_id="$("$ANDROID_HOME/cmdline-tools/latest/bin/apkanalyzer" manifest application-id "$apk")"
160+
apk_version="$("$ANDROID_HOME/cmdline-tools/latest/bin/apkanalyzer" manifest version-name "$apk")"
161+
apk_code="$("$ANDROID_HOME/cmdline-tools/latest/bin/apkanalyzer" manifest version-code "$apk")"
162+
test "$apk_application_id" = "dev.typetype.android"
163+
test "$apk_version" = "$RELEASE_VERSION"
164+
test "$apk_code" = "$RELEASE_CODE"
165+
166+
cp "$apk" "artifacts/dev.typetype.android_${RELEASE_CODE}.apk"
167+
(
168+
cd artifacts
169+
sha256sum "dev.typetype.android_${RELEASE_CODE}.apk" \
170+
> "dev.typetype.android_${RELEASE_CODE}.apk.sha256"
171+
sha256sum -c "dev.typetype.android_${RELEASE_CODE}.apk.sha256"
172+
)
173+
174+
- name: Upload beta APK
175+
uses: actions/upload-artifact@v7.0.1
176+
with:
177+
name: typetype-beta-apk
178+
path: |
179+
artifacts/*.apk
180+
artifacts/*.sha256
181+
if-no-files-found: error
182+
compression-level: 0
183+
retention-days: 30
184+
185+
- name: Publish GitHub prerelease
186+
if: ${{ github.event_name != 'pull_request' }}
187+
uses: softprops/action-gh-release@v2
188+
with:
189+
tag_name: ${{ env.RELEASE_TAG }}
190+
name: TypeType Android ${{ env.RELEASE_VERSION }}
191+
body: ${{ github.event.head_commit.message }}
192+
prerelease: true
193+
make_latest: false
194+
generate_release_notes: false
195+
target_commitish: beta
196+
files: |
197+
artifacts/*.apk
198+
artifacts/*.sha256
199+
fail_on_unmatched_files: true

0 commit comments

Comments
 (0)