Jenkins奇技淫巧 — 安装篇(mac)
Jenkins奇技淫巧 — 配置篇
Jenkins奇技淫巧 — 安全篇
Jenkins奇技淫巧 — 发送邮件篇
Jenkins奇技淫巧 — 全局变量篇
Jenkins奇技淫巧 — 新建任务篇
Jenkins奇技淫巧 — 插件篇
Jenkins奇技淫巧 — 问题篇
Jenkins奇技淫巧 — 命令篇
Jenkins奇技淫巧 — 环境配置篇(Android自动化构建)
Jenkins奇技淫巧 — 参数化构建篇(Android自动化构建)
Jenkins奇技淫巧 — 第一次实战篇(Android自动化构建)
Jenkins奇技淫巧 — Python打包篇(Android自动化构建)
Jenkins奇技淫巧 — Python发送邮件和上传蒲公英(Android自动化构建)
Jenkins奇技淫巧 — 乐固,多渠道打包篇(Android自动化构建)
Jenkins奇技淫巧 — 节点管理篇
Jenkins奇技淫巧 — 优秀文章篇
简介
Jenkins奇技淫巧 — 第一次实战篇(Android自动化构建)通过Jenkins配置,调用Android工程目录下的gradlew文件,实现了简单的Android自动化打包。这一篇将使用Jenkins +Python的方式实现Android的打包,有人或许会觉得,Jenkins已经实现了自动化过程,为什么还要用Python呢,其实,通过Python脚本我们能够实现更多的自动化功能,能够更加细粒度的控制打包过程,而且将很多控制统一放到Python脚本中,第一可以提高自动化打包的维护,二是,对于会Python的人来说,在开发效率上都有很大的提升,而且可以开发出很多好用的功能。
环境
- 安装Python环境
我安装了python3和python2,执行脚本的时候用的python3,python3和python2在有些语法上会存在差异,所以,书写时请注意。 - 安装vscode(非必须)
vscode是微软的一款开发软件,可以写python,rn,h5等等,配上几款合适的插件,其实就够用了,当然,也可以不安装,用文本工具编写,但是python脚本有一定的格式要求,如果达不到,是不能够运行的,pythom有款专门的ide——PyCharm。
不同
使用Python和用Android Studio,Jenkins有什么不同呢?其实本质都一样,python打包,通过在python脚本里面,调用gradle相关命令,gradlew执行文件等达到相同的相关。
脚本
- 创建python文件
在你Android工程目录下,新建一个用于存放python脚本的目录(当然,你可以在任何地方创建这个目录,只要能够python脚本能够被执行到,打包需要的环境能够访问得到,都是ok的),新建一个python文件——Android.py。 - 实现一个可以控制环境(线上or测试),版本(debug or release)
import os
import sys, getopt
import platform
import subprocess
test = 1
online = 2
# 获取帮助信息
def getUsageStr():
tipStr = (' \n============Android.py================\n'
+ ' -m, --msg <msg> 说明信息 \n'
+ ' -p, --platform <platform> 平台信息,默认test\n')
return(tipStr)
# 执行命令
def exeShellCmd(cmd):
popen = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
cmdRetBytes = popen.stdout.read()
cmdRetStr = str(cmdRetBytes, encoding='utf-8')
print(cmdRetStr)
return cmdRetStr
# 更新工程代码
def updateGitRepo():
print('update git repo start')
ret = exeShellCmd('git pull')
hasError = 'error' in ret
if(hasError):
raise ValueError('git pull failed')
# ret = exeShellCmd('cd android && git pull')
print('update git repo end')
return
# 开始构建应用
def startBuild(platformService):
# 获取平台信息
sysstr = platform.system()
cmdPrefix = './gradlew'
print (sysstr)
if(sysstr =="Windows"):
cmdPrefix = 'gradlew'
# Gradle加入自定义参数,比如我们想根据不同的参数来进行不用的编译配置,
# 可以在 ./gradlew中加入自定义参数./gradlew assembleDebug - Pcustom=true
# 就可以在 build.gradle中使用下面代码来判断:
# if (project.hasProperty('custom')){
# }
suffix = '-PplatformService=%s'%test
assemble = 'assembleDebug'
if(platformService == 'online'):
suffix = '-PplatformService=%s'%online
assemble = 'assembleRelease'
cmdStr = '%s clean %s %s' %(cmdPrefix, assemble, suffix)
print (cmdStr)
os.system(cmdStr)
return
if __name__ == '__main__':
# 获取命令行参数,不明白的可以参考我的文章:Python-解析命令行参数的两中方式。
argv = sys.argv[1:]
print (argv)
# 打包附加信息
msg = ''
# 平台信息,测试平台,灰度平台,线上平台
platformService = 'test'
try:
# 这里的 h 就表示该选项无参数,冒号(:)表示该选项必须有附加的参数,不带冒号表示该选项不附加参数。
opts, args = getopt.getopt(argv, "hm:p:",["msg=", "platformService="])
except getopt.GetoptError:
print (getUsageStr())
sys.exit(2)
for opt, arg in opts:
if opt == '-h':
print (getUsageStr())
sys.exit()
elif opt in ("-m", "--msg"):
msg = arg
print('-m arg =%s'%arg)
elif opt in ("-p", "--platformService"):
buildEnv = arg
print('-e arg =%s'%arg)
print('msg = %s, platformService = %s'%(msg, platform))
updateGitRepo()
startBuild(platform)
上面代码没有控制是打debug还是release版本的app,可以自己添加一个参数来控制,上面platformService的参数可以在我们的build.gradle文件获取,从来控制应用使用测试or线上环境,至于为什么可以获得到,请查看gradle相关知识。
//获取命令行输入参数,获取后控制使用测试环境,还是线上环境
def urlType = project.hasProperty('platformService') ? Integer.parseInt(platformService) : TEST
Jenkins
写好了Python脚本,我们还需要修改Jenkins配置,执行我们编写的脚本
-
添加参数
屏幕快照 2019-05-04 下午6.22.31.png -
修改构建shell脚本
屏幕快照 2019-05-04 下午6.23.13.png
选择参数,执行构建
网友评论