Skip to content

Commit 6f7c689

Browse files
committed
ci: 新增 push/PR 构建门禁与发版质量校验
1 parent 0606537 commit 6f7c689

2 files changed

Lines changed: 87 additions & 0 deletions

File tree

.github/workflows/android-release.yml

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ jobs:
2222
steps:
2323
- name: Checkout
2424
uses: actions/checkout@v4
25+
with:
26+
# versionCode 由 build.gradle.kts 的 gitCommitCount() 取 git rev-list --count HEAD,
27+
# 浅克隆(默认 depth=1)会得到 1,必须拉完整历史,否则 Release APK 版本号错乱。
28+
fetch-depth: 0
2529

2630
- name: Set up JDK 17
2731
uses: actions/setup-java@v4
@@ -58,6 +62,30 @@ jobs:
5862
fi
5963
echo "✓ tag 与 versionName 一致: $ver_in_code(tag 后缀: ${tag_ver#$tag_base})"
6064
65+
# 校验 versionCode 单调递增:versionCode = git commit count,rebase/squash 改写历史
66+
# 可能让 commit count 变小,导致新版本 versionCode <= 旧版本、升级判定失效。
67+
# 取按提交时间倒序最近的非当前 tag,算其 commit count,要求当前 HEAD 更大。
68+
# 仅打 tag 触发时校验;workflow_dispatch(手动,无 tag)跳过。
69+
- name: Verify versionCode monotonic
70+
if: startsWith(github.ref, 'refs/tags/v')
71+
run: |
72+
set -e
73+
cur_vc=$(git rev-list --count HEAD)
74+
prev_tag=$(git tag --sort=-creatordate | grep -vE "^${GITHUB_REF_NAME}$" | head -1)
75+
if [[ -z "$prev_tag" ]]; then
76+
echo "无历史 tag,跳过 versionCode 单调校验(首次发版)"
77+
echo "当前 versionCode(commit count) = $cur_vc"
78+
exit 0
79+
fi
80+
prev_vc=$(git rev-list --count "$prev_tag")
81+
echo "上个 Release($prev_tag) versionCode = $prev_vc"
82+
echo "当前(${GITHUB_REF_NAME}) versionCode = $cur_vc"
83+
if [[ "$cur_vc" -le "$prev_vc" ]]; then
84+
echo "::error::versionCode 回退: 当前 $cur_vc <= 上个 Release($prev_tag) $prev_vc。通常因 rebase/squash 改写历史使 commit count 变小。请确保新版本在旧 tag 之上线性推进。"
85+
exit 1
86+
fi
87+
echo "✓ versionCode 单调递增: $prev_vc -> $cur_vc"
88+
6189
- name: Restore release keystore
6290
env:
6391
# keystore 文件以 base64 存入 Secret,避免二进制文件被破坏。
@@ -84,6 +112,11 @@ jobs:
84112
- name: Grant execute permission for gradlew
85113
run: chmod +x ./gradlew
86114

115+
# 发版质量门禁:跑单元测试,失败即中止,避免发出回归包。
116+
# 只跑 universal debug 变体:单测逻辑与 flavor 无关,跑全 flavor 6 变体是重复编译。
117+
- name: Run unit tests
118+
run: ./gradlew :app:testUniversalDebugUnitTest
119+
87120
# 一次性构建全部 flavor 的 release APK(universal/armsolo/x86solo)
88121
# --stacktrace:构建失败时输出完整调用栈,便于在 CI 定位 OOM/内存类根因。
89122
- name: Build all flavor Release APKs

.github/workflows/ci.yml

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
name: CI
2+
3+
# push 到 main 或 PR 时触发:构建 universal debug(单 flavor 冒烟)+ 跑单元测试。
4+
# 目的是合入前的兜底门禁,避免编译错误/回归推迟到打 tag 发版当天才暴露。
5+
# 打 v* tag 的发版构建走 android-release.yml,不在这里。
6+
on:
7+
push:
8+
branches: [ main ]
9+
pull_request:
10+
branches: [ main ]
11+
12+
# 同分支新提交到来时取消正在跑的旧 run,省 CI 额度。
13+
concurrency:
14+
group: ci-${{ github.ref }}
15+
cancel-in-progress: true
16+
17+
jobs:
18+
build:
19+
name: Build & Test
20+
runs-on: ubuntu-latest
21+
22+
steps:
23+
- name: Checkout
24+
uses: actions/checkout@v4
25+
with:
26+
# versionCode 由 build.gradle.kts 的 gitCommitCount() 在配置阶段取
27+
# git rev-list --count HEAD,浅克隆(默认 depth=1)会得到 1,必须拉完整历史。
28+
fetch-depth: 0
29+
30+
- name: Set up JDK 17
31+
uses: actions/setup-java@v4
32+
with:
33+
distribution: temurin
34+
java-version: '17'
35+
36+
- name: Set up Gradle
37+
uses: gradle/actions/setup-gradle@v4
38+
with:
39+
# PR 用只读缓存,仅 main 的 push 写回缓存,避免被 PR 污染。
40+
cache-read-only: ${{ github.ref != 'refs/heads/main' }}
41+
42+
- name: Grant execute permission for gradlew
43+
run: chmod +x ./gradlew
44+
45+
# 单 flavor 冒烟:只构 universal debug(CLAUDE.md 规范:AI 改完编译型代码默认跑这个),
46+
# 不构全量三 flavor,省三倍 Kotlin 编译。
47+
- name: Build universal debug (smoke)
48+
run: ./gradlew :app:assembleUniversalDebug --stacktrace
49+
50+
# 单元测试(app/src/test 下的 Kotlin 单测)。
51+
# 只跑 universal debug 变体:单测逻辑与 flavor 无关(flavor 仅影响 abiFilters/assets),
52+
# 跑全 flavor 6 变体是重复编译,无额外覆盖。
53+
- name: Run unit tests
54+
run: ./gradlew :app:testUniversalDebugUnitTest

0 commit comments

Comments
 (0)