diff --git a/.github/workflows/Weekly_Build.yml b/.github/workflows/Weekly_Build.yml index 697d4109..c07274d4 100644 --- a/.github/workflows/Weekly_Build.yml +++ b/.github/workflows/Weekly_Build.yml @@ -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" \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index c8700395..45f8dd83 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -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 "" } } \ No newline at end of file diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index 8ecfa312..9355196c 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -42,10 +42,10 @@ About AppVer: %s - Version Name: %s\nVersion Code: %s\nBuild Time: %s\nGit Commit ID: %s + Version Name: %s\nVersion Code: %s\nBuild Time: %s\nGit Commit ID: %s Cache Size: %s FrpcVer: %s - WeChat MiniProgram + WeChat MiniProgram Cache cleared Frpc Deleted, App restarting © %1$s PPPSCN All rights reserved. diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index d116c1a9..84c9b729 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -42,10 +42,10 @@ 关于软件 软件版本:%s - 版本名称:%s\n版本代码:%s\n构建时间:%s\nGit提交ID:%s + 版本名称:%s\n版本代码:%s\n构建时间:%s\nGit提交ID:%s 缓存大小:%s Frpc版本:%s - 微信小程序 + 微信小程序 已清理缓存 已删除动态库,重启APP以便生效! © %1$s PPPSCN All rights reserved. diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index f86051c1..b26e182d 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -42,10 +42,10 @@ 關於軟體 軟體版本:%s - 版本名稱:%s\n版本代碼:%s\n構建時間:%s\nGit提交ID:%s + 版本名稱:%s\n版本代碼:%s\n構建時間:%s\nGit提交ID:%s 緩存大小:%s Frpc版本:%s - 微信小程序 + 微信小程序 已清理緩存 已刪除動態庫,重啟應用以生效! © %1$s PPPSCN 版權所有。 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a57e37ab..2ec8e15c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -42,10 +42,10 @@ 关于软件 软件版本:%s - 版本名称:%s\n版本代码:%s\n构建时间:%s\nGit提交ID:%s + 版本名称:%s\n版本代码:%s\n构建时间:%s\nGit提交ID:%s 缓存大小:%s Frpc版本:%s - 微信小程序 + 微信小程序 已清理缓存 已删除动态库,重启APP以便生效! © %1$s PPPSCN All rights reserved.