#CI release for Jenkins
import json
import os
import re
import urllib2
import urllib
import base64
import requests
import sys
import traceback
import platform
import subprocess
import codecs
from shutil import copy
#set Jenkins build description using submitDescription to mock browser behavior
#TODO: need to set parent build description
def set_description(desc, url):
req_data = urllib.urlencode({'description': desc})
req = urllib2.Request(url + 'submitDescription', req_data)
#print(os.environ['BUILD_URL'])
req.add_header('Content-Type', 'application/x-www-form-urlencoded')
base64string = base64.encodestring(os.environ['JENKINS_ADMIN']+ ":" + os.environ['JENKINS_ADMIN_PW']).replace('\n', '')
req.add_header("Authorization", "Basic " + base64string)
try:
urllib2.urlopen(req)
except:
traceback.print_exc()
def make_temp_dir():
#make temp dir
print "current dir is: " + os.environ['WORKSPACE']
os.system("cd " + os.environ['WORKSPACE']);
os.mkdir("android_build_objs")
#add symbol link
PROJECTS=["cpp-empty-test", "cpp-tests"]
print platform.system()
if(platform.system() == 'Darwin'):
for item in PROJECTS:
cmd = "ln -s " + os.environ['WORKSPACE']+"/android_build_objs/ " + os.environ['WORKSPACE']+"/tests/"+item+"/proj.android/obj"
os.system(cmd)
elif(platform.system() == 'Windows'):
for item in PROJECTS:
p = item.replace("/", os.sep)
cmd = "mklink /J "+os.environ['WORKSPACE']+os.sep+"tests"+os.sep +p+os.sep+"proj.android"+os.sep+"obj " + os.environ['WORKSPACE']+os.sep+"android_build_objs"
print cmd
os.system(cmd)
def check_current_3rd_libs(branch):
#get current_libs config
backup_files = range(2)
current_files = range(2)
config_file_paths = ['external/config.json','templates/lua-template-runtime/runtime/config.json']
if (branch == 'v2'):
config_file_paths = ['external/config.json']
for i, config_file_path in enumerate(config_file_paths):
if not os.path.isfile(config_file_path):
raise Exception("Could not find 'external/config.json'")
with open(config_file_path) as data_file:
data = json.load(data_file)
current_3rd_libs_version = data["version"]
filename = current_3rd_libs_version + '.zip'
node_name = os.environ['NODE_NAME']
backup_file = '../../../cocos-2dx-external/node/' + node_name + '/' + filename
backup_files[i] = backup_file
current_file = filename
current_files[i] = current_file
if os.path.isfile(backup_file):
copy(backup_file, current_file)
#run download-deps.py
os.system('python download-deps.py -r no')
#backup file
for i, backup_file in enumerate(backup_files):
current_file = current_files[i]
copy(current_file, backup_file)
def main():
#get tag
tag = os.environ['tag']
print 'tag:' + tag
pr_desc = '
' + tag + ' is release' + '
'
#get pr target branch
branch = 'v3'
#set parent build description
jenkins_url = os.environ['JENKINS_URL']
job_name = os.environ['JOB_NAME'].split('/')[0]
build_number = os.environ['BUILD_NUMBER']
target_url = jenkins_url + 'job/' + job_name + '/' + build_number + '/'
set_description(pr_desc, target_url)
#pull origin v3
os.system('git reset --hard')
os.system("git clean -xdf -f")
os.system("git checkout v3")
os.system("git branch -D " + tag)
os.system("git clean -xdf -f")
#fetch tag to local repo
git_fetch_pr = "git fetch origin tag " + tag
ret = os.system(git_fetch_pr)
if(ret != 0):
return(2)
#checkout
git_checkout = "git checkout -b " + tag + " FETCH_HEAD"
os.system(git_checkout)
# After checkout a new branch, clean workspace again
print "After checkout: git clean -xdf -f"
os.system("git clean -xdf -f")
#update submodule
git_update_submodule = "git submodule update --init --force"
ret = os.system(git_update_submodule)
if(ret != 0):
return(2)
#build
#TODO: add android-linux build
#TODO: add mac build
node_name = os.environ['NODE_NAME']
build_mode = ['debug', 'release']
tests_dirs = ['tests/cpp-empty-test/proj.android',
'tests/cpp-tests/proj.android',
'tests/lua-empty-test/project/proj.android',
'tests/lua-tests/project/proj.android']
tests_names = ['cpp-empty-test', 'cpp-tests', 'lua-empty-test', 'lua-tests']
remote_home = os.environ['REMOTE_HOME']
for mode in build_mode:
os.system('git reset --hard')
os.system("git clean -xdf -f")
make_temp_dir()
#copy check_current_3rd_libs
check_current_3rd_libs(branch)
if(branch == 'v3'):
# Generate binding glue codes
ret = os.system("python tools/jenkins-scripts/gen_jsb.py")
if(ret != 0):
return(1)
if(node_name == 'android_mac') or (node_name == 'android_win7'):
print "Start build android..."
ret = os.system("python build/android-build.py -b " + mode + " -n -j10 all")
# create and save apk
if(ret == 0):
os.system('android update project -p cocos/platform/android/java/ -t android-13')
for i, test in enumerate(tests_dirs):
os.system('android update project -p ' + test + ' -t android-13')
local_apk = test + '/' + tests_names[i] + '.apk'
remote_dir = '/data/download/' + tag + '/'
remote_apk = remote_dir + tests_names[i] + '-' + tag + '-' + mode + '.apk'
os.system('ant debug -f ' + test + '/build.xml' + ' -Dout.final.file=$PWD/' + local_apk)
os.system('ssh ' + remote_home + ' "mkdir -p ' + remote_dir + '"')
os.system('scp ' + local_apk + ' ' + remote_home + ':' + remote_apk)
#get build result
print "build finished and return " + str(ret)
exit_code = 1
if ret == 0:
exit_code = 0
else:
exit_code = 1
#clean workspace
os.system("cd " + os.environ['WORKSPACE'])
os.system("git reset --hard")
os.system("git clean -xdf -f")
os.system("git checkout v3")
return(exit_code)
# -------------- main --------------
if __name__ == '__main__':
sys_ret = 0
try:
sys_ret = main()
except:
traceback.print_exc()
sys_ret = 1
finally:
sys.exit(sys_ret)