最近有个需求,就是一个jenkins job需要打出两个包并上传,所以无法使用fir的jenkins plugin了
用python写了个脚本,想怎么上传就怎么上传。
python 脚本
1.fir 文档地址
2.python脚本 uploadFir.py
import argparse
import json
import re
import requests
get_token_url = 'http://api.fir.im/apps'
#获取token
def get_token(api_token, bundle_id):
headers = {}
headers['Content-Type'] = 'application/json'
data = {"type": "android", "bundle_id": bundle_id, "api_token": api_token}
getTokenResp = requests.post(get_token_url, headers=headers, data=json.dumps(data))
respJson = json.loads(getTokenResp.text)
print(respJson)
return respJson['cert']['binary']
#开始上传
def upload(url, key, token, apk_file, x_name, x_version, x_build):
file = {'file': open(apk_file, 'rb')}
data = {"key": key, "token": token, "x:name": x_name, "x:version": x_version, "x:build": x_build}
getTokenResp = requests.post(url, files=file, data=(data), verify=False)
respJson = json.loads(getTokenResp.text)
print(respJson)
#开始执行
def start(api_token, bundle_id, apk_path, x_name, x_version, x_build):
binary = get_token(api_token, bundle_id)
uploadKey = binary['key']
uploadToken = binary['token']
uploadUrl = binary['upload_url']
upload(uploadUrl, uploadKey, uploadToken, apk_path, x_name, x_version, x_build)
#从命令行获取参数
parser = argparse.ArgumentParser()
#api_token 就是fir后台你的一个token
parser.add_argument('-t', '--api_token', help='api_token input', type=str, required=True)
#应用的packageName
parser.add_argument('-i', '--bundle_id', help='bundle_id input', type=str, required=True)
#apk路径
parser.add_argument('-p', '--apk_path', help='apk_path input', type=str, required=True)
#应用名称,展示在fir下载地址里面,不影响包体
parser.add_argument('-n', '--x_name', help='x_name input', type=str, required=True)
#应用版本号,由于我们的jenkins是没有配置版本号的,所以隐藏
# parser.add_argument('-v', '--x_version', help='delimited list input', type=str, required=False)
#build号,对应jenkins BUILD_NUMBER 也可以自行设置
parser.add_argument('-b', '--x_build', help='x_build input', type=str, required=True)
#参数校验
args = parser.parse_args()
if args.api_token:
api_token = args.api_token
else:
parser.error('api_token parameter should be not null!')
if args.bundle_id:
bundle_id = args.bundle_id
else:
parser.error('bundle_id parameter should be not null!')
if args.apk_path:
apk_path = args.apk_path
else:
parser.error('apk_path parameter should be not null!')
if args.x_name:
x_name = args.x_name
else:
parser.error('x_name parameter should be not null!')
if args.x_build:
x_build = args.x_build
else:
parser.error('x_build parameter should be not null!')
if __name__ == '__main__':
# 我们的应用的version是从path中截取版本号
# 我们的path类似 D:\xxx-4.1.3(-1)-qq_apps_CPD-release.apk的统一格式,所以 在 -和(中间的就是版本号。
# 也可以根据你们的命名规则修改
x_version = re.findall(".*-(.*)\(.*", apk_path)
print(x_version[0])
print(x_build)
start(api_token, bundle_id, apk_path, x_name, x_version, x_build)
# start("d9778d8af996e92393d9010a05632512", "com.package.name", "D:\xxx-4.1.3(-1)-qq_apps_CPD-release.apk",
# "应用名称", "4.1.3", "123")
至此python脚本就结束了
Jenkins相应配置
我们用的Jenkins是 一个Windows的Slave,所以命令都是bat的
大致调用上传代码如下
D:\uploadFir.py -t "d9778d8af996e92393d9010a05632512" -i "com.package.name" -p "D:\xxx-4.1.3(-1)-qq_apps_CPD-release.apk" -n "应用名称" -b %BUILD_NUMBER%
或者更详细的调用方式可读性更好些
D:\uploadFir.py --api_token "d9778d8af996e92393d9010a05632512" --bundle_id "com.package.name" --apk_path "D:\xxx-4.1.3(-1)-qq_apps_CPD-release.apk" --x_name "应用名称" --x_build %BUILD_NUMBER%
网友评论