一个可以自动打包和发布测试的工具
- 定时拉取代码,根据 git commit message 来决定是否打包
- 打包前拉取最新代码
- 过滤两次打包间的 git 日志
- 打包成功后更新到 fir.im
- 打包成功后上传符号文件到 bugly
- 复制 ipa 到某个地方
- 打包成功后发送邮件(可选是否发送 git 日志)
- 打包成功后发送钉钉消息(可选是否发送 git 日志)
- 打包失败后发送邮件,附带打包日志
- 可手动使用,只上传到 fir.im 和符号文件
- Xcode 9
- Python3
- Git
- fir gem
- bugly jar 文件和 Java 环境
本工具只支持 Python3,并依赖几个工具,你必须手动安装它们
- 安装 Xcode 9
- 安装 python3
- 安装 Java 运行时环境 (下载 JDK 并安装)
- 安装 fir-cli
- 测试手动打包是否成功运行
- 添加计划任务(如果需要)
First you should install the python dependencies 首先需要安装 Python 模块
git clone https://github.com/cielpy/build_ipa.git
cd build_ipa
[sudo]pip3 install -r requirements.txt
Usage: build.py [options] arg
Options:
-h, --help show this help message and exit
-c CONFIG, --config=CONFIG
config file path
-a, --auto use auto mode, defalut False, you must set target
option with valid value when defalut value
-t TARGET, --target=TARGET
build target, will be ignored when auto option is True
使用示例
path/to/python3 path/to/build.py -c path/to/config -t 'dev'
以下是一个配置文件示例,使用 YAML 格式
# ===========================================
# 打包配置文件
# ===========================================
# 项目路径(绝对路径)
project_path: 'path log project'
# 项目目录下的 Workspace 名字
worspace_name: 'Example.xcworkspace'
# 日志保存路径(绝对路径)
log_path: 'path of log'
# IPA 保存路径(绝对路径)
builds_path: 'path of builds, for IPA'
# 日志文件名,相对于 builds_path 的路径
builg_log: build.log
# Git 相关信息
git:
# 是否开启打包前拉取代码
pull_before_build: true
# 需要打包的分支,如果未设定,则会使用工程的当前分支
branch:
# 钉钉配置
send_ding_msg_after_build:
enable: false
# token 数组,收集需要消息的群的 token
tokens:
- cbd71be588ejldjaf232311b2551ad6dae09b47549aef7e2dd513d906d64c77a
- 736df1d522fee3f7cc29d0joalfja11sll4df9351589be32d7dfabca7637677d
# 是否发送过滤好的日志
send_filter_log: true
# 日志过滤信息
filter_log:
# 日志的前缀
prefix: "["
# fir.im 配置
upload_to_fir:
enable: true
# fir-cli 路径
path: '/usr/local/bin/fir'
token: 7lkjljlkaaab0ed4322a685c1d61f
# 复制信息
copy_to:
enable: true
# 打包成功后复制到的路径
path: 'path to copy'
# Bugly 配置
bugly:
enable: true
# Jar 文件路径(绝对路径)
jar_file: 'file path of bugly Jar file'
# 电子邮件登录信息,须支持 SSL 登录
mail_info:
server: smtp.example.com
user: admin@example.com
password: password
# 电子邮件配置,打包成功后
email_after_build:
enable: true
# 是否发送过滤的日志
send_filter_log: true
# 邮件接收者
send_to:
- send_to@example.com
# 邮件需要抄送的人
cc_to:
- cc_to@example.com
# 打包失败后邮件配置
email_after_failure:
enable: false
# 邮件接收者
send_to:
- send_to@example.com
cc_to:
- cc_to@example.com
cc_to:
# 打包配置
build:
dev:
info_plist: Example/Info.plist
bugly_key: cac0689a-lkkk-11212-a120-4e0118f8d462
bugly_id: i1400012222
download_url: https://fir.im/abcd
app_name: Example
team_id: JLKJJ3333
export_mothod: development
scheme: Example
bundle_id: com.example
provisioning_profile: 'iOS Development Dev'
# Extra provisioning profile, use for project have extentions
extra_provisioning_profile:
- bundle_id: com.example.extention
provisioning_profile: 'iOS Development Dev Extention'
resign:
enable: true
provisioning_profile: '/Users/xxx/Documents/xxx.mobileprovision'
certificate: 'iPhone Distribution xxx Net Co., Ltd.'
# Change app display nama
app_name:
# Change bundle id, if not config, use provisioning profile's instead
bundle_id:
extentions:
# Extentsion's scheme
- scheme: xxx
provisioning_profile: '/Users/xxx/Documents/xxx.mobileprovision'
bundle_id:
# Identifier use to detect a build, must unique among all build info
build_identifier: BUILDIPA_DEV
dis:
info_plist: Example/Info.plist
bugly_key: jlkjlkjaa-7c5c-41e3-b54f-8dabd4c4da2b
bugly_id: i1400111110
download_url: https://fir.im/efgh
app_name: Example-PROD
team_id: JLKJLFDS11
export_mothod: ad-hoc
scheme: Example_PROD
bundle_id: com.example.prod
provisioning_profile: 'iOS Distribution Prod'
# Identifier use to detect a build, must unique among all build info
build_identifier: BUILDIPA_PROD
It's recomment use auto mode with launchctl, there has two benifit
- launchctl environment can aceess login keychain, THIS IS A HUGE BENIFIT, you can save many time deal the cetificate issue.
- launchctl run one instance at a time, you do not need warry about to many install run at same time.
推荐使用 launchctl 来运行计划任务,有两个好处
- launchctl 可以访问登录钥匙串
- launchctl 自动处理多次打包情况,一次只运行一个任务
以下是一个 launchctl 的配置示例
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin</string>
<key>PYTHONIOENCODING</key>
<string>UTF-8</string>
</dict>
<key>Label</key>
<string>com.cielpy.ipa</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/python3</string>
<string>path/to/build.py</string>
<string>-u</string>
<string>-a</string>
<string>-c</string>
<string>path/to/build.yaml</string>
</array>
<key>RunAtLoad</key>
<true />
<key>StartInterval</key>
<integer>60</integer>
<key>StandardErrorPath</key>
<string>/tmp/AlTest1.err</string>
<key>StandardOutPath</key>
<string>/tmp/AlTest1.out</string>
</dict>
</plist>
Move it to ~/Library/LaunchAgents/
and run this command:
launchctl load ~/Library/LaunchAgents/com.cielpy.build_ipa.plist
Python 脚本将每 60s 运行一次,你可以自行修改。
配置完成后,你可以提交一个 commit,message 包含 BUILDIPA
字符串(在打包配置中设置),launchctl 将运行打包脚本并将 IPA 上传到第三方平台和其他操作。