美文网首页
iOS持续集成(Python)

iOS持续集成(Python)

作者: 24k纯帅哥 | 来源:发表于2021-04-28 17:15 被阅读0次
本文主要介绍 iOS 打包脚本所必须的配置,及注意事项。脚本中不涉及第三方打包工具,如:`fastlane`
完全是基于 `Apple` 官方提供的 `xcodebuild` 编译打包,通过 `itms-services` 分发应用,
以及通过 `altool` 将 `ipa` 上传至 `iTunes Connecnt`。

项目

  • 项目名称:iOS-CI-Script
  • 前提:
    • 使用此项目进行持续集成,项目中的证书管理必须采用手动管理的方式
    • 项目须使用 Cocopods 管理第三方模块(如不符合此条,可以自行调整 xcodebuild 打包命令即可
      Tip:此项目主要针对持续集成,如:Jenkins 或 GItLab CI 使用,若想在本地直接运行,需要进行微调
  • 能做什么???
    1. 打包之前修改 APP 名称(CFBundleDisplayName)、版本号(CFBundleShortVersionString)及构建号(CFBundleVersion
    2. 可以结合 Jenkins 选择 Configuration 的打包类型,选择你需要构建的类型,如:DebugEnterpriseRelease 等等
    3. 结合 Jenkins 或 GitLab CI 实现应用分发,无需依赖第三方平台
    4. 结合 Jenkins 或 GitLab CI 将 ipa 自动上传 iTunes Connect,并发布 TestFlight 内测
      Tip:无论各位所在的公司中有多少个开发项目或者马甲包,使用此脚本,只需一个配置文件即可轻松搞定持续集成哦

运行环境

  • Python 3.5 及以上(Mac 安装:brew install python3
  • xcodebuild
  • xcpretty(安装方式:gem install xcprettyRubyGems 安装请点击链接,这里就不再赘述)
    Tip:脚本运行所需第三方模块,见项目根目录下的 Pipfile 文件内容

运行方式

python3 ci.py

目录结构

├── Pipfile  // pipenv 安装依赖库的配置文件
├── README.md  // 使用说明文件
├── ci.py  // 入口文件
├── modify_plist.py  // 修改项目中的 APP 配置文件,及脚本中打包依赖的 plist 文件
├── compile.py  // xcodebuild 打包相关的配置,包含:clean、archive、export ipa、zip dSYM
├── archive.py  // 处理 Jenkins 归档的相关操作,详情请看代码注释
├── configurations  // 此目录存放 app 的配置信息文件(支持多个 APP 打包配置文件,在 `Jenkins + iOS 持续集成配置` 会进行持续集成配置讲解),详情请看下面文件的介绍信息
│   └── example.plist  // 配置文件模板
├── libs  // 此目录存在一些工具里及环境变量文件
│   ├── __init__.py
│   ├── configuration.py  // 初始化配置类
│   ├── env_enum.py  // 存在环境变量文件
│   ├── html_tools.py  // html 解析类(目前暂未使用)
│   ├── make_qr_code.py  // 生成二维码函数
│   └── plist_operation.py  // 操作 plist 工具类
├── plist  // 存在 exportOption 配置文件
│   ├── ad-hoc.plist
│   ├── app-store.plist
│   ├── development.plist
│   ├── enterprise.plist
│   └── itms-services.plist  // 此文件的作用是分发应用,与打包无关
└── static  // 存放静态资源文件
    ├── html  // 存放 html web 静态页面的目录,在 `Jenkins + iOS 持续集成配置` 这篇中会进行演示
    └── icon  // 存在 app icon 的目录

使用说明

基础参数配置

# 编辑 `lib` 目录下的 `env_num` 变量文件
# 需手动更改的参数(选择默认也可以)
DIST_CONFIGURATION_NAME = 'Release'
ARCHIVE_DIR_NAME = 'Products'
SCRIPT_DIR_NAME = 'scripts'
WORKSPACE_URL = f'{BUILD_URL}execution/node/3/ws/'

  • 变量说明
    • DIST_CONFIGURATION_NAME:项目中配置发布证书的 configuration 的名称
    • ARCHIVE_DIR_NAME:Jenkins 配置归档的目录名称,此目录是被创建在代码的根目录
    • SCRIPT_DIR_NAME:存在脚本项目的目录名称,也是在项目的根目录下
    • WORKSPACE_URL:此 URL 是通过 Jenkins 的 Web 页面上访问的 WORKSPACE 的 URL(必须修改)

iTunes Connect 参数配置

# 编辑 `lib` 目录下的 `env_num` 变量文件
# iTunes Connect 配置
UPLOAD_ITUNES_CONNECT = os.getenv('UPLOAD_ITUNES_CONNECT', 'false') 
ITC_USER = os.getenv('ITC_USER', None)
ITC_PASSWORD = os.getenv('ITC_PASSWORD', None)

  • 变量说明
    • UPLOAD_ITUNES_CONNECT:上传 iTunes Connect(发布 TestFlight 内测),默认 false 不上传
    • ITC_USER:开发者账号用户名
    • ITC_PASSWORD:开发者账号密码(若 Apple 账号已开启双重认证,请生成并使用专用密码
      注:为了安全起见,不建议将开发者账号的用户名和密码写死在脚本或则环境系统的环境变量中,个人建议写在 Jenkins 的 JOB 中,针对此 JOB 做权限控制即可

APP 配置文件参数讲解

example.plist
  • 配置文件参数说明
    • appName:应用名称
    • workspace:app workspace(注:如果无 workspace,就需要修改 compile.py 文件的中打包命令,针对目前大部分项目都是用 Cocopods 管理依赖库的,所以目前未对未使用 workspace 的项目兼容
    • scheme:scheme (嗯.....不好描述,如果对 workspacescheme 不理解的,请点击 这里
      • 注:在项目中必须将此 scheme 设置为 shared
    • iconPath:存在 static/icon 目录下的 icon
      • icon 规格:推荐 128 * 128 或 144 * 144(大小适中即可
        Tip:这是用于生成二维码时,给中间增加图标用的,如果图片不合法会报错,所以需要让 UE 或者 RD 把这个 icon 给你
    • plistPaths:配置自代码根目录下的 info.plist 文件的相对路径,主要包括:项目及 Extension 中的 info.plist 文件路径(注:和 APP 不相关的 info.plist 无需配置
    • DebugAdHocReleaseEnterprise,这几个都是项目中 Configuration 的名称,由于配置都是一样的,所以就 Debug 进行说明,如下👇
      • method:此参数的值有四种类型:app-store, ad-hoc, enterprise or development 详情请查看 Xcode Archive: export options 此文档
      • teamID:开发者账号的 ID,获取方式:登录开发者账号 → 点击 Team Name → 选择 View Account,然后在页面中找到 Team ID 即可
      • bundleID:就是 APP 的唯一标识,如:com.companyName.porjectName
      • provisioningProfiles:此配置参数是字典类型 key: value
        • key 的值为 bundleID
        • value 的值为 buildID 所对应的描述文件(Provisioning Profile)的名称
          注:项目中涉及到所有的 bundleID 都必须要用 key: value 的形式写在这里,例如:除了项目的 bundleID 和 NotificationServiceExtension(如果 APP 不涉及推送,请忽略) 的 bundleID这两个,可能还有自定义的 ExtensionbundleID

其它

itms-services(了解即可)

通过 itms-services 协议,发布或者分享 iOS 应用程序导读:itms-services 协议常用于 iOS 企业应用的无线部署,这可在不使用 iTunes 的情况下将内部软件发布或者分享给用户。

  • 实现原理
OTA 方式安装,是通过 Safari 解析链接中的 "itms-services://" 来实现的。
例如:
<a title="iPhone" href="itms-services://?action=download-manifest&url=https://github.com/NAISI-ZC/iOS-CI-Script/blob/master/plist/itms-services.plist">
  安装应用
</a>
Safari 会去读取 itms-services.plist 中的信息,如:iOS 应用的名称、版本、安装地址等。
什么是 OTA???
OTA 即 Over-the-Air,是 Apple 在  iOS 4 中新加的一项技术,目的是让开发者能够脱离 Appstore,实现从自己的服务器下载并安装 iOS 应用。
简单地说,就是用户只需要在 Safari 中点开一条链接,就能直接在主界面中安装 APP

  • 注意事项
    1. itms-services 协议拼接的 URL 必须是 HTTPS 服务
    2. HTTPS 无须暴露在公网下,只要保证是可信的证书即可(自签名证书生成,个人没做过,所以不做断言。个人觉得关于证书问题直接找运维解决就可以了

配置持续集成请查看 Jenkins + iOS 持续集成配置

相关文章

网友评论

      本文标题:iOS持续集成(Python)

      本文链接:https://www.haomeiwen.com/subject/tgwvrltx.html