-
Notifications
You must be signed in to change notification settings - Fork 21
182 lines (159 loc) · 6.62 KB
/
release.yml
File metadata and controls
182 lines (159 loc) · 6.62 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
name: Build and Release APK
on:
push:
tags:
- 'v*'
workflow_dispatch:
inputs:
version_tag:
description: '版本标签 (例如: v5.9)'
required: true
type: string
permissions:
contents: write
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '17'
cache: 'gradle'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Decode Keystore
env:
KEYSTORE_BASE64: ${{ secrets.KEYSTORE_BASE64 }}
run: |
echo $KEYSTORE_BASE64 | base64 -d > $GITHUB_WORKSPACE/app/keystore.jks
- name: Build Release APK
env:
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
run: |
./gradlew assembleRelease \
-Pandroid.injected.signing.store.file=$GITHUB_WORKSPACE/app/keystore.jks \
-Pandroid.injected.signing.store.password=$KEYSTORE_PASSWORD \
-Pandroid.injected.signing.key.alias=$KEY_ALIAS \
-Pandroid.injected.signing.key.password=$KEY_PASSWORD
- name: Get version info
id: version
run: |
VERSION_NAME=$(grep "versionName" app/build.gradle.kts | awk -F'"' '{print $2}')
VERSION_CODE=$(grep "versionCode" app/build.gradle.kts | awk -F'=' '{print $2}' | tr -d ' ')
echo "version_name=$VERSION_NAME" >> $GITHUB_OUTPUT
echo "version_code=$VERSION_CODE" >> $GITHUB_OUTPUT
# 获取 tag(push tag 或手动输入)
if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
echo "tag_name=${{ inputs.version_tag }}" >> $GITHUB_OUTPUT
else
echo "tag_name=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
fi
- name: Rename APK
run: |
mv app/build/outputs/apk/release/app-release.apk \
app/build/outputs/apk/release/CloudFlareAssistant-v${{ steps.version.outputs.version_name }}.apk
- name: Prepare Release Notes
id: release_notes
run: |
TAG_NAME="${{ steps.version.outputs.tag_name }}"
# 检查是否存在对应的 release notes 文件
RELEASE_NOTES_FILE="RELEASE_NOTES_${TAG_NAME}.md"
if [ -f "$RELEASE_NOTES_FILE" ]; then
echo "使用 $RELEASE_NOTES_FILE 作为发布说明"
# 读取文件内容,添加版本信息头部
{
echo "## 🎉 CloudFlare Assistant ${TAG_NAME} 发布"
echo ""
echo "**版本号**: ${{ steps.version.outputs.version_name }}"
echo "**Build**: ${{ steps.version.outputs.version_code }}"
echo ""
cat "$RELEASE_NOTES_FILE"
echo ""
} > release_notes.md
else
echo "未找到 $RELEASE_NOTES_FILE,使用默认模板"
{
echo "## 🎉 新版本发布"
echo ""
echo "**版本号**: ${{ steps.version.outputs.version_name }}"
echo "**Build**: ${{ steps.version.outputs.version_code }}"
echo ""
echo "### 📥 下载"
echo "点击下方的 APK 文件即可下载安装(已签名)"
echo ""
echo "### 📦 安装要求"
echo "- 最低 Android 版本: 8.0 (API 26)"
echo "- 目标 Android 版本: 16 (API 36)"
echo ""
echo "### 🔐 签名信息"
echo "此版本已使用开发者证书签名,可以直接安装使用。"
} > release_notes.md
fi
- name: Create Release
id: create_release
uses: softprops/action-gh-release@v1
with:
tag_name: ${{ steps.version.outputs.tag_name }}
files: app/build/outputs/apk/release/CloudFlareAssistant-v${{ steps.version.outputs.version_name }}.apk
body_path: release_notes.md
draft: false
prerelease: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Send APK to Telegram
if: success()
env:
TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }}
TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }}
TELEGRAM_TOPIC_ID: ${{ secrets.TELEGRAM_TOPIC_ID }}
run: |
TAG_NAME="${{ steps.version.outputs.tag_name }}"
VERSION_NAME="${{ steps.version.outputs.version_name }}"
VERSION_CODE="${{ steps.version.outputs.version_code }}"
RELEASE_URL="https://github.com/${{ github.repository }}/releases/tag/${TAG_NAME}"
APK_FILE="app/build/outputs/apk/release/CloudFlareAssistant-v${VERSION_NAME}.apk"
# 读取发布说明(简化版本)
RELEASE_NOTES_FILE="RELEASE_NOTES_${TAG_NAME}.md"
if [ -f "$RELEASE_NOTES_FILE" ]; then
# 只提取标题行(以 # 或 - 开头),避免技术细节中的特殊字符
NOTES=$(grep -E '^(##|###|-\s+\*\*)' "$RELEASE_NOTES_FILE" | head -n 15 | sed 's/^##* //' | sed 's/\*\*//g' | sed 's/&/\&/g; s/</\</g; s/>/\>/g')
else
NOTES="新版本发布"
fi
# 构建 Telegram 消息
CAPTION="🎉 <b>CloudFlare Assistant ${TAG_NAME} 发布</b>
📱 <b>版本信息</b>
• 版本号: ${VERSION_NAME}
• Build: ${VERSION_CODE}
• 发布日期: $(date +'%Y年%m月%d日')
${NOTES}
🔗 <b>相关链接</b>
<a href=\"${RELEASE_URL}\">📄 查看完整发布说明</a>
📦 <b>安装要求</b>
• 最低版本: Android 8.0 (API 26)
• 目标版本: Android 16 (API 36)"
# 发送 APK 文件到 Telegram(支持话题)
echo "📤 正在发送 APK 文件到 Telegram..."
if [ -n "$TELEGRAM_TOPIC_ID" ]; then
# 发送到指定话题
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendDocument" \
-F "chat_id=${TELEGRAM_CHAT_ID}" \
-F "message_thread_id=${TELEGRAM_TOPIC_ID}" \
-F "document=@${APK_FILE}" \
-F "caption=${CAPTION}" \
-F "parse_mode=HTML"
else
# 发送到群组主聊天
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendDocument" \
-F "chat_id=${TELEGRAM_CHAT_ID}" \
-F "document=@${APK_FILE}" \
-F "caption=${CAPTION}" \
-F "parse_mode=HTML"
fi
echo "✅ APK 文件和发布说明已发送到 Telegram"