-
Notifications
You must be signed in to change notification settings - Fork 5
204 lines (180 loc) · 7.42 KB
/
Copy pathrelease.yml
File metadata and controls
204 lines (180 loc) · 7.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
name: Release APK
on:
push:
branches: [main, master]
paths:
- 'app/build.gradle.kts'
workflow_dispatch:
permissions:
contents: write
jobs:
check-version-change:
name: Check version change
runs-on: ubuntu-latest
outputs:
version_changed: ${{ steps.check.outputs.version_changed }}
old_version_code: ${{ steps.check.outputs.old_version_code }}
old_version_name: ${{ steps.check.outputs.old_version_name }}
new_version_code: ${{ steps.check.outputs.new_version_code }}
new_version_name: ${{ steps.check.outputs.new_version_name }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 2
- name: Check if versionCode changed
id: check
run: |
# 获取当前版本号和版本名
CURRENT_VERSION_CODE=$(grep -E 'versionCode = ' app/build.gradle.kts | sed 's/.*versionCode = \([0-9]*\).*/\1/')
CURRENT_VERSION_NAME=$(grep -E '^val releaseVersionName = "' app/build.gradle.kts | sed 's/.*"\([^"]*\)".*/\1/')
echo "new_version_code=$CURRENT_VERSION_CODE" >> $GITHUB_OUTPUT
echo "new_version_name=$CURRENT_VERSION_NAME" >> $GITHUB_OUTPUT
echo "Current version: $CURRENT_VERSION_NAME (code: $CURRENT_VERSION_CODE)"
# 检查是否有足够的提交历史
if git rev-parse HEAD~1 >/dev/null 2>&1; then
# 获取上一个提交的版本号
PREV_VERSION_CODE=$(git show HEAD~1:app/build.gradle.kts 2>/dev/null | grep -E 'versionCode = ' | sed 's/.*versionCode = \([0-9]*\).*/\1/' || echo "")
PREV_VERSION_NAME=$(git show HEAD~1:app/build.gradle.kts 2>/dev/null | grep -E '^val releaseVersionName = "' | sed 's/.*"\([^"]*\)".*/\1/' || echo "")
echo "old_version_code=$PREV_VERSION_CODE" >> $GITHUB_OUTPUT
echo "old_version_name=$PREV_VERSION_NAME" >> $GITHUB_OUTPUT
echo "Previous version: $PREV_VERSION_NAME (code: $PREV_VERSION_CODE)"
# 检查版本号是否增加
if [ -n "$PREV_VERSION_CODE" ] && [ "$CURRENT_VERSION_CODE" -gt "$PREV_VERSION_CODE" ]; then
echo "version_changed=true" >> $GITHUB_OUTPUT
echo "Version code increased from $PREV_VERSION_CODE to $CURRENT_VERSION_CODE"
else
echo "version_changed=false" >> $GITHUB_OUTPUT
echo "No version code increase detected"
fi
else
echo "old_version_code=" >> $GITHUB_OUTPUT
echo "old_version_name=" >> $GITHUB_OUTPUT
echo "version_changed=false" >> $GITHUB_OUTPUT
echo "First commit, skipping release"
fi
build-release:
name: Build Release APK
runs-on: ubuntu-latest
needs: check-version-change
if: needs.check-version-change.outputs.version_changed == 'true'
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '17'
cache: gradle
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
- name: Make gradlew executable
run: chmod +x ./gradlew
- name: Decode release keystore
env:
KEYSTORE_BASE64: ${{ secrets.RELEASE_KEYSTORE_BASE64 }}
run: |
mkdir -p signing
echo "$KEYSTORE_BASE64" | base64 -d > signing/linecode-release.keystore
ls -la signing
- name: Write signing.properties
env:
STORE_PASSWORD: ${{ secrets.RELEASE_STORE_PASSWORD }}
KEY_ALIAS: ${{ secrets.RELEASE_KEY_ALIAS }}
KEY_PASSWORD: ${{ secrets.RELEASE_KEY_PASSWORD }}
run: |
{
printf 'storeFile=%s/signing/linecode-release.keystore\n' "$GITHUB_WORKSPACE"
printf 'storePassword=%s\n' "$STORE_PASSWORD"
printf 'keyAlias=%s\n' "$KEY_ALIAS"
printf 'keyPassword=%s\n' "$KEY_PASSWORD"
} > signing.properties
cat signing.properties
- name: Validate signing config
run: ./gradlew :app:validateReleaseSigning
- name: Run unit tests
run: ./gradlew :app:testDebugUnitTest
- name: Run lint
run: ./gradlew :app:lintDebug
- name: Build release APK
run: ./gradlew :app:assembleRelease
- name: Get version info
id: version
run: |
VERSION_NAME=$(grep -E '^val releaseVersionName = "' app/build.gradle.kts | sed 's/.*"\([^"]*\)".*/\1/')
VERSION_CODE=$(grep -E 'versionCode = ' app/build.gradle.kts | sed 's/.*versionCode = \([0-9]*\).*/\1/')
echo "version_name=$VERSION_NAME" >> $GITHUB_OUTPUT
echo "version_code=$VERSION_CODE" >> $GITHUB_OUTPUT
echo "Version: $VERSION_NAME ($VERSION_CODE)"
- name: Upload release APK
uses: actions/upload-artifact@v4
with:
name: LineCode-Pro-v${{ steps.version.outputs.version_name }}
path: app/release/*.APK
if-no-files-found: error
retention-days: 90
- name: Upload release APK signature
uses: actions/upload-artifact@v4
with:
name: LineCode-Pro-v${{ steps.version.outputs.version_name }}-idsig
path: app/release/*.idsig
if-no-files-found: warn
retention-days: 90
- name: Generate release notes
id: notes
env:
NEW_VERSION_NAME: ${{ needs.check-version-change.outputs.new_version_name }}
run: |
# 从 update.md 提取当前版本的更新内容(仅保留当前版本块,不包含历史)
if [ -f update.md ]; then
awk -v target="## v${NEW_VERSION_NAME}" '
/^## v/ {
if ($0 == target) { in_block = 1 }
else if (in_block) { in_block = 0 }
}
in_block { print }
' update.md > version_notes.md || echo "" > version_notes.md
else
echo "" > version_notes.md
fi
# 生成发布说明
{
echo "## LineCode Pro v${NEW_VERSION_NAME}"
echo ""
echo "### 版本信息"
echo "- 版本名称: v${NEW_VERSION_NAME}"
echo "- 版本号: ${{ steps.version.outputs.version_code }}"
echo ""
if [ -s version_notes.md ]; then
cat version_notes.md
else
echo "### 最近更新"
git log --oneline HEAD~5..HEAD || echo "No recent commits"
fi
echo ""
echo "---"
echo ""
echo "### 下载说明"
echo "- \`LineCode Pro ${NEW_VERSION_NAME}.APK\` - Release APK"
echo "- \`LineCode Pro ${NEW_VERSION_NAME}.APK.idsig\` - APK 签名文件"
} > release_notes.md
echo "release_notes_file=release_notes.md" >> $GITHUB_OUTPUT
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: v${{ steps.version.outputs.version_name }}
name: LineCode Pro v${{ steps.version.outputs.version_name }}
body_path: release_notes.md
draft: false
prerelease: false
files: |
app/release/*.APK
app/release/*.idsig
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Cleanup signing files
if: always()
run: |
rm -rf signing
rm -f signing.properties