Android开发经验谈Android技术知识Android开发

Android Gradle Task 自动打包上传到蒲公英并通

2024-04-15  本文已影响0人  __Y_Q

近期频繁的打包, 有点心累, 所以有了这篇文章. 话不多说, 直接开整.

先上企业微信机器人通知的效果


image.png

1. 创建 task.gradle

在项目的 build.gradle 所在的目录下创建一个 task.gradle 内容如下

project.ext {
    uploadTask = { extension,versionName ->
        extension.android {
            task upload2Pgyer(group: 'upload', description: 'Upload apk to pgyer', dependsOn: 'assembleDebug') {
                doLast {
                    android.applicationVariants.all { variant ->
                        String taskSuffix = variant.name.capitalize()
                        //输出versionname
                        if (taskSuffix.equals("Debug")) {
                            variant.outputs.all { output ->
                                // 执行脚本任务
                                uploadApk(output.outputFile, versionName)
                            }
                        }
                    }
                }
            }
        }
    }
}

我这里是只打了debug包. 别的环境的自己的需求进行修改.
接着就需要创建具体的执行任务的上传及通知脚本了.

2. 创建 pgyer-upload.gradle

代码较多, 后面一些获取git提交日志的方法没有用到. 不需要的可以删掉. 通知的内容改成了 markdown 的形式, 看起来好看一点. 这点看个人需求了. 不需要的可以将

    def json = JsonOutput.toJson([
            msgtype: "markdown",
            markdown: [
                    content: message
            ]
    ])

这里的 markdown 改为 text. 完整代码如下:

import groovy.json.JsonSlurper
import java.net.http.HttpClient
import java.net.http.HttpRequest
import java.net.http.HttpResponse
import java.text.SimpleDateFormat
import groovy.json.JsonOutput
ext.uploadApk = this.&uploadApk

def String makeMarkDownText(String versionName, String url, String updateTime) {
    return """
      ### <font color="warning">**新版本更新**</font>\n
      > 应用名称:<font color="info">app名称</font>
      > 应用类型:<font color="info">Android</font>
      > 对应版本:<font color="info">${versionName}</font>
      > 应用环境:<font color="info">国内测试环境</font>
      > 更新日期:<font color="info">${updateTime}</font>\n
      > 更新内容如下
      > <font color="info">1. Gradle</font> 
      > <font color="info">2. Task</font>
      > <font color="info">3. 自动构建</font>
      > <font color="info">4. 自动上传</font>
      > <font color="info">5. 自动通知</font> \n
      > [点击链接安装此版本](${url}) \n
      """
}

static String getApiKey() {
    return "蒲公英的APIKEY"
}
static String getPgyDescription() {
    return ""
}

def uploadApk(File apk, String versionName) {
    //查找上传的apk文件,这里需要换成自己apk路径
    if (!apk.exists()) {
        println "*************** APK 文件不存在 ***************"
    }
    println "*************** 开始上传文件 ***************"
    def twoHyphens = "--"
    def boundary = "*********"
    def end = "\r\n"

    //模拟表单上传 multipart/form-data
    def conn = new URL("https://www.pgyer.com/apiv2/app/upload").openConnection()
    conn.setRequestMethod('POST')
    conn.setRequestProperty("Connection", "Keep-Alive")
    conn.setRequestProperty("Charset", "UTF-8")
    conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary)
    conn.setDoInput(true)
    conn.setDoOutput(true)
    //添加参数:_api_key
    def sb = new StringBuilder()
    sb.append(twoHyphens).append(boundary).append(end)
    sb.append("Content-Disposition: form-data; name=_api_key")
    sb.append(end).append(end)
    sb.append(apiKey).append(end)

    //添加参数:buildUpdateDescription 更新日志,取值gradle.properties中的 BUILD_NOTES
    sb.append(twoHyphens).append(boundary).append(end)
    sb.append("Content-Disposition: form-data; name=buildUpdateDescription")
    sb.append(end).append(end)
    sb.append(pgyDescription).append(end)

    //添加参数file: 需要上传的apk文件
    sb.append(twoHyphens).append(boundary).append(end)
    sb.append("Content-Disposition: form-data; name=file;filename=").append(apk.getName())
    sb.append(end).append(end)

    def dos = new DataOutputStream(conn.getOutputStream())
    dos.writeBytes(sb.toString())
    dos.flush()
    sb.delete(0, sb.length())

    def fis = new FileInputStream(apk)
    byte[] bf = new byte[8192]
    int len
    while ((len = fis.read(bf)) != -1) {
        dos.write(bf, 0, len)
    }
    sb.append(end)
    sb.append(twoHyphens).append(boundary).append(end)
    dos.writeBytes(sb.toString())

    dos.flush()
    fis.close()
    dos.close()
    conn.connect()

    def text = conn.getContent().text

    def resp = new JsonSlurper().parseText(text)

    println text
    if (resp.code != 0) {
        println "*************** 上传失败 *************** 原因 " + resp.message
    }else  {
        println "*************** 上传成功 ***************"
    }

    def downloadUrl = "https://www.pgyer.com/" + resp.data.buildShortcutUrl.strip()
    def updateTime = resp.data.buildUpdated
    def content = makeMarkDownText(versionName, downloadUrl, updateTime)

    notifyWeChatBot(content)
}

/**
 * 通知企业微信机器人
 */
def notifyWeChatBot(String message) {
    // 替换以下变量为你的企业微信机器人 webhook URL
    def webhookUrl = "企业微信机器人的urlkey"

    // 构建 JSON 数据
    def json = JsonOutput.toJson([
            msgtype: "markdown",
            markdown: [
                    content: message
            ]
    ])

    // 发送 HTTP POST 请求
    HttpResponse<String> response = postJsonData(webhookUrl, json)

    // 打印响应结果
    println ">>>> 企业微信机器人通知结果:\n${response.body()}"
}

/**
 * 发送 JSON 数据的 HTTP POST 请求
 */
static HttpResponse<String> postJsonData(String url, String json) {
    HttpRequest httpRequest = HttpRequest
            .newBuilder(URI.create(url))
            .header("Content-Type", "application/json")
            .POST(HttpRequest.BodyPublishers.ofString(json))
            .build()
    return HttpClient.newHttpClient().send(httpRequest, HttpResponse.BodyHandlers.ofString())
}



/**
 * 获取当天提交日志
 * @return
 */
static String getGitCommitLogByToDay() {
    //获取 git 提交日志
    Calendar calendar = Calendar.getInstance()
    String endTime = new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime())
    calendar.add(Calendar.DATE, -1)
    String startTime = new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime())
    //git 命令
    String gitCommand = "git log --pretty=\"%s\" --since=\"${startTime}\" --before=\"${endTime}\""
    //println "getUpdateDescription() --> gitCommand = ${gitCommand}"
    String description = gitCommand.execute().text.trim()
    return description
}

/**
 * 获取最近 n 条提交日志
 */
static String getGitCommitLogByCount(int count) {
    //git 命令
    String gitCommand = "git log -${count} --pretty=format:\"%s\""
    //println "getUpdateDescription() --> gitCommand = ${gitCommand}"
    String description = gitCommand.execute().text.trim()
    return description
}

/**
 * 获取分支名
 */
static String getBranchName() {
    String gitCommand = "git rev-parse --abbrev-ref HEAD"
    return gitCommand.execute().text.trim()
}

class KeyValue {
    String key
    String value
    boolean isFile

    KeyValue(String key, String value) {
        this(key, value, false)
    }

    KeyValue(String key, String value, boolean isFile) {
        this.key = key
        this.value = value
        this.isFile = isFile
    }

    @Override
    String toString() {
        return "{key:" + key + ", value:" + value + ", isFile:$isFile}"
    }
}

3. 使用

app module 下中的 build.gradle 文件中添加

apply from: "${rootProject.rootDir}/task.gradle"
apply from: "${rootProject.rootDir}/pgyer-upload.gradle"

重新编译后,在Gradle 工具侧栏中的 Tasks 目录下就回有一个 upload 的文件夹, 里面有一个 uplopad2Pgyer 的任务. 双击就能执行脚本了. 自动打Debug包, 然后上传到蒲公英, 并发送企业微信通知了.

image.png

4. 遇到的问题

4.1 Tasks 没有显示

遇到 Gradle 中的这个 Tasks 没有出现的. 需要进行设置一下. 如下图

image.png
4.2 IPv6

我电脑开启了ipv6, 一直报错, 关闭了后就正常了. 遇到此问题的可以尝试一下这个操作.

后面遇到其他问题了, 继续记录.

上一篇下一篇

猜你喜欢

热点阅读