iOS可持续构建集成部署,Jenkins+Fastlane+Git+Fir架设一键构建部署内测分发服务!
首先我们来看一个iOS开发手动构建打包的故事......
就如大家熟悉的,我们平常手动打包都要经历更新代码、更新build version、使用Xcode Archive出IPA包。然后如果是内测包就保存到本地,如果要使用内测分发网站,就要上传到相应的网站并配置好相应的参数;如果是上传TestFlight或者App Store包则直接上传。
这一套下来,偶尔做做还觉得没什么,如果是遇到频繁修改需求、调整UI、修复BUG,又或者是同时有好几个任务分支需要分别打包的时候,就会十分抓狂了,最后不能自拔,堕落深渊。
难道就这样了吗?就只能这样屈服于可恶的现实吗?
不!
我们要直面惨淡的人生,敢于挑战种种操蛋的困难!
在这里,我要向大家传授一套“组合拳”,虽然不像军体拳一样能够克制女子防狼术,但是确实能大大减轻苦逼iOS开发们的工作,提升效率。
以下是需要用到的招式:
- Git: 管理代码,这里我使用OSChina的git仓库服务;
- Jenkins: 提供构建平台,从git仓库拉取代码、更改build version、调用fastlane;
- Fastlane: 构建代码、打包、上传
- Fir: 内测分发网站
都说了是组合拳,所以我这里只会说说这套技术最简单的应用,至于Jenkins和fastlane的各种插件、扩展功能(十分强大),请有兴趣的继续了解。
1.准备一个project
1.1创建项目
这里我随便创建一个项目,随便打上一行字
1.2配置项目
1.2.1配置一下证书
如果自己有证书那就直接使用Xcode的自动管理即可,但是我没有,于是我上X宝买了一个临时的(囧)。
要手动配置一下。
1.2.2配置build number
为了稍后实现自动递增build number做准备,这里我使用4段式,最后6位是时间。
2. Fastlane的安装使用
Fastlane应该说是一个ruby工具集合包,是一个全方位自动化流程工具,从构建、签名、封包、上传、单元测试等等都可以做,十分强大方便。
这里有两个名词(其实我也不懂ruby,这是我的粗浅理解):
action: Fastlane的插件,fastlane有自带提供诸多功能的action,也可以自定义。可以理解为封装好的ruby函数。
lane: Fastlane的任务,开发者编写,可以理解为fastlane命令调用的自定义方法。
2.1 安装
直接使用rubyGem命令安装即可
sudo gem install fastlane
可以随时使用以下命令查看版本
fastlane --version
ps:关于fastlane升级
我发现直接使用sudo gem update fastlane总是失败,一定要先用sudo gem uninstall fastlane删除旧版本,再重新安装,才能装到最新版本。
2.2初始化Fastlane
进入到项目目录,使用以下命令初始化
fastlane init
按照提示输入相关信息,然后就会自动创建出fastlane的配置文件
2.3开始写fastlane脚本代码
要用到的Action
- gym: 针对于 iOS 打包和签名的自动化工具
- get_version_number: 获取项目version number
- ensure_git_status_clean: 检查git状态
- git_pull: git拉取代码
- increment_build_number: 递增build version number
- commit_version_bump: 创建一个build version number改变的提交注释
- push_to_git_remote: git推送代码到远程仓库
2.3.1编辑“Fastfile”文件
里面已经给你提供了一个基本的流程模板
2.3.2使用gym构建打包
先来看一下fastlane怎么跑,删除多余代码,增加一个打印代码
# This is the minimum version number required.
# Update this, if you use features of a newer version
fastlane_version "2.18.3"
default_platform :ios
platform :ios do
lane :ci do
puts "Begin to run ci"
end
end
在终端输入以下命令运行lane,格式是“fastlane + platform + lane”
fastlane ios ci
好,确定fastlane是可以跑的!
那我们改一下代码,这里因为我买的证书只有开发真机测试的,没有分发的,所以传一个export_method参数为“development”。还有一个参数output_directory是ipa包保存地址。
# This is the minimum version number required.
# Update this, if you use features of a newer version
fastlane_version "2.18.3"
default_platform :ios
platform :ios do
lane :ci do
puts "Begin to run ci"
gym(
export_method:"development",
output_directory:"./fastlane/build",
)
end
end
跑起来,孩儿们!
fastlane的log真是超棒棒的!
ipa包已经打出来了。
2.3.3安装fir-cli工具
fir提供了一套打包、上传的工具,其实它也可以打包,但是我还是喜欢用fastlane,因为真的太强大了。
fir-cli github地址
在fir注册后获取你的token。
2.3.4完善fastlane脚本
这个用来区分不同的版本,免得搞混了。
我先在OSChina旗下的码云创建了一个仓库(你们也可以使用github),创建了2个新分支dev1和dev2,模拟开发中多个功能同时开发的情况。
直接上代码
# This is the minimum version number required.
# Update this, if you use features of a newer version
fastlane_version "2.18.3"
default_platform :ios
platform :ios do
lane :ci do|options|
branch = options[:branch]
build_no = get_version_number + '.' + Time.new.strftime("%m%d%H%M")
puts "Begin to run ci"
#确认分支、git状态、拉取最新代码
sh "git checkout #{branch}"
ensure_git_branch(branch: branch)
ensure_git_status_clean
git_pull
#递增build number
increment_build_number(build_number: build_no)
#开始打包
gym(
export_method:"development",
output_directory:"./fastlane/build",
)
#使用fir-cli上传ipa
sh "fir publish ./build/HVWCIDemo.ipa -T 304795a8933faf8bc1ba8b21521eafa1"
end
end
跑跑跑,这里我增加了一个参数"branch"用来区分不同的分支。
fastlane ios ci branch:dev1
中间省略......
我们可以看到,fir上已经成功上传到了一个ipa包!
现在你已经可以使用fastlane一句代码构建、打包、上传app了!
但是如果我连一句代码都不想打,也不想每次都要进入项目目录、打开终端来操作;而且如果其他小伙伴也想用这个方便的工具怎么办?难道每个人都要装一套?
当然不!我们可以使用Jenkins作为容器,做一个构建服务器。
请看下文。
3. Jenkins的安装使用
来这里Jenkins官网下载,可以直接下个war包,然后跑命令跑起来,安装的话安装默认的插件就好了,之后可以自己配的。
java -jar jenkins.war
配置完进来就是这样子
3.1配置一下git仓库的ssh登录
如果不使用ssh登录的话,会在jenkins运行的终端出现账号密码输入提示。
生成一个ssh key,把公钥上传到码云,私钥配置到Jenkins中。
3.2创建Jenkins任务
3.2.1新建任务
3.2.2配置git
3.2.3配置调用Fastlane的命令
3.2.3跑起来
点击正在构建的任务
再点击Console Output可以看到终端输出
这里就可以看到Fastlane的log了
Done!
已经上传了一个新包到fir
好了,这样你就可以把这个服务共享给小伙伴们了,只需要轻轻一点,一步到位。
后记
Jenkins和Fastlane的功能真的非常强大!
这里只不过是很简单地组合起来用一下,Jenkins还可以做定时任务、权限管理、配置参数。
Fastlane拥有许多的Action,除了内测分发,还可以传包到TestFlight和AppStore。
你可以在Jenkins上配置灵活的参数来指定构建分支、触发命令;Fastlane的fastfile可以引用git仓库的文件的,所以你也可以分离项目和Fastlane配置文件。
如果你不喜欢fir,也可以用其他的分发平台,可能上传方式有点不同,例如Bugly是提供了Fastlane的自定义Action来做上传,功能会多一点,可以配置名称、描述、密码等。
......