iOS 使用python3实现自动化打包

ios 用python实现自动打包的方式方式v1

文件位置 https://github.com/l819183457/package.git

实现方法 sudo python3 package_v4.py 90004

先简单说一下我实现的思路一期的思路

这个脚本自动打包的方式,是根据我自己手动打包的流程来实现的,先在开发证账号下载好需要的证书和描述文件,放到钥匙串里面和xcode 里面,然后配置项目,开始打包
* 在工程同级目录下面我创建了一个.package 文件,将项目打包需要的资源都放在这个文件下面,项目需要,
    *打包证书,
    * 描述文件,
    * 项目配置文件(configuration这里面我只放了证书密码和项目名称),
    * 还有打包脚本,
当打包脚本触发的时候会相应的读取项目配置文件,读取密码,然后把证书文件导入钥匙串中,之后会读取描述文件解析文件内容,把需要的描述文件uuid 名称,TeamName,TeamIdentifier,Name解析出来,然后把描述文件复制到Provisioning Profiles文件下面,用uuid起名,前期准备工作就准备完成了,之后就是把描述文件和证书配置到项目中去了,这下完成项目配置,这边还有个操作就是配置项目域名,我在项目中配置了一个plist 做了一个参数修改它来修改当前请求环境,之后就是用xcodebuild生成achive文件,生成ipa文件,压缩

说一下代码的实现吧

环境

* 苹果最新系统,需要有xcode 
* python3  pip3 环境

支持库

* shutil  文件复制操作库
* mobileprovision   描述文件解析
* pbxproj   项目工程配置
* biplist plist 文件解析
* zipfile  文件打包压缩

特别说明

现在苹果最新的系统需要的权限比较高,所以记得去给终端高一些的权限

代码部分

先读取配置文件获取项目名称和证书密码

`exportOptionsPlist = os.path.join(project_path + "/.package/exportOptions.plist")`

把指定目录下面的证书循环找出来导入钥匙串 security import

` for cert_name in os.listdir(file + "/certificates/certs"):
    if ".p12" in cert_name:
        cert_file = file + "/certificates/certs/" + cert_name
        os.system(
            "security import " + cert_file + " -k " + keychain_path + " -P " + keychain_password + " -T /usr/bin/codesign")
        systemLog("导入证书:" + cert_name)
`

解析描述文件 获取UUID、TeamName、TeamIdentifier、Name

`mp_model = MobileProvisionModel(mobileprovision_file + mobileprovision_name)
    UUID = mp_model['UUID']
    TeamName = mp_model['TeamName']
    TeamIdentifier = mp_model['TeamIdentifier'][0]
    Name = mp_model['Name']
    print(mp_model)
 `

把描述文件放到指定文件(这个思路是我看系统的描述文件都是用它的uuid放到文件夹中的 ,看到效果还不错)

 `shutil.copy(mobileprovision_file + "" + mobileprovision_name,
                os.path.expanduser('~')+r'/Library/MobileDevice/Provisioning Profiles')`

将项目工程配置

 `project = XcodeProject.load(project_path + '/' + project_name + '/' + project_name + '.xcodeproj/project.pbxproj');
# project.add_code_sign("Apple Distribution: " + TeamName, TeamIdentifier, UUID,
#                       Name + ".mobileprovision")
project.add_code_sign("Apple Distribution: " + TeamName, TeamIdentifier, UUID,
                      Name)`

这个地方是我在项目中会配置一个环境plist 对应的请求域名,来自动化配置环境,

`path = search(project_path, "configuration.plist")
plist = readPlist(path)
# plist.save()
plist['CURRENT_CONFIGURATION'] = project_url`

这个地方就是关键打包的了使用的xcodebuild 先 archive 然后打出安装包

`os.system("xcodebuild  " +
          "-workspace " + project_path + '/' + project_name + '/' + project_name + ".xcworkspace " +
          "-scheme " + project_name + " " +
          "-configuration Release " +
          "-destination generic/platform=iOS " +
          "-archivePath " + archivePath + " " +
          "clean " +
          "archive")
plist = readPlist(exportOptionsPlist)
plist["provisioningProfiles"][project_id] = Name
writePlist(plist, exportOptionsPlist)
exportPath = project_path + '/.package/build/' + op
os.system("xcodebuild " +
          "-exportArchive " +
          "-archivePath " + archivePath + " "
          "-exportPath " + exportPath + " "
          "-exportOptionsPlist " + exportOptionsPlist)`

最后做了一下压缩,因为生产可能产生两个包 一个appstore一个ad—hoc 用于测试

` zip = zipfile.ZipFile(file + '/'+ "dist.zip" , mode="w")
            zip.write(os.path.join(exportPath, cert_name),cert_name )
            zip.close()`

补充

* 证书和描述文件 这个地方可以扩展变得灵活一些就是用git下载,每次都更新描述文件和证书,这样如果需要更新描述文件了,就可以放到相应的仓库去下载,得到的包就是最新的,不用提交代码,和代码分割开
* 网上还有一些直接把设备信息写入描述文件的,
* 还有直接上传到操作,这个氮素写的一个工程上传sftp服务器上面,没有结合,后期添加,并且分渠道上传的功能(fir,蒲公英,appstore等功能)

info

这个是我第一次自己这么正经的写一套自己实现的方法吧,希望能给大家带来帮助,如果有问题,或者好的想法,可以一起讨论
以后如果有时间我还是会升级这个库的,希望能完善咱们ios的打包流程,让我们更自动化
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,492评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,048评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,927评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,293评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,309评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,024评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,638评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,546评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,073评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,188评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,321评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,998评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,678评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,186评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,303评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,663评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,330评论 2 358