新增:是否加入SmsF预览体验计划(在线更新每周构建版) #416

pull/436/head
pppscn 3 months ago
parent f0ef8e9dcd
commit 0036044d54

@ -23,7 +23,7 @@ jobs:
- name: Delete Weekly Build
uses: Mattraks/delete-workflow-runs@v2
with:
token: ${{ github.token }}
token: ${{ secrets.TOKEN }}
repository: ${{ github.repository }}
retain_days: 0 # 全部删除只留正在跑的一条
keep_minimum_runs: 0 # 全部删除只留正在跑的一条
@ -45,39 +45,84 @@ jobs:
# 打包release
- name: Build with Gradle
run: bash ./gradlew assembleRelease
# 存档打包的文件以便后续上传TODO: 看起来有点笨,有没有更好的方法?
- name: Init APP Version Name
# 自动发布预览计划
- name: Parse output-metadata.json and upload APKs to XUpdate
run: |
echo "ver_name=$(grep -m 1 '\"versionName\":' ${{ env.output }}//output-metadata.json | grep -oP '\"versionName\": \"\K[^\"]+')" >> $GITHUB_ENV
echo "ver_code=$(grep -m 1 '\"versionCode\":' ${{ env.output }}//output-metadata.json | grep -oP '\"versionCode\": \K\d+' | tail -c 4)" >> $GITHUB_ENV
echo "ver_date=$(grep -m 1 '\"outputFile\":' ${{ env.output }}//output-metadata.json | grep -oP '\"outputFile\": \"[^\"]+' | grep -oP '\d{8}')" >> $GITHUB_ENV
metadata_file="${{ env.output }}/output-metadata.json"
applicationId=$(jq -r '.applicationId' "$metadata_file")
buildDate=$(jq -r '.buildDate' "$metadata_file")
buildTime=$(jq -r '.buildTime' "$metadata_file")
gitCommitId=$(jq -r '.gitCommitId' "$metadata_file")
# 遍历 elements并从 outputFile 中提取 versionName 和 versionCode
jq -r '.elements | sort_by(.outputFile) | .[].outputFile' "$metadata_file" |
while IFS= read -r apk; do
echo "APK: $apk"
# 使用正则表达式从文件名中提取 versionName、versionCode 和 ABI
if [[ $apk =~ SmsF_([^_]+)_([^_]+)_(.+)_release.apk ]]; then
versionName="${BASH_REMATCH[1]}"
versionCode="${BASH_REMATCH[2]}"
abi="${BASH_REMATCH[3]}"
echo "ver_name=$versionName" >> $GITHUB_ENV
echo "ver_code=${versionCode: -3}" >> $GITHUB_ENV
response=$(curl --retry 3 -X POST -H "Cache-Control: no-cache" \
-H "Content-Type: application/json" \
-H "Cookie: xupdate_token=${{ secrets.XUPDATE_TOKEN }}" \
-H "X-Token: ${{ secrets.X_TOKEN }}" \
-d "{\"appKey\":\"${applicationId}\",\"versionName\":\"${versionName}\",\"versionCode\":\"${versionCode}\",\"modifyContent\":\"\",\"updateStatus\":1,\"gitCommitId\":\"${gitCommitId}\",\"buildTime\":\"${buildTime}\",\"uploadTime\":\"${buildTime}\"}" \
${{ secrets.URL_ADD_VERSION }})
version_id=$(echo $response | grep -oP '"versionId":\s*\K\d+') # 提取versionId
echo "versionId: $version_id"
if [[ $version_id =~ ^[0-9]+$ ]]; then
curl --retry 3 -X POST -H "Cache-Control: no-cache" \
-H "Content-Type: multipart/form-data" \
-H "Cookie: xupdate_token=${{ secrets.XUPDATE_TOKEN }}" \
-H "X-Token: ${{ secrets.X_TOKEN }}" \
-F "file=@${{ env.output }}/${apk};filename=${apk}" \
-F "versionId=${version_id}" \
${{ secrets.URL_UPLOAD_APK }}
# If upload is successful, set success to true to exit the retry loop
if [[ $? -eq 0 ]]; then
success=true
fi
else
echo "Error: version_id is not a valid number. skip upload apk"
fi
fi
done
# 存档打包的文件以便后续上传TODO: 看起来有点笨,有没有更好的方法?
- name: Upload App To Artifact universal
if: success () || failure ()
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: "SmsF_${{ env.ver_name }}_100${{ env.ver_code }}_universal_${{ env.ver_date }}_release.apk"
path: "${{ env.output }}//SmsF_*_universal_*.apk"
name: "SmsF_${{ env.ver_name }}_100${{ env.ver_code }}_universal_release.apk"
path: "${{ env.output }}/SmsF_*_universal_*.apk"
- name: Upload App To Artifact armeabi-v7a
if: success () || failure ()
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: "SmsF_${{ env.ver_name }}_200${{ env.ver_code }}_armeabi-v7a_${{ env.ver_date }}_release.apk"
name: "SmsF_${{ env.ver_name }}_200${{ env.ver_code }}_armeabi-v7a_release.apk"
path: "${{ env.output }}//SmsF_*_armeabi-v7a_*.apk"
- name: Upload App To Artifact arm64-v8a
if: success () || failure ()
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: "SmsF_${{ env.ver_name }}_300${{ env.ver_code }}_arm64-v8a_${{ env.ver_date }}_release.apk"
name: "SmsF_${{ env.ver_name }}_300${{ env.ver_code }}_arm64-v8a_release.apk"
path: "${{ env.output }}//SmsF_*_arm64-v8a_*.apk"
- name: Upload App To Artifact x86
if: success () || failure ()
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: "SmsF_${{ env.ver_name }}_400${{ env.ver_code }}_x86_${{ env.ver_date }}_release.apk"
path: "${{ env.output }}//SmsF_*_x86_${{ env.ver_date }}_*.apk"
name: "SmsF_${{ env.ver_name }}_400${{ env.ver_code }}_x86_release.apk"
path: "${{ env.output }}//SmsF_*_x86_*.apk"
- name: Upload App To Artifact x86_64
if: success () || failure ()
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: "SmsF_${{ env.ver_name }}_500${{ env.ver_code }}_x86_64_${{ env.ver_date }}_release.apk"
path: "${{ env.output }}//SmsF_*_x86_64_${{ env.ver_date }}_*.apk"
name: "SmsF_${{ env.ver_name }}_500${{ env.ver_code }}_x86_64_release.apk"
path: "${{ env.output }}//SmsF_*_x86_64_*.apk"

@ -1,5 +1,8 @@
//file:noinspection GrDeprecatedAPIUsage
//file:noinspection DependencyNotationArgument
import groovy.json.JsonBuilder
import groovy.json.JsonSlurper
plugins {
id 'com.android.application'
id 'kotlin-android'
@ -34,20 +37,22 @@ android {
viewBinding true
}
//
def buildDate = new Date().format("yyMMdd", TimeZone.getTimeZone("GMT+08"))
//
def buildTime = new Date().format("yyyy-MM-dd HH:mm:ss", TimeZone.getTimeZone("GMT+08"))
//Git Commit ID
def gitCommitId = getGitCommitId()
defaultConfig {
applicationId "com.idormy.sms.forwarder"
minSdkVersion build_versions.min_sdk
targetSdkVersion build_versions.target_sdk
versionCode build_versions.version_code
//
def date = new Date().format("yyMMdd", TimeZone.getTimeZone("GMT+08"))
versionName = "${build_versions.version_name}.${date}"
versionName = "${build_versions.version_name}.${buildDate}"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
//
def time = new Date().format("yyyy-MM-dd HH:mm:ss", TimeZone.getTimeZone("GMT+08"))
buildConfigField "String", "BUILD_TIME", "\"${time}\""
//Git commit ID
buildConfigField "String", "GIT_COMMIT_ID", getGitCommitId()
buildConfigField "String", "BUILD_TIME", "\"${buildTime}\""
buildConfigField "String", "GIT_COMMIT_ID", "\"${gitCommitId}\""
multiDexEnabled true
//vectorDrawables.useSupportLibrary = true
@ -171,11 +176,20 @@ android {
android.applicationVariants.configureEach { variant ->
// Assigns a different version code for each output APK.
variant.outputs.each { output ->
//noinspection GrDeprecatedAPIUsage
def abiName = output.getFilter(com.android.build.OutputFile.ABI)
if (abiName == null) abiName = "universal"
output.versionCodeOverride = abiCodes.get(abiName, 0) * 100000 + variant.versionCode
output.outputFileName = "SmsF_${versionName}_${output.versionCode}_${abiName}_${variant.name}.apk"
// output-metadata.json Git Commit ID
variant.assemble.doLast {
def metadataFile = file("${variant.outputs[0].outputFile.parent}/output-metadata.json")
def metadata = new JsonSlurper().parseText(metadataFile.text)
metadata.buildDate = buildDate
metadata.buildTime = buildTime
metadata.gitCommitId = gitCommitId
metadataFile.text = new JsonBuilder(metadata).toPrettyString()
}
}
}
@ -327,10 +341,9 @@ apply from: 'x-library.gradle'
// commit ID
static def getGitCommitId() {
try {
def commitId = 'git rev-parse --short HEAD'.execute().text.trim()
return "\"$commitId\""
return 'git rev-parse --short HEAD'.execute().text.trim()
} catch (Exception e) {
e.printStackTrace()
return "\"\""
return ""
}
}

@ -42,10 +42,10 @@
<string name="menu_about">About</string>
<string name="about_app_version">AppVer: %s</string>
<string name="about_app_version_tips">Version Name: %s\nVersion Code: %s\nBuild Time: %s\nGit Commit ID: %s</string>
<string name="about_app_version_tips" formatted="false">Version Name: %s\nVersion Code: %s\nBuild Time: %s\nGit Commit ID: %s</string>
<string name="about_cache_size">Cache Size: %s</string>
<string name="about_frpc_version">FrpcVer: %s</string>
<string name="about_item_wechat_miniprogram">WeChat MiniProgram</string>
<string name="about_item_wechat_miniprogram" formatted="false">WeChat MiniProgram</string>
<string name="about_cache_purged">Cache cleared</string>
<string name="about_frpc_deleted">Frpc Deleted, App restarting</string>
<string name="about_copyright">© %1$s PPPSCN All rights reserved.</string>

@ -42,10 +42,10 @@
<string name="menu_about">关于软件</string>
<string name="about_app_version">软件版本:%s</string>
<string name="about_app_version_tips">版本名称:%s\n版本代码%s\n构建时间%s\nGit提交ID:%s</string>
<string name="about_app_version_tips" formatted="false">版本名称:%s\n版本代码%s\n构建时间%s\nGit提交ID:%s</string>
<string name="about_cache_size">缓存大小:%s</string>
<string name="about_frpc_version">Frpc版本%s</string>
<string name="about_item_wechat_miniprogram">微信小程序</string>
<string name="about_item_wechat_miniprogram" formatted="false">微信小程序</string>
<string name="about_cache_purged">已清理缓存</string>
<string name="about_frpc_deleted">已删除动态库重启APP以便生效</string>
<string name="about_copyright">© %1$s PPPSCN All rights reserved.</string>

@ -42,10 +42,10 @@
<string name="menu_about">關於軟體</string>
<string name="about_app_version">軟體版本:%s</string>
<string name="about_app_version_tips">版本名稱:%s\n版本代碼%s\n構建時間%s\nGit提交ID%s</string>
<string name="about_app_version_tips" formatted="false">版本名稱:%s\n版本代碼%s\n構建時間%s\nGit提交ID%s</string>
<string name="about_cache_size">緩存大小:%s</string>
<string name="about_frpc_version">Frpc版本%s</string>
<string name="about_item_wechat_miniprogram">微信小程序</string>
<string name="about_item_wechat_miniprogram" formatted="false">微信小程序</string>
<string name="about_cache_purged">已清理緩存</string>
<string name="about_frpc_deleted">已刪除動態庫,重啟應用以生效!</string>
<string name="about_copyright">© %1$s PPPSCN 版權所有。</string>

@ -42,10 +42,10 @@
<string name="menu_about">关于软件</string>
<string name="about_app_version">软件版本:%s</string>
<string name="about_app_version_tips">版本名称:%s\n版本代码%s\n构建时间%s\nGit提交ID:%s</string>
<string name="about_app_version_tips" formatted="false">版本名称:%s\n版本代码%s\n构建时间%s\nGit提交ID:%s</string>
<string name="about_cache_size">缓存大小:%s</string>
<string name="about_frpc_version">Frpc版本%s</string>
<string name="about_item_wechat_miniprogram">微信小程序</string>
<string name="about_item_wechat_miniprogram" formatted="false">微信小程序</string>
<string name="about_cache_purged">已清理缓存</string>
<string name="about_frpc_deleted">已删除动态库重启APP以便生效</string>
<string name="about_copyright">© %1$s PPPSCN All rights reserved.</string>

Loading…
Cancel
Save