近期频繁的打包, 有点心累, 所以有了这篇文章. 话不多说, 直接开整.
先上企业微信机器人通知的效果
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
包, 然后上传到蒲公英, 并发送企业微信通知了.
4. 遇到的问题
4.1 Tasks 没有显示
遇到 Gradle
中的这个 Tasks
没有出现的. 需要进行设置一下. 如下图
4.2 IPv6
我电脑开启了ipv6, 一直报错, 关闭了后就正常了. 遇到此问题的可以尝试一下这个操作.
后面遇到其他问题了, 继续记录.