感觉都好久没写博客了.
最近这小半年自己都不知道忙啥去了,各种乱七八糟的杂事.
今天刚好将迭代的项目从老的环境迁移到专门的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机器人.

钉钉 发送信息 python_钉钉推送

钉钉Webhook机器人相关文档:
https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq

照着文档来,起好名字,消息推送开关打开,保管好Webhook的地址,到时候推送 APP构建完成,推送对应的二维码就靠这个Webhook地址了.


Jenkins新增项目配置说明

新建Item,根据你们自己的项目性质,自己选择,我这肯定就是 Freestyle Project.点击确定后,到了重头戏部分,也就是Jenkins对于你这个项目的配置部分.

钉钉 发送信息 python_自动构建_02


emmm…这就是你的项目的窗帘了,赶紧把心目中想好的骚话写出来吧,看到&nbsp,各种标签,你懂得,html…

钉钉 发送信息 python_钉钉推送_03


添加参数

通用–Choice Parameter

自定义接口环境,这个需要下载对应Jenkins插件,以及APP代码这边build.gradle对应自定义buildTypes配置,这个因人而异,不会的,可以自行搜索关键字[Android,自定义buildTypes].
同时建议在描述里面写上对应接口环境的描述,方便测试同事理解选择(小声BB:只有对测试好一点,才会给你少提点BUG,人天缺陷才没有那么难看).

通用–Git Parameter

自定义代码分支选择,毕竟随着版本迭代,master,各种dev,各种temp分支,各种fix分支,一个比一个多,没有这个怎么行.

记住这个里面2个设置的Name, BUILD_TYPE 和 GIT_BRANCH,后面会用到,(具体名字叫啥随便,后面会引用到这个)

钉钉 发送信息 python_Android_04


这个就是你构建项目的代码来源了,

我这里使用的是Gitlab,所以就填写Git地址了,具体的你们使用SVN还是Github还是码云 还是啥的,都大同小异.

源码管理–Credentials

刚刚搭建好的Jenkins这个可能没有咯,点添加吧.

钉钉 发送信息 python_Jenkins_05


我司使用的是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个一模一样的,这可肿么办啊…

看图,在这里管理.

钉钉 发送信息 python_钉钉 发送信息 python_06


话题拐回来继续说 源码管理这一个配置,
指定分支(为空时代表any) : ${GIT_BRANCH}
看图我的红框,想起前面我提起过的 BUILD_TYPE 和 GIT_BRANCH 吗?
你起了对应的Name,然后你在构建代码的时候,对 代码分支和APP接口环境进行选择,会将对应的选择结果赋予这里.

钉钉 发送信息 python_钉钉 发送信息 python_07

构建–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;
}
注意事项
  1. 获取构建分支等信息获取,
  2. 获取蒲公英上传APP成功后的相关信息
    蒲公英上传成功后,会将返回的参数注入为jenkins的全局变量
    注意使用 manage.getgetEnvVariable(“XXX”)去获取,可获取的具体参数信息见文档

https://www.pgyer.com/doc/api#uploadApp

  1. 推送到钉钉群需要的Webhook地址.
构建后操作–Archive the artifacts

存档!!!

补上最后构建成功推送到钉钉群的效果图

钉钉 发送信息 python_钉钉 发送信息 python_08


写在最后.

Jenkins是一个很灵活的工具,本篇介绍的只是我当前使用的很狭小的一个实例.
结合插件支持各种拓展,进行各种自动化处理.

比如说
自己写shell命令,写各种逻辑,
自动检测代码提交,定时触发自动构建,发送邮件通知等等…
这里我就不列举了.


最后附上项目的Jenkins的插件列表:

钉钉 发送信息 python_钉钉推送_09


钉钉 发送信息 python_Android_10


钉钉 发送信息 python_Jenkins_11


钉钉 发送信息 python_钉钉推送_12


钉钉 发送信息 python_钉钉推送_13


钉钉 发送信息 python_自动构建_14