2017/09/29更新
修改project_path在新版fastlane脚本中的获取方式
2017/05/31更新
添加FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT设置
2017/02/27更新
fastlane更新后统一了各工具的使用,文章做了相应命令的更新
2016/04/21更新
文中所列脚本也更新到了https://github.com/xilin/ios-build-script
2016/03/14更新
使用fastlane gym打包
- 安装gym
- https://github.com/fastlane/fastlane
- gym使用了最新的API进行打包,速度更快,设计上也更简洁智能
- 需要先装好ruby再执行
sudo gem install fastlane
- 新脚本
- 不再需要手工指定provisioning profile了
- 打包核心命令从三行变为一行
#!/bin/bash
#更新timeout
export FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT=120
#计时
SECONDS=0
#假设脚本放置在与项目相同的路径下
project_path="$(dirname "$(pwd)")"
#取当前时间字符串添加到文件结尾
now=$(date +"%Y_%m_%d_%H_%M_%S")
#指定项目的scheme名称
scheme="DemoScheme"
#指定要打包的配置名
configuration="Adhoc"
#指定打包所使用的输出方式,目前支持app-store, package, ad-hoc, enterprise, development, 和developer-id,即xcodebuild的method参数
export_method='ad-hoc'
#上述scheme/target/configuration若不清楚值可以用`xcodebuild -list`查看
#指定项目地址
workspace_path="$project_path/Demo.xcworkspace"
#指定输出路径
output_path="/Users/your_username/Documents/"
#指定输出归档文件地址
archive_path="$output_path/Demo_${now}.xcarchive"
#指定输出ipa地址
ipa_path="$output_path/Demo_${now}.ipa"
#指定输出ipa名称
ipa_name="Demo_${now}.ipa"
#获取执行命令时的commit message
commit_msg="$1"
#输出设定的变量值
echo "===workspace path: ${workspace_path}==="
echo "===archive path: ${archive_path}==="
echo "===ipa path: ${ipa_path}==="
echo "===export method: ${export_method}==="
echo "===commit msg: $1==="
#先清空前一次build
fastlane gym --workspace ${workspace_path} --scheme ${scheme} --clean --configuration ${configuration} --archive_path ${archive_path} --export_method ${export_method} --output_directory ${output_path} --output_name ${ipa_name}
#上传到fir
fir publish ${ipa_path} -T fir_token -c "${commit_msg}"
#输出总用时
echo "===Finished. Total time: ${SECONDS}s==="
目标
- 对于一个使用
CocoaPods
做依赖管理的Xcode项目,编写一个脚本实现自动打包ipa文件,并上传到fir上。
准备环境
- 安装xctool
- https://github.com/facebook/xctool
- xctool是官方xcodebuild的一个增强实现,输出的内容比xcodebuild直观可读得多
- 通过brew即可安装
brew install xctool
- 安装fir-cli
- fir的命令行工具
- 需要先装好ruby再执行
gem install fir-cli
一些概念
- *.workspace文件
使用CocoaPods
管理的工程在执行完pod install
之后生成的workspace文件 - scheme
显示在Xcode的左上角,run图标的右边,设备选择的左边 - configuration
在Xcode中选项目,Info tab下会列出所有的configuration,一般有Debug和Release两种 - provisioning profile
在Xcode中选target,在Build Settings
tab下搜索Provisioning Profile
,默认应该是Automatic
,点击看到下拉列表中的就是所有可用的名称
脚本的步骤
- 清理项目
- 生成archive
- 导出ipa
- 上传到fir
最终脚本
#!/bin/bash
#计时
SECONDS=0
#假设脚本放置在与项目相同的路径下
project_path=$(pwd)
#取当前时间字符串添加到文件结尾
now=$(date +"%Y_%m_%d_%H_%M_%S")
#指定项目的scheme名称
scheme="DemoScheme"
#指定要打包的配置名
configuration="Adhoc"
#指定打包所使用的provisioning profile名称
provisioning_profile='AdHoc Profile'
#指定项目地址
workspace_path="$project_path/Demo.xcworkspace"
#指定输出路径
output_path="/Users/your_username/Documents/"
#指定输出归档文件地址
archive_path="$output_path/Demo_${now}.xcarchive"
#指定输出ipa地址
ipa_path="$output_path/Demo_${now}.ipa"
#获取执行命令时的commit message
commit_msg="$1"
#输出设定的变量值
echo "===workspace path: ${workspace_path}==="
echo "===archive path: ${archive_path}==="
echo "===ipa path: ${ipa_path}==="
echo "===profile: ${provisioning_profile}==="
echo "===commit msg: $1==="
#先清空前一次build
xctool clean -workspace ${workspace_path} -scheme ${scheme} -configuration ${configuration}
#根据指定的项目、scheme、configuration与输出路径打包出archive文件
xctool build -workspace ${workspace_path} -scheme ${scheme} -configuration ${configuration} archive -archivePath ${archive_path}
#使用指定的provisioning profile导出ipa
#我暂时没找到xctool指定provisioning profile的方法,所以这里用了xcodebuild
xcodebuild -exportArchive -archivePath ${archive_path} -exportPath ${ipa_path} -exportFormat ipa -exportProvisioningProfile "${provisioning_profile}"
#上传到fir
fir publish ${ipa_path} -T fir_token -c "${commit_msg}"
#输出总用时
echo "===Finished. Total time: ${SECONDS}s==="
网友评论
Fastfile:63: syntax error, unexpected end-of-input
project_path=$(pwd)这什么什么情况
Fastfile:63: syntax error, unexpected end-of-input
project_path=$(pwd)
[!] xcodebuild -showBuildSettings timed-out after 10 seconds and 3 retries. You can override the timeout value with the environment variable FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT, and the number of retries with the environment variable FASTLANE_XCODEBUILD_SETTINGS_RETRIES
export FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT=120
fir publish ${ipa_path} -T "53651903eb5fa8cXXc798074XXXdb" -c "${commit_msg}"
报错信息
/Users/XXX/Documents/BestPlayer_2017_04_06_15_23_19.ipa
/Users/panhongliu/Desktop/dabao.sh: line 42: fir: command not found
xattr: No such file: ~/Desktop/DianCan-IPA/DianCan_2017_03_31_19_32_55.xcarchive
[19:37:02]: Successfully stored the archive. You can find it in the Xcode Organizer.
[19:37:02]: The generated archive is invalid, this can have various reasons:
[19:37:02]: Usually it's caused by the `Skip Install` option in Xcode, set it to `NO`
[19:37:02]: For more information visit https://developer.apple.com/library/ios/technotes/tn2215/_index.html
[19:37:02]: Also, make sure to have a valid code signing identity and provisioning profile installed
[19:37:02]: Follow this guide to setup code signing https://docs.fastlane.tools/codesigning/GettingStarted/
[19:37:02]: If your intention was only to export an ipa be sure to provide a valid archive at the archive path.
[!] Archive invalid
configuration="Adhoc"
这个不起作用呢上传不到fir那边?
swift 的项目打包出来很大。。。 怎么办啊,楼主
2指定打包所使用的provisioning profile名称 provisioning_profile='Automatic'这样写可以吗?为啥我找不到ipa包在哪呢 但是有xcarchive文件,谢谢
ipa包导出在ipa_path里,看你设置的是什么了。
fir publish ${ipa_path} -T fir_token -c "${commit_msg}"
这一段 是要加上fir的apitoken?