使用Gradle編寫蒲公英自動上傳安裝包和更新說明指令碼

Windin發表於2018-12-02

Github: github.com/windinwork/…

平時測試中發包的時候,筆者在打完包就直接拖到蒲公英上讓它上傳就完事了。不過前兩天的會議上,測試小姐姐提出要在蒲公英上寫明這次的測試包修改了什麼內容。

筆者一想到上傳完包還要一個個打字說明在這個包我修改了什麼,立即強烈拒絕!但是測試小姐姐再三要求,礙於這確實是個好提議和會上坐著的老大,只好勉為其難地答應發包時寫上改動內容T_T。但是懶惰如筆者,當然不會每次發包都手動打字啦,最好能打完包後自動把包和修改資訊上傳到蒲公英。

雖然嘴上說著不要不要,但筆者想到寫個自動化指令碼還是很興奮的。本來想看看有沒有現成的蒲公英自動上傳指令碼,在網上搜尋了一下發現都不是很對胃口,想想還是自己寫算了。所以今天花了半天寫了這個指令碼,在這裡也分享一下相關的gradle配置,以供參考。

一、 自動上傳蒲公英

向蒲公英這樣的平臺一般提供API用來做一些便利的操作,我們直接開啟蒲公英文件,可以看到用於上傳安裝包的API和示例的上傳方法,我們便採用其中的curl的方法上傳安裝包。

上傳介面的引數中,有三個是必填的,分別的uKey_api_keyfileuKey_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可以呼叫啦。進入Terminalgradlew clean assembleDebug pgyergradle指令碼便會執行清理、編譯打包、上傳的工作。等命令執行完,我們便能在蒲公英上看到新鮮出爐的安裝包了。

二、自動新增日誌

筆者目前想到自動從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單獨存放起來。再在appbuild.gradle中通過apply from的方式引入pgyer.gradle。我們執行gradlew assembleDebug pgyer -P pgyerDesc="請多多關注",就可以看到想要的效果了。

該指令碼是在gradle4.4的環境下進行,這裡也做了一個Demo放在Github上了,裡面的一些引數設定可能根據小夥伴自己的需求再做調整。希望各位能夠喜歡這篇蒲公英自動上傳指令碼的文章。

相關文章