diff --git a/.drone.yml b/.drone.yml index a11bba4..9c4442b 100644 --- a/.drone.yml +++ b/.drone.yml @@ -29,9 +29,6 @@ steps: - name: 生成Release版本 pull: if-not-exists image: registry.cn-hangzhou.aliyuncs.com/tgabc-namespace/tgabc:semantic-release-v21.0.1 - volumes: - - name: gitea - path: /root/.ssh/id_rsa environment: GITEA_TOKEN: from_secret: gitea_token @@ -62,11 +59,8 @@ steps: - git describe --abbrev=0 --tags > .tags - cat .tags - - name: 获取上一个版本的zip - pull: if-not-exists - image: registry.cn-hangzhou.aliyuncs.com/qmiot/init:apisix-init-base - - name: 编译 + - name: 编译构建上传 pull: if-not-exists image: registry.cn-hangzhou.aliyuncs.com/qmiot/init:nsis20241212 commands: @@ -74,13 +68,6 @@ steps: - ls Sources/Setup.exe - du -sh Sources/Setup.exe - # zip打包 - - zip_name=$DRONE_REPO_NAME.$(cat .tags).zip - - cd ./IOTContainer - - zip -q -r $zip_name ./ - - ls $zip_name - - ls - - pwd when: branch: @@ -88,7 +75,7 @@ steps: - name: 上传exe和zip到iot测试接口platformAppAdd pull: if-not-exists - image: registry.cn-hangzhou.aliyuncs.com/qmiot/init:apisix-init-base + image: registry.cn-hangzhou.aliyuncs.com/qmiot/init:nsis20241212 environment: url_for_iotplatform: 'http://192.168.0.142:31667' url_for_iotfile: 'http://192.168.0.142:31666' @@ -96,11 +83,21 @@ steps: cdn_url: 'https://test-598d.1000my.com' # genre: "Samsung" commands: + + # zip打包 + - chmod +x zip_diff.sh + - zip_name=$DRONE_REPO_NAME.$(cat .tags).zip + - cd ./IOTContainer + - zip -q -r $zip_name ./ + - ls $zip_name + - ls + - pwd + # # 自动授权 # - export projectCode="projectCode=project-inluar4ppcxvciefgb_ila" - export isiot="True" # 要不要传iot - export name=${DRONE_REPO_NAMESPACE}-${DRONE_REPO_NAME} # 应用名称(自行填写 必填) - - export version=exe_$(cat .tags) # 应用版本 + - export version=$(cat .tags) # 应用版本 - export sourceId="8" # 应用来源id(默认为8 即测试环境专用) //如需更改查看测试环境平台级下应用管理新增应用的/api/platform/v1/platformProgram/platformProgramAdd接口 - export genre="localpack" # 应用类型 本地资源包 [outchain, localpack] - export resolution="2160*3840竖屏" # 分辨率(自行填写)[1080*1920竖屏, 1920*1080横屏, 3840*2160横屏, 2160*3840竖屏] @@ -108,6 +105,7 @@ steps: - export des=$CI_COMMIT_MESSAGE # 应用描述 - python3 iot_upload.py WindowsAPP + - export name=${DRONE_REPO_NAMESPACE}-${DRONE_REPO_NAME}.zip # 应用名称(自行填写 必填) - export package="/drone/src/IOTContainer/$DRONE_REPO_NAME.$(cat .tags).zip" # 包名称 - export version=zip_$(cat .tags) # 应用版本 - python3 iot_upload.py WindowsAPP diff --git a/iot_upload.py b/iot_upload.py index 9050c04..2e1af1d 100644 --- a/iot_upload.py +++ b/iot_upload.py @@ -2,6 +2,9 @@ import json import os import requests import sys +from hashlib import md5 +from wget import download +import ssl def file_write(file_name,text_content): # charset() @@ -45,12 +48,17 @@ def obsUpload(file,uploadType): return info # APP管理-新增APP -def platformAppAdd(): +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=str(os.getenv('package')),uploadType='compress') + + name = os.getenv('name') + if suffix !=None: + name = name + str(suffix) + bodyjson = { - 'name': os.getenv('name'), + 'name': name, 'version': os.getenv('version'), 'genre': os.getenv('genre'), 'logoCode': logoFile['code'], @@ -105,7 +113,7 @@ def multipleProgramToOneProject(): 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') + packageFile = obsUpload(file=str(os.getenv('package')),uploadType='compress') bodyjson = { 'name': os.getenv('name'), 'version': os.getenv('version'), @@ -131,31 +139,78 @@ def platformProgramAdd(): # multipleProgramToOneProject() -def get_the_last_windowsApp(name): +def get_the_last_windowsAppZIP(name): bodyjson = { - 'name': os.getenv('name'), + '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)) - print (r.text) - packageName=r.text['data']['packageName'] - packageUrl=r.text['data']['packageUrl'] - version=r.text['data']['version'] - print(packageName) - print(packageUrl) - print(version) - return + 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')}") + packageUrl=obj.get('packageUrl') + break # 找到第一个满足条件的对象后停止遍历 + + # 忽略未经核实的SSL证书认证,linux下wget可能会有ssl问题 + context = ssl._create_unverified_context() + ssl._create_default_https_context = ssl._create_unverified_context + download(cdn_url + packageUrl) + print(cdn_url + packageUrl) + the_last_windowsAppZIP = os.getcwd() + packageUrl.split("/")[-1] + return the_last_windowsAppZIP + else: + return None + +def build_for_windowsApp(): + print ("开始打包exe流程") + os.system('makensis Sources/nbn.nsi') + os.system('du -sh Sources/Setup.exe') + +def build_for_windowsAppZIP(): + print ("开始打包zip流程") + os.system('unzip ' + the_last_windowsAppZIP + ' -d /tmp/a/') + os.system('unzip ' + the_current_windowsAppZIP + ' -d /tmp/b/') +def build_the_current_windowsApp(name): + the_last_windowsAppZIP = get_the_last_windowsAppZIP(name) + if the_last_windowsAppZIP == None: + print("初次上传,不比对zip,直接打包上传") + else: + print ("比对新老版本zip文件") + the_current_windowsAppZIP="/drone/src/IOTContainer/" + os.getenv('DRONE_REPO_NAME') + '.' + os.getenv('version') + '.zip' + + with open(the_last_windowsAppZIP) as f: content1 = f.read() + with open(the_current_windowsAppZIP) as f: content2 = f.read() + + if md5(content1.encode("utf8")).hexdigest() != md5(content2.encode("utf8")).hexdigest(): + print ("比对结果:程序版本已更新") + os.system('mkdir -p /tmp/a/ /tmp/b/ /tmp/IOTContainer/') + os.system('unzip ' + the_last_windowsAppZIP + ' -d /tmp/a/') + os.system('unzip ' + the_current_windowsAppZIP + ' -d /tmp/b/') + os.system('/bin/sh -c zip_diff.sh') + diff_zip=os.getenv('DRONE_REPO_NAME') + '.' + os.getenv('version') + '.zip' + build_for_windowsApp() + platformAppAdd('/drone/src/Sources/Setup.exe', '.exe') + platformAppAdd(diff_zip, '.zip') + else: + print ("\033[34m比对结果: 程序版本无更新,流程终止\033[0m") -if os.getenv("isiot") != 'False': - if sys.argv[1] == "WindowsAPP": - platformAppAdd() - elif sys.argv[1] == "distZIP": - platformProgramAdd() + + + + +if os.getenv("isiot") != 'False': + name=os.getenv('name') + build_the_current_windowsApp(name) else: print ("is not iot") if os.getenv("DRONE_BRANCH") == 'master': diff --git a/zip_diff.sh b/zip_diff.sh new file mode 100644 index 0000000..795288d --- /dev/null +++ b/zip_diff.sh @@ -0,0 +1,12 @@ + +for i in $(diff -rq /tmp/a/ /tmp/b/ | grep Only | awk '{print $NF}') +do + mv /tmp/b/$i /tmp/IOTContainer/ +done + +cd /tmp/IOTContainer/ + +zip_name=$DRONE_REPO_NAME.$(cat .tags).zip +zip -q -r $zip_name ./ + +