Github: github.com/windinwork/…
平時測試中發包的時候,筆者在打完包就直接拖到蒲公英上讓它上傳就完事了。不過前兩天的會議上,測試小姐姐提出要在蒲公英上寫明這次的測試包修改了什麼內容。
筆者一想到上傳完包還要一個個打字說明在這個包我修改了什麼,立即強烈拒絕!但是測試小姐姐再三要求,礙於這確實是個好提議和會上坐著的老大,只好勉為其難地答應發包時寫上改動內容T_T。但是懶惰如筆者,當然不會每次發包都手動打字啦,最好能打完包後自動把包和修改資訊上傳到蒲公英。
雖然嘴上說著不要不要,但筆者想到寫個自動化指令碼還是很興奮的。本來想看看有沒有現成的蒲公英自動上傳指令碼,在網上搜尋了一下發現都不是很對胃口,想想還是自己寫算了。所以今天花了半天寫了這個指令碼,在這裡也分享一下相關的gradle配置,以供參考。
一、 自動上傳蒲公英
向蒲公英這樣的平臺一般提供API用來做一些便利的操作,我們直接開啟蒲公英文件,可以看到用於上傳安裝包的API和示例的上傳方法,我們便採用其中的curl
的方法上傳安裝包。
上傳介面的引數中,有三個是必填的,分別的uKey
、_api_key
和file
。uKey
和_api_key
我們在自己的蒲公英帳號上可以檢視到,而file
引數需要我們提供apk
檔案的路徑,所以我們先想辦法拿到路徑。
這裡我們定義一個方法:getApkPath()
,通過buildDir
+ 固定的outputs/apk/${buildType}/app-${buildType}.apk
地址來獲取apk
路徑。
def getApkPath() {
String buildType = getBuildType().toLowerCase()
return new File(buildDir, "outputs/apk/${buildType}/app-${buildType}.apk").absolutePath
}
複製程式碼
在getApkPath()
中我們需要知道編譯打包和用的buildType
,這裡定義一個方法getBuildType()
進行獲取。本人對gradle
指令碼不太熟悉,暫時通過打包引數來獲取相應的buildType
,足以應付一般場景。
def getBuildType() {
Gradle gradle = getGradle()
String args = gradle.getStartParameter().getTaskRequests().toString()
if (args.contains("assembleRelease")) {
return "Release"
} else if (args.contains("assembleDebug")) {
return "Debug"
}
return "Debug"
}
複製程式碼
然後我們把上傳命令封裝在一個task
裡:
task pgyer(type: Exec) {
String apiKey = "6767f341ee7ed1f9fd4699e6ed71e773" // todo 這裡替換為自己的蒲公英的apiKey
String userKey = "0cf7164e5158effc01cc24c0667266c4" // todo 這裡替換為自己的蒲公英的userKey
commandLine 'curl'
args '-k', 'http://www.pgyer.com/apiv1/app/upload',
'-F', "uKey=${userKey}",
'-F', "_api_key=${apiKey}",
'-F', "file=@${getApkPath()}"
}
複製程式碼
這樣我們就在一個task
可以呼叫啦。進入Terminal
,gradlew clean assembleDebug pgyer
,gradle
指令碼便會執行清理、編譯打包、上傳的工作。等命令執行完,我們便能在蒲公英上看到新鮮出爐的安裝包了。
二、自動新增日誌
筆者目前想到自動從git
記錄中讀取近期的log,進行一定格式化後上傳到蒲公英。
首先我們來讀取git的記錄:
def getGitLog() {
return 'git log --pretty=format:"%s___in___%ad___by___%an" -10 --date=format:%c'.execute().text
}
複製程式碼
其中%s__in__%ad__by__%an
表示內容+日期+作者,-10
表示顯示最近10條log,--date=format:%c
表示輸出本地的日期時間。這裡發現執行命令時如有空格不能輸出git log
,所以使用___
來代替空格。
有時我們會想新增自定義的資訊進去,所以需要一個引數用於傳遞自定義的資訊,這裡將引數定義為pgyerDesc
,然後在gradle
中獲取pgyerDesc
:
if (project.hasProperty("pgyerDesc")) {
desc = pgyerDesc + "\n" + desc
}
複製程式碼
對於傳入的引數pgyerDesc
,在Windows
中,輸入中文會出現亂碼,應該是編碼格式的問題。筆者用的是Ubuntu
系統,所以不會有這個問題的出現。所以這個亂碼的情況就交給Windows
的同學自己去解決啦。
好了,整合起來,蒲公英自動上傳安裝包和日誌的gradle
指令碼就實現了。
task pgyer(type: Exec) {
String apiKey = "6767f341ee7ed1f9fd4699e6ed71e773" // todo 這裡替換為自己的蒲公英的apiKey
String userKey = "0cf7164e5158effc01cc24c0667266c4" // todo 這裡替換為自己的蒲公英的userKey
String desc = getGitLog()
if (project.hasProperty("pgyerDesc")) {
desc = pgyerDesc + "\n" + desc
}
if (desc == null || desc.isEmpty()) {
desc = "保持沉默"
}
commandLine 'curl'
args '-k', 'http://www.pgyer.com/apiv1/app/upload',
'-F', "uKey=${userKey}",
'-F', "_api_key=${apiKey}",
'-F', "file=@${getApkPath()}",
'-F', "updateDescription=${desc}"
}
複製程式碼
三、總結
最後,為了保持功能模組分工清晰和程式碼複用,我們把新建一個pgyer.gradle
的檔案,將這個task
單獨存放起來。再在app
的build.gradle
中通過apply from
的方式引入pgyer.gradle
。我們執行gradlew assembleDebug pgyer -P pgyerDesc="請多多關注"
,就可以看到想要的效果了。
該指令碼是在gradle4.4
的環境下進行,這裡也做了一個Demo
放在Github上了,裡面的一些引數設定可能根據小夥伴自己的需求再做調整。希望各位能夠喜歡這篇蒲公英自動上傳指令碼的文章。