python调用gradle实现Android打包

作者: 战五渣_lei | 来源:发表于2017-09-27 17:17 被阅读670次

简述

正常情况下用Jenkins直接实现apk打包是最方便的,但是要是代码是由多个仓库的代码组合起来的话,Jenkins操作起来也比较麻烦,这里就用python代码实现了下,版本是python2.7的

关键字 gradle python git

打包流程

脚本先拉取主工程代码的最新提交,然后拉取sdk工程的最新提交,然后 执行gradle 打包 命令,最后将 build目录下的文件copy到目标目录

python脚本

按照设计流程编写python代码 build.py如下

#encoding=utf-8
import os
import sys
import subprocess
import platform
from CommUtil import copytree
# mac环境为开发环境 ,其他是服务器环境
# 按照环境区分比较方便
outdir = "/data/webapp/apks"
if platform.system() == "Darwin":
    outdir = "outapks"
type = ""
# 传入打包的参数,如 debug release 等
# 这个工程定义了一个Qatest ,具体在build.gradle里面自定义
if not os.path.exists(outdir):
    os.mkdir(outdir)
if len(sys.argv) > 1:
    type = sys.argv[1]
if not type:
    type = "qatest"
#如果脚本执行目录 没有工程目录和sdk目录就clone一下
#否则就执行git clone
#注意 这里的git版本为1.8 低版本有些命令可能有问题
mfiles = os.listdir(sys.path[0])
if mfiles.count("android_as") <= 0:
    #subprocess.call 执行命令并且等待,注意shell=Ture 必须写
    ret = subprocess.call("git clone git@gitlab.91jkys.com:patient-app/android_as.git", shell=True)
if mfiles.count("JkysSDK") <= 0:
    ret = subprocess.call("git clone git@gitlab.91jkys.com:weixiangwu/JkysSDK.git", shell=True)
    #更新 检出分支 并拉取最新代码,cwd为git目录
ret = subprocess.call("git fetch", shell=True, cwd='android_as')
subprocess.call("git checkout devhz", shell=True, cwd='android_as')
subprocess.call("git pull", shell=True, cwd='android_as')

subprocess.call("git fetch", shell=True, cwd='JkysSDK')
subprocess.call("git checkout master", shell=True, cwd='JkysSDK')
subprocess.call("git pull", shell=True, cwd='JkysSDK')
# gradle执行打包命令,先clean 在assemble
ret = subprocess.call("gradle -p android_as clean", shell=True)
if type.startswith("qa"):
    ret = subprocess.call("gradle -p android_as assembleQatest", shell=True)
elif type.startswith("pre"):
    ret = subprocess.call("gradle -p android_as assemblePreRelease", shell=True)
#多渠道包的时候 将生成目录下的文件压缩到输出目录,具体多渠道包命令需要gradle里面自己配置好
elif type.lower().startswith("mcpre"):
    ret = subprocess.call("gradle -p android_as assembleMcpRelease", shell=True)
    if (ret == 0):
        ret = subprocess.call(
            "tar -zcvf " + outdir + "/channels_patient.tar.gz" + " android_as/Diabetes_pt_225/build/outputs/apk", shell=True)
elif type.lower().startswith("mcptest"):
    ret = subprocess.call("gradle -p android_as task assembleMcpTest", shell=True)
    if (ret == 0):
        ret = subprocess.call(
            "tar -zcvf " + outdir + "/channelstest_patient.tar.gz" + " android_as/Diabetes_pt_225/build/outputs/apk", shell=True)
if (ret == 0 and not type.startswith("mcp")):
    #非多渠道打包,直接将生成的文件copy到输出目录
    copytree("android_as/Diabetes_pt_225/build/outputs/apk", outdir)

copytree是全部复制的方法,具体如下

import os
import platform
import shutil


def copytree(src, dst, symlinks = False, ignore = None):
  if not os.path.exists(dst):
    os.makedirs(dst)
    shutil.copystat(src, dst)
  lst = os.listdir(src)
  if ignore:
    excl = ignore(src, lst)
    lst = [x for x in lst if x not in excl]
  for item in lst:
    s = os.path.join(src, item)
    d = os.path.join(dst, item)
    if symlinks and os.path.islink(s):
      if os.path.lexists(d):
        os.remove(d)
      os.symlink(os.readlink(s), d)
      try:
        st = os.lstat(s)
        mode = stat.S_IMODE(st.st_mode)
        os.lchmod(d, mode)
      except:
        pass # lchmod not available
    elif os.path.isdir(s):
      copytree(s, d, symlinks, ignore)
    else:
      shutil.copy2(s, d)
if __name__ == '__main__':
  print(platform.system())

这样 直接执行 python build.py Release之类的方法就能打包了

相关文章

网友评论

    本文标题:python调用gradle实现Android打包

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