pythonはgradleを呼び出してAndroidパッケージを実現

3986 ワード

簡単に述べる
通常はJenkinsでapkパッケージを直接実現するのが一番便利ですが、コードが複数の倉庫のコードで組み合わせるとJenkinsの操作も面倒なので、ここでpythonコードで実現しました.バージョンはpython 2です.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 [email protected]:patient-app/android_as.git", shell=True)
if mfiles.count("JkysSDK") <= 0:
    ret = subprocess.call("git clone [email protected]: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)


copytreeeはすべてコピーする方法で、具体的には以下の通りです.
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とかでパッケージングできます