简述
正常情况下用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之类的方法就能打包了
网友评论