import json import os import requests import sys from hashlib import md5 from wget import download import ssl import hashlib def file_write(file_name,text_content): # charset() file = open(file_name , "w") file.write(str(text_content)) file.close() def dingtalk(cdn_url,packageUrl): tpl_for_dingtalk=f''' 下载地址: ({cdn_url}{packageUrl}) ![image]([TPL_STATUS_PIC]) 项目名称:[PLUGIN_TPL_REPO_SHORT_NAME] 更新作者: [CI_COMMIT_AUTHOR_NAME] 更新内容:[TPL_COMMIT_MSG] [ [查看构建详情)]]([TPL_BUILD_LINK]) ''' print (tpl_for_dingtalk) file_write("./.tpl",tpl_for_dingtalk) def obsUpload(file,uploadType): url_obsUpload = os.getenv('url_for_iotfile') + "/api/file/v1/attachment/obsUpload" myfiles = {'file': open(file, 'rb')} mydata = {'uploadType': uploadType} r = requests.post(url_obsUpload, data=mydata, files=myfiles) print (r.text) json_str = r.text info = json.loads(json_str)['data'] return info # APP管理-新增APP def platformAppAdd(package,suffix=None): # with open(".tags") as f: version = f.read().strip() logoFile = obsUpload(file=str(os.getenv('logo')), uploadType='logo') packageFile = obsUpload(file=package,uploadType='compress') name = os.getenv('name') if suffix !=None: name = name + str(suffix) bodyjson = { 'name': name, 'version': os.getenv('version'), 'genre': os.getenv('genre'), 'logoCode': logoFile['code'], 'logoUrl': logoFile['url'], 'packageCode': packageFile['code'], 'packageUrl': packageFile['url'], 'des': os.getenv('des') } print (bodyjson) url_platformAppAdd = os.getenv('url_for_iotplatform') + "/api/platform/v1/platformApp/platformAppAdd" headers = {'content-type': 'application/json;charset=UTF-8'} r = requests.post(url_platformAppAdd, headers=headers, data=json.dumps(bodyjson)) print (r.text) cdn_url = os.getenv('cdn_url') packageUrl = packageFile['url'] dingtalk(cdn_url,packageUrl) # 应用管理-授权(获取code list) def getPlatformProgramList(): bodyjson = { 'name': os.getenv('name'), 'version': os.getenv('version'), 'genre': os.getenv('genre'), } print (bodyjson) url_platformAppAdd = os.getenv('url_for_iotplatform') + "/api/platform/v1/platformProgram/getPlatformProgramList/1/10" headers = {'content-type': 'application/json;charset=UTF-8'} r = requests.post(url_platformAppAdd, headers=headers, data=json.dumps(bodyjson)) print (type(json.loads(r.text))) print (json.loads(r.text)['data']["listObject"][0]['code']) return json.loads(r.text)['data']["listObject"][0]['code'] # 应用管理-授权 def multipleProgramToOneProject(): codeList = getPlatformProgramList() bodyjson = { "projectCode": os.getenv('projectCode'), "codeList": [codeList] } print (bodyjson) url_platformAppAdd = os.getenv('url_for_iotplatform') + "/api/platform/v1/platformProgram/multipleProgramToOneProject" headers = {'content-type': 'application/json;charset=UTF-8'} r = requests.post(url_platformAppAdd, headers=headers, data=json.dumps(bodyjson)) print (r.text) # 应用管理-新增应用 def platformProgramAdd(): # with open(".tags") as f: version = f.read().strip() logoFile = obsUpload(file=str(os.getenv('logo')), uploadType='logo') packageFile = obsUpload(file=str(os.getenv('package')),uploadType='compress') bodyjson = { 'name': os.getenv('name'), 'version': os.getenv('version'), 'genre': os.getenv('genre'), 'sourceId': os.getenv('sourceId'), "resolution": os.getenv('resolution'), 'logoCode': logoFile['code'], 'logoUrl': logoFile['url'], 'packageCode': packageFile['code'], 'packageUrl': packageFile['url'], 'des': os.getenv('des') } print (bodyjson) url_platformAppAdd = os.getenv('url_for_iotplatform') + "/api/platform/v1/platformProgram/platformProgramAdd" headers = {'content-type': 'application/json;charset=UTF-8'} r = requests.post(url_platformAppAdd, headers=headers, data=json.dumps(bodyjson)) print (r.text) cdn_url = os.getenv('cdn_url') packageUrl = packageFile['url'] dingtalk(cdn_url,packageUrl) # 自动授权 # multipleProgramToOneProject() def get_the_last_windowsApp_GITversion(name): bodyjson = { 'name': name } print (bodyjson) url_platformAppAdd = os.getenv('url_for_iotplatform') + "/api/platform/v1/platformApp/getPlatformAppList/1/10" headers = {'content-type': 'application/json;charset=UTF-8'} r = requests.post(url_platformAppAdd, headers=headers, data=json.dumps(bodyjson)) listObject=json.loads(r.text)['data']['listObject'] if len(listObject) > 0: for obj in listObject: if obj.get("packageName", "").endswith(".zip"): print(f"id: {obj.get('id')}") print(f"name: {obj.get('name')}") print(f"packageName: {obj.get('packageName')}") print(f"packageUrl: {obj.get('packageUrl')}") print(f"version: {obj.get('version')}") the_last_windowsAppZIP_GITversion=obj.get('version') break # 找到第一个满足条件的对象后停止遍历 print('正在git获取上一个版本的代码:') os.system('mkdir -p /tmp/theLastCode/') os.system('git clone' + os.getenv('DRONE_GIT_HTTP_URL') + ' /tmp/theLastCode/IOTContainer/' ) os.system('cd /tmp/theLastCode/ && git checkout ' + the_last_windowsAppZIP_GITversion) return the_last_windowsAppZIP_GITversion else: return None def build_for_windowsApp(): print ("开始打包exe流程") os.chdir('/drone/src/') os.system('makensis Sources/nbn.nsi') os.system('du -sh Sources/Setup.exe') def count_files_in_directory(directory): count = 0 for root, dirs, files in os.walk(directory): # 仅计算文件数量,不包括目录 count += len(files) return count # def calculate_md5(file_path): # md5 = hashlib.md5() # with open(file_path, 'rb') as f: # while True: # data = f.read(4096) # if not data: # break # md5.update(data) # print( file_path + 'MD5值为' + md5.hexdigest()) # return md5.hexdigest() def build_the_current_windowsApp(name): the_last_windowsApp_GITversion = get_the_last_windowsApp_GITversion(name) the_current_windowsAppZIP="/drone/src/IOTContainer/" + os.getenv('DRONE_REPO_NAME') + '.' + os.getenv('version') + '.zip' # the_last_windowsAppZIP = get_the_last_windowsAppZIP(name) # os.system('mkdir -p /tmp/a/ /tmp/b/ /tmp/IOTContainer/') # os.system('unzip -q ' + the_last_windowsAppZIP + ' -d /tmp/a/') # os.system('unzip -q ' + the_current_windowsAppZIP + ' -d /tmp/b/') os.system('/bin/sh -c /drone/src/zip_diff.sh') file_count = count_files_in_directory('/tmp/IOTContainer/') if the_last_windowsApp_GITversion == None: print("初次上传,不比对zip,直接打包上传") platformAppAdd(the_current_windowsAppZIP, '.zip') build_for_windowsApp() platformAppAdd('/drone/src/Sources/Setup.exe', '.exe') else: print ("比对新老版本zip文件") the_current_windowsAppZIP_dir = '/drone/src/IOTContainer' the_last_windowsAppZIP_dir = '/tmp/theLastCode/IOTContainer' if file_count == 1: print ("\033[34m比对结果: 程序版本无更新,流程终止\033[0m") else: print ("比对结果:程序版本已更新") os.system('cd /tmp/IOTContainer/ && zip -rq ' + os.getenv('DRONE_REPO_NAME') + '.' + os.getenv('version') + '.zip ./') diff_zip='/tmp/IOTContainer/' + os.getenv('DRONE_REPO_NAME') + '.' + os.getenv('version') + '.zip' platformAppAdd(diff_zip, '.zip') build_for_windowsApp() platformAppAdd('/drone/src/Sources/Setup.exe', '.exe') if os.getenv("isiot") != 'False': name=os.getenv('name') cdn_url = os.getenv('cdn_url') build_the_current_windowsApp(name) else: print ("is not iot")