感觉都好久没写博客了.
最近这小半年自己都不知道忙啥去了,各种乱七八糟的杂事.
今天刚好将迭代的项目从老的环境迁移到专门的Jenkins服务器里面,就加个班写个这个吧.
当初最早为了弄这个,可是没有少找这方面的资料.
本篇博客背景说明.
说一下正在使用的构建代码环境.
每次版本迭代提测,测试都自己去 Jenkins里面去选 接口环境,选 对应代码分支进行 Jenkins自动构建,构建完成后,自动上传至蒲公英,最后在钉钉群内进行消息推送.
前期准备工作.part1
1.构建一个Jenkins环境,具体怎么弄,自行搜索.
2.注册一个蒲公英,类似于fir,用fir也行,这里我用蒲公英演示.
3.用的是钉钉,创建对应的 智能群助手,后面会说明.
前期准备工作.part2
1.默认你Jenkins环境已经搭建成功,
Manage Jenkins --> Manage Plugins
搜索下载
- Upload to pgyer(有现成插件,不用其实也可以,有单独的服务器,可以自己用服务器IP去请求上传)(如果是用fir的话,就下载这个fir-plugin,具体应该没有多大差异,原理都一样).
- Dingding[钉钉] Plugin,看名字就知道了,钉钉进行消息通知,除了 智能群助手外,还需要这个进行搭配.
这是2个相关的插件,至于其他的必备插件,
比如说 gitlab/github branch plugin 自定义分支选择,Gradle gradle编译配置,Groovy Postbuild 支持groovy语法等插件,这些一般会在Jenkins环境搭建相关的技术博客内提及或附带.(在本文最后附带我这项目Jenkins环境的插件列表)
2.蒲公英注册好以后,创建应用,拿到API Key 这个是 基本操作,就不作赘述.
3.钉钉 智能群助手 机器人,没有默认的Jenkins,选择 自定义Webhook机器人.
钉钉Webhook机器人相关文档:
https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq
照着文档来,起好名字,消息推送开关打开,保管好Webhook的地址,到时候推送 APP构建完成,推送对应的二维码就靠这个Webhook地址了.
Jenkins新增项目配置说明
新建Item,根据你们自己的项目性质,自己选择,我这肯定就是 Freestyle Project.点击确定后,到了重头戏部分,也就是Jenkins对于你这个项目的配置部分.
emmm…这就是你的项目的窗帘了,赶紧把心目中想好的骚话写出来吧,看到 ,各种标签,你懂得,html…
添加参数
通用–Choice Parameter
自定义接口环境,这个需要下载对应Jenkins插件,以及APP代码这边build.gradle对应自定义buildTypes配置,这个因人而异,不会的,可以自行搜索关键字[Android,自定义buildTypes].
同时建议在描述里面写上对应接口环境的描述,方便测试同事理解选择(小声BB:只有对测试好一点,才会给你少提点BUG,人天缺陷才没有那么难看).
通用–Git Parameter
自定义代码分支选择,毕竟随着版本迭代,master,各种dev,各种temp分支,各种fix分支,一个比一个多,没有这个怎么行.
记住这个里面2个设置的Name, BUILD_TYPE 和 GIT_BRANCH,后面会用到,(具体名字叫啥随便,后面会引用到这个)
这个就是你构建项目的代码来源了,
我这里使用的是Gitlab,所以就填写Git地址了,具体的你们使用SVN还是Github还是码云 还是啥的,都大同小异.
源码管理–Credentials
刚刚搭建好的Jenkins这个可能没有咯,点添加吧.
我司使用的是SSH,这个根据你们自己公司的实际环境去自己选择,
以SSH为例,输入对应的Username,Private Key内打开你的C:\Users\你的电脑用户名\.ssh 内的id_rsa文件, 如果没有弄过SSH的,搜索关键字[SSH生成KEY]
注意,复制Private Key 请全部复制,
包括
-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----
这2个部分,别问我是怎么知道的.
关于Credentials的管理
可能又有人会问,诶呀,我手抖之前添加错了,我又重新添加了一个,现在跑出2个一模一样的,这可肿么办啊…
看图,在这里管理.
话题拐回来继续说 源码管理这一个配置,
指定分支(为空时代表any) : ${GIT_BRANCH}
看图我的红框,想起前面我提起过的 BUILD_TYPE 和 GIT_BRANCH 吗?
你起了对应的Name,然后你在构建代码的时候,对 代码分支和APP接口环境进行选择,会将对应的选择结果赋予这里.
构建–Invoke Gradle Script
现在已经是9012年了,Android已经都是Gradle编译了,Ant对于Android来说已经是 时代的眼泪了, 勾选Invoke Gradle,选择对应的Gradle版本,请和你当前项目gradle/wrapper/gradle-wrapper.properties内distributionUrl的Gradle版本对应.
可能又会有少年问了,这里面没有我想要的Gradle肿么办呢?
保存 – Jenkins回到首页 – Manage Jenkins – Global Tool Configuration – 选择Gradle安装 – 新增Gradle
写好名称,Install from Gradle.org里面选择好对应的版本,再次回来,发现就有了.
至于Task里面写的,按照每个人的项目需求去自定义,
构建–Upload to pyger with apiV2
这个是我前面提及的蒲公英的上传插件.如果安装好了,那就直接把API_KEY填进去,另外2项就用默认就行.
构建后操作–Groovy Postbuild
这里是最重要的地方,前面配置好了,只是可以进行项目的构建和对应的蒲公英上传,
下面这个Groovy语法可以自定义一些拓展的逻辑,比如说将APP上传到蒲公英后的地址和二维码进行保存,然后结合钉钉的智能群助手进行推送,然后展示在群里面.
下面贴出Groovy代码:
import java.util.*;
import java.text.SimpleDateFormat;
//构建结果
def buildResult = manager. getResult()
//构建用户
def buildUser= manager.getEnvVariable("BUILD_USER")
//项目名称
def jobName= manager.getEnvVariable("JOB_NAME")
//构建结果页面
def buildUrl= manager.getEnvVariable("BUILD_URL")
//GIT分支
def gitBranch= manager.getEnvVariable("GIT_BRANCH")
manager.listener.logger.println("构建分支:"+gitBranch)
manager.listener.logger.println("构建结果:"+buildResult)
manager.listener.logger.println("构建用户:"+buildUser)
manager.listener.logger.println("项目名称:"+ jobName)
if(buildResult == "SUCCESS"){
//解析蒲公英上传返回数据
//apk下载地址
apkDownloadUrl = "https://www.pgyer.com/"+ manager.getEnvVariable("buildShortcutUrl")
//apk二维码
apkQrCode = manager.getEnvVariable("appQRCodeURL")
manager.listener.logger.println("apk下载地址"+apkDownloadUrl)
manager.listener.logger.println("apk二维码地址:"+apkQrCode)
dingding("标题","### 《"+jobName+"》构建成功\n分支:"+gitBranch+"\n\n[APK下载地址]("+apkDownloadUrl+")\n![]("+apkQrCode+")\n\n"+buildUser+" "+getNowTime()+" 构建\n\n[查看详情]("+buildUrl+")")
}else if(buildResult == "ABORTED"){
dingding("标题","### 《"+jobName+"》构建被终止\n"+buildUser+" "+getNowTime()+" 终止\n\n[查看详情]("+buildUrl+")")
}else{
dingding("标题","### 《"+jobName+"》构建失败\n分支:"+gitBranch+"\n\n"+buildUser+" "+getNowTime()+" 构建\n\n[查看详情]("+buildUrl+")")
}
//发送钉钉消息
def dingding(p_title,p_text){
manager.listener.logger.println("--------------------------"+p_title+p_text)
def json= new groovy.json.JsonBuilder()
json {
msgtype "markdown"
markdown {
title p_title
text p_text
}
at {
atMobiles([])
isAtAll false
}
}
manager.listener.logger.println("发送钉钉数据:"+json)
def connection = new URL("你的自定义Webhook机器人的Webhook地址").openConnection()
connection.setRequestMethod('POST')
connection.doOutput = true
connection.setRequestProperty('Content-Type', 'application/json')
def writer = new OutputStreamWriter(connection.outputStream)
writer.write(json.toString());
writer.flush()
writer.close()
connection.connect()
def respText = connection.content.text
manager.listener.logger.println("钉钉返回结果:"+respText )
}
//获取当前时间
def getNowTime(){
def str = "";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar lastDate = Calendar.getInstance();
str = sdf.format(lastDate.getTime());
return str;
}
注意事项
- 获取构建分支等信息获取,
- 获取蒲公英上传APP成功后的相关信息
蒲公英上传成功后,会将返回的参数注入为jenkins的全局变量
注意使用 manage.getgetEnvVariable(“XXX”)去获取,可获取的具体参数信息见文档
- 推送到钉钉群需要的Webhook地址.
构建后操作–Archive the artifacts
存档!!!
补上最后构建成功推送到钉钉群的效果图
写在最后.
Jenkins是一个很灵活的工具,本篇介绍的只是我当前使用的很狭小的一个实例.
结合插件支持各种拓展,进行各种自动化处理.
比如说
自己写shell命令,写各种逻辑,
自动检测代码提交,定时触发自动构建,发送邮件通知等等…
这里我就不列举了.
最后附上项目的Jenkins的插件列表: