美文网首页Android进阶之路Jenkins奇技淫巧Android开发经验谈
Jenkins奇技淫巧 — Python打包篇(Android自

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

作者: 拔萝卜占坑 | 来源:发表于2019-05-04 18:09 被阅读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环境
      我安装了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

      选择参数,执行构建

    相关文章

      网友评论

        本文标题:Jenkins奇技淫巧 — Python打包篇(Android自

        本文链接:https://www.haomeiwen.com/subject/ucvpgqtx.html