iOS Fastlane+CI自动化构建
date
May 16, 2019
slug
fastlane-ios
status
Published
tags
iOS
summary
Agility
type
Post
摘要
在公司时,都是由一套完整的工具链完成,开发->构建->分发->测试,等流程
而作为个人开发时,失去了这套工具链,自然感觉到十分不便
所以笔者思考,能否自己搭建一套这样的工具链呢
需求列表
搭建一套工具,首先要明确我想实现的效果
我目前发布一个版本到TestFlight内测,需要以下几个步骤
- 手动改Xcode的build号格式为当天日期+次数,如09051601
- 手动archive,等待漫长过程,然后上传appstore
- 等待30分钟左右机器审核,然后手动选择组
- 重复输入更新内容,再点分发测试
如果需要发一个版本到AppStore
除了上述几个内容,我还需要
- 选择编译版本
- 添加版本更新内容
- 选择有无加密app
- 有无增加广告标识号
对于我而说,我希望上述两个过程,全部可以分别通过一行命令来进行
我希望我只需要git push一下,这些操作会自动在背后ci构建
最终实现效果
本地git push后
- 如果当前在master分支,ci自动打包发布TestFlight,版本号为当前日期+次数,并打tag提交。
- 如果当前在release/xxx分支,ci自动发布AppStore,版本号为当前日期+次数,并打tag提交。
流程示意图
Ci结果图
实现步骤
选用工具
- github作为存储代码的仓库
- travis-ci作为构建的ci
- fastlane作为构建工具
注意,如果你的仓库是私有仓库的话,travis-ci将不再免费,不过如果通过了学生认证的话,依旧是免费的,笔者因为目前是学生,所以并没有单独购买。
期间遇到的坑
- travis-ci 的KeyChain导致不能编译
- apple的两步验证导致流程不能通过
- build号自增
1.配置Fastlane
首先进入工程目录,安装并对工程目录初始化
接着修改Fastfile文件
可以参照我的Fastfile文件
1.1 更新版本号配置
在这一步中,我会先从iTunes Connect上获取最新的版本号,然后拉取下来,如果日期相同,则加一,否则重置为当天日期+01.比如19055101
1.3 上传testFlight配置
在这一部中,我会首先编译当前的app,然后上传到testFlight,最后更新版本tag,push到远端,再上传dysm到fabric中。Changelog.txt里会存放我这个版本的变更内容。
1.4 上传appStore配置
这一步和上一步也类似,只是apple store的选项比较多
2 ci配置
完成了上面两步,其实已经可以通过fastlane beta和fastlanbe release在本地发布了,因为本地非常方面,其实是不需要考虑以下问题。
- 证书导入
- 私钥导入
- github push权限
- apple connect权限
- 两步认证 而CI因为每次启动都是一个新的环境,这些全部要考虑一遍。 首先需要再fastlane/certs/目录下存放好相关的p12和描述文件,如图所示: 接着我在fastlane目录下,写了个导入描述文件的脚本: load_provision.sh
最后Fastfile部分如下
2.1 Travis-ci配置
这部分我以新开一个开发者账号的方式讲,我强烈推荐这种方式。 你可以在后文中找到,如果不开新账号,用原来带有两步认证的开发者账号怎么实现。
这里我们一共需要配置四个环境变量
- GH_Token //Github的token
- Cert_PassWord //证书密码
- FASTLANE_USER // Apple 账号
- FASTLANE_PASSWORD // Apple 账号密码
GH_Token
这一步是为了解决push权限的问题
然后将创建的token复制过来作为GH_Token的值即可
记得前面Fastfile里面的仓库地址也要改
FASTLANE_USER和FASTLANE_PASSWORD
这个很好理解,你的apple账号和密码。我踩了无数坑了,强烈建议重新创一个没有两步认证的apple小号。
然后在大号中邀请进来.
个人开发者账号虽然邀请进来的人不能拉取证书,但是一样有权限发布上传App
接着在ci中把FASTLANE_USER和FASTLANE_PASSWORD这两项配置好
Cert_PassWord
我们在keychain中,导出时设置的p12文件的密码,就是这一项
踩过的坑
1.为什么不直接用带有两步认证的账号
如果用带两步认证的账号,需要配置apple专用密码,并且还要加上session。
而session特别容易过期,网上说是30天,笔者测试下来一天就要重新设置一次,十分痛苦
如果一定要用的话,可以在刚刚的流程结束完,在ci中设置一个新的环境变量
FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD
可以在这里面设置
同时因为登录会话的问题,如果想在ci上直接绕过两步认证,还需要配置好session
然后复制session,我这里是在fastlane文件夹下创建了一个session.txt
将内容复制到里面去。
在脚本中再通过代码设置出来