Android进阶之路Jenkins奇技淫巧Android开发经验谈

Jenkins奇技淫巧 — Python打包篇(Android自

2019-05-04  本文已影响14人  拔萝卜占坑
\color{blue}{Jenkins系列文章还在更新和完善中,有什么疑问欢迎留言}

\color{blue}{目录}

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和用Android Studio,Jenkins有什么不同呢?其实本质都一样,python打包,通过在python脚本里面,调用gradle相关命令,gradlew执行文件等达到相同的相关。

脚本

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配置,执行我们编写的脚本

上一篇下一篇

猜你喜欢

热点阅读