一招解決打包自動(dòng)上次蒲公英平臺(tái)

每次發(fā)測試包,需要調(diào)用android打包命令,然后在打開瀏覽器上次到蒲公英平臺(tái),給測試下載。雖然每次只需要幾分鐘,但是每次幾分鐘太浪費(fèi)時(shí)間了。做為程序員的我,懶才能完美形容。既然是重復(fù)操作,那為什么不寫個(gè)腳本打包完成后自動(dòng)上傳到對(duì)應(yīng)的平臺(tái)呢?
說干就干,翻閱蒲公英平臺(tái)的接口文檔,發(fā)現(xiàn)正好有上傳apk的api

首先就是用什么方式上傳,由于目前android大多使用okhttp作為網(wǎng)絡(luò)請求,所以在gradle當(dāng)然使用okhttp作為網(wǎng)絡(luò)請求庫洛,蒲公英接口返回的格式是json當(dāng)然會(huì)用到google官方的gson作為json解析,然后就有了如下配置,在項(xiàng)目根目錄的build.gradle中添加下面依賴

buildscript {
    
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.2'
        classpath "com.squareup.okhttp3:okhttp:3.14.2"
        classpath "com.google.code.gson:gson:2.8.5"

    }
}
  • 然后在app所在的build.gradle文件中開始寫我們的自動(dòng)上傳腳本洛,開心愉快的使用開始了
android{
    // 注意這個(gè)task后面的名字哦,后面會(huì)用的到,隨便寫啥都可以的
     task assembleUat2UploadPgyer() {
        dependsOn "assembleRelease" //  這里寫打包的腳本名稱,可以是發(fā)布版本,debug版本,或者是自定義的版本
        group "upload2Pgyer" // 給我們這個(gè)腳本取個(gè)名字,方便找到哦,不然都跑到other里面了,太難找了
        doFirst {
            logger.log(LogLevel.ERROR, "開始執(zhí)行apk上傳蒲公英操作")
        }
        doLast {
            applicationVariants.all {
                it.outputs.each { out ->
                    def outputFile = out.outputFile
                    if (outputFile != null && outputFile.name == 'app-release.apk') { // 這里的app-release要根據(jù)上面配置的assembleXXX來寫哦
                        logger.log(LogLevel.ERROR, "apk 所在的磁盤絕對(duì)路徑 : ${outputFile.absolutePath}")
                        // 還是那個(gè)字懶,發(fā)版本不想去修改版本號(hào),所以就用git提交的次數(shù)作為版本號(hào)了
                        def versionCode = 'git rev-list HEAD --first-parent --count'.execute().text.trim().toInteger()
                        logger.log(LogLevel.ERROR, "app 當(dāng)前準(zhǔn)備傳版本號(hào):${rootProject.ext.android.versionName}.${versionCode}")

                        def clientBuilder = new OkHttpClient.Builder()
                        clientBuilder.connectTimeout(10, TimeUnit.SECONDS)
                        clientBuilder.readTimeout(60, TimeUnit.SECONDS)
                        OkHttpClient client = clientBuilder.build()


                        def fileBody = RequestBody.create(MediaType.parse("multipart/form-data"), new File(outputFile.absolutePath))
                        def bodyBuilder = new MultipartBody.Builder()
                                .setType(MultipartBody.FORM)
                                .addFormDataPart("_api_key", "蒲公英的key")
                                .addFormDataPart("file", outputFile.name, fileBody)
                                .addFormDataPart("buildInstallType", "1")
                                // .....后面還可以添加很多參數(shù),可以去看蒲公英的文檔
                        def request = new Request.Builder()
                                .url("https://www.pgyer.com/apiv2/app/upload")
                                .post(bodyBuilder.build())
                                .build()

                        logger.log(LogLevel.ERROR, "-----------開始上傳-------------")


                        def response = client.newCall(request).execute()

                        if (response == null || response.body() == null) {
                            logger.log(LogLevel.ERROR, "蒲公英上傳結(jié)果失敗")
                            return null
                        }
                        def json = response.body().string()
                        logger.log(LogLevel.ERROR, "蒲公英上傳結(jié)果:${json}")
                        def data = new Gson().fromJson(json, Map.class).data
                        logger.log(LogLevel.ERROR, "蒲公英安裝二維碼地址:${data.buildQRCodeURL}")
                        logger.log(LogLevel.ERROR, "蒲公英上傳成功的版本號(hào):${data.buildVersion}.${data.buildVersionNo}")
                        logger.log(LogLevel.ERROR, "蒲公英下載地址:https://www.pgyer.com/${data.buildShortcutUrl}")

                        response.close()
                        logger.log(LogLevel.ERROR, "-----------完成上傳-------------")
                    }
                }
            }
        }
    }
}

到此我們的自動(dòng)上次腳本就完成啦,不對(duì),還有一個(gè)重要的使用,忘記導(dǎo)包了,O(∩_∩)O哈哈~

import okhttp3.MultipartBody
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody
import okhttp3.MediaType
import java.util.concurrent.TimeUnit
import com.google.gson.Gson

這樣才算完成哦

  • 看看最后的效果洛
    在android studio Gradle工具欄中就可以看見我們自定義的一個(gè)task,每次需要發(fā)布測試版本,就瘋狂的點(diǎn)擊這個(gè)就好啦,一切交給我們腳本吧


  • 腳本執(zhí)行完后就會(huì)在控制臺(tái)輸出對(duì)應(yīng)的下載地址哦,復(fù)制粘貼發(fā)給測試,輕松加愉快的完成了版本發(fā)布


  • 哈哈,其實(shí)可以把這段腳本抽取出來的,懶才是我的天性,所以就沒有抽取,能夠完成功能的腳本才是好腳本,所以就沒有這么多講究了哦

  • emmmmm,其實(shí)這個(gè)腳本還有一個(gè)問題,就是在上傳的時(shí)候沒有進(jìn)度顯示。由于使用了okhttp想要獲取上傳的進(jìn)度,需要自定義寫東西,我太懶了,不想搞了,還是那個(gè)原則,能用的腳本就是好腳本。有興趣的小伙伴可以加入進(jìn)度條哦

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容