2019-07-19-如何使用fastlane实现iOS的(CI)持续集成(CD)持续交付(CD)持续部署

把开发工作流程分为几个阶段:编码 -> 构建 -> 集成 -> 测试 -> 交付 -> 部署

持续集成(Continuous Integration)」、「持续交付(Continuous Delivery)」和「持续部署(Continuous Deployment)」

  • 持续集成(Continuous Integration)
    持续集成是指软件个人研发的部分向软件整体部分交付,频繁进行集成以便更快地发现其中的错误。
    CI 需要具备这些:全面的自动化测试。
    “快速失败”,在对产品没有风险的情况下进行测试,并快速响应;最大限度地减少风险,降低修复错误代码的成本;将重复性的手工流程自动化,让工程师更加专注于代码;保持频繁部署,快速生成可部署的软件;提高项目的能见度,方便团队成员了解项目的进度和成熟度;增强开发人员对软件产品的信心,帮助建立更好的工程师文化。
  • 持续交付(Continuous Delivery)
    持续交付在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的「类生产环境」(production-like environments)中。持续交付优先于整个产品生命周期的软件部署,建立在高水平自动化持续集成之上。 快速发布。能够应对业务需求,并更快地实现软件价值。编码->测试->上线->交付的频繁迭代周期缩短,同时获得迅速反馈;高质量的软件发布标准。整个交付过程标准化、可重复、可靠,整个交付过程进度可视化,方便团队人员了解项目成熟度;更先进的团队协作方式。从需求分析、产品的用户体验到交互 设计、开发、测试、运维等角色密切协作,相比于传统的瀑布式软件团队,更少浪费。
    持续交付和持续集成的优点非常相似:
  • 持续部署(Continuous Deployment)
    持续部署是指当交付的代码通过评审之后,自动部署到生产环境中。持续部署是持续交付的最高阶段。这意味着,所有通过了一系列的自动化测试的改动都将自动部署到生产环境。它也可以被称为“Continuous Release”。
    持续部署主要好处是,可以相对独立地部署新的功能,并能快速地收集真实用户的反馈。“You build it, you run it”,这是 Amazon 一年可以完成 5000 万次部署,平均每个工程师每天部署超过 50 次的核心秘籍。
  • 综上:「持续集成(Continuous Integration)」、「持续交付(Continuous Delivery)」和「持续部署(Continuous Deployment)」提供了一个优秀的 DevOps 环境,对于整个团队来说,好处与挑战并行。无论如何,频繁部署、快速交付以及开发测试流程自动化都将成为未来软件工程的重要组成部分。

使用 fastlane 实现 iOS 的 CI 和 CD

fastlane 简介

fastlane是一个通过简单命令来完成诸如截图、获取证书、编译、导出安装包、提交iTunesConnect等一系列操作的工具,它同时支持iOS和Android。
你能够通过简单的方式配置流程进行的顺序,并通过非常简单的命令执行其中的一个流程。当然它的简单并不代表功能也简陋,有开源社区的支持,更新迅速且有很多功能能够满足你的需求。

fastlane 环境配置

fastlane使用的是ruby环境且对ruby有版本要求(官网要求是ruby2.0以上),所以如果需要的话更新一波ruby,然后通过gem安装fastlane。
(未确认更新ruby是否需要rvm:更新ruby 使用的是RVM工具,在命令行进行如下操作,安装时可能出现进度不动,多半可能是因为被墙了。)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# (未安装Xcode时执行) Install the latest Xcode command line tools:
# xcode-select --install
# Using RubyGems
sudo gem install fastlane -NV
# (未安装brew时执行) 安装 Homebrew
# /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
# Alternatively using Homebrew
brew cask install fastlane
# 如果提示没有detect到 .bash_profile 文件,就手动建立,并根据提示添加
# export PATH="$HOME/.fastlane/bin:$PATH" 然后 source .bash_profile 文件
更新fastlane执行
fastlane update-fastlane
# Navigate your terminal to your project's directory and run
fastlane init
提示有4种选项
1Automate screenshots
2Automate beta distribution to TestFlight
3Automate App Store distribution
4Manual setup - manually setup your project to automate your tasks
然后输入数字2或4 "Manual setup - manually setup your project to automate your tasks"
提示
"An error occurred while installing unf_ext (0.0.7.6), and Bundler cannot continue."
"Make sure that `gem install unf_ext -v '0.0.7.6'` succeeds before bundling"
那就跟着提示,执行
sudo gem install unf_ext -v '0.0.7.6' (需要sudo权限)
再执行了一次
fastlane init
提示fastlane init failed. Unable to locate Xcode. Please make sure to have Xcode installed on your machine
执行
xcode-select --install
已安装
fastlane init
报错可能在Xcode中没有设置“Command Line Tools”:打开Xcode偏好设置,选择"Location"选项卡,选择相应的“Command Line Tools”即可。
再执行了一次
fastlane init
再提示有4种选项
接着提示操作来完成初始化
(详细操作见下面举例分类)
完成后,可以试下
fastlane tests 测试一下根据提示再操作

try your new fastlane setup ,just enter
#fastlane custom_lane

enable fastlane to handle automatic version incrementing Automating Version and Build Numbers Using agvtool
https://developer.apple.com/library/archive/qa/qa1827/_index.html

fastlane how to setup automatic build increments - fastlane docs
https://docs.fastlane.tools/getting-started/ios/beta-deployment/#best-practices

安装完成后,会提示查如下文档

初始化完成后可以看到
项目会多出来一个 Gemfile 文件,(如果没有此文件,需要手动创建此文件),内有内容:

1
2
source "https://rubygems.org"
gem "fastlane"

项目目录里多出了一个 fastlane 文件夹,内有2-4个比较重要的文件,其中有 Appfile 和 Fastfile 等。

fastlane 使用

Automatic iOS Beta deployment 2Automate beta distribution to TestFlight

执行 fastlane init 后,按2,进入此模式2Automate beta distribution to TestFlight
根据提示输入账号密码及二次验证,等各种必须的资料信息
然后查看 https://docs.fastlane.tools/getting-started/ios/beta-deployment/ 文档中的代码片断
修改Fastfile文件内容

1
2
3
4
5
6
7
8
9
10
default_plantform(:ios)
platform :ios do
desc "Description of what the lane does"
lane :beta do
#sync_code_signing(type: "appstore") #see code signing guide for more information #可能会要从git或svn同步代码,不需要自动同步代码的可以注释掉此行
build_app(scheme: "XXXX.target.name")
upload_to_testflight
#slack(message: "Successfully distributed a new beta build")
end
end

然后命令行执行

1
fastlane ios beta

执行出错,提示
Usually it’s caused by the Skip Install option in Xcode, set it to NO
For more information visit https://developer.apple.com/library/ios/technotes/tn2215/_index.html
那就跟着提示改呗,确认下Xcode的Target中的Build Settings里,注意选择All显示全部设置后,查找Skip Install选项是不是都为NO,如果是NO了,那就手动再选择下NO,重选下NO
然后再执行命令 fastlane ios beta
自动执行过程中可能会要手动输入二次验证码,app-spec(application-specific)密码,等等
会有提示
Password (app-spec(application-specific for xxxx开发者账号)
或者
your account has 2 step verification enabled
please go to https://appleid.apple.com/account/manage
and generate an application specific password for
the iTunes Transporter, which is used to upload builds
to set the application specific password on a CI machine using
an environment variable, you can set the
FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD variable
Please provide your Apple Developer Program account credentials
The login information you enter will be stored in your macOS Keychain
解决
输入已生成的app-spec(application-specific)

登录网站https://appleid.apple.com/account/manage
在页面里有生成app专用密码,生成并将此密码输入进当前命令行中
接着再输入

1
fastlane ios beta

命令后接下来,会提示
可能会提示
ERROR ITEM-90189 Redundant Binary Upload. …… Make sure you increment the build string before you upload your app to App Store Connect. ……
这是提示版本号问题,注意Xcode里版本号,不能一样要逐增加,是否建立了版本在appStoreConnect上,等版本号原因,改即可
可能会提示
This might take a few minutes. Please dont interrupt the script.
那就继续等呗
(可能会发现,默认版本号version没变,默认build变了自动加了个1)
等到成功的信息如下
Successfully finished processing the build 1.x - xxxx for IOS
Successfully distributed build to Internal testers
fastlane.tools just saved you 8 minutes!
这时如果有提示Please update using fastlane update_fastlane, 估计是提示升级的,那就照做呗,为下次操作做好准备

1
fastlane update_fastlane

完成!挺顺利的就完成了!挺好的!

Automatic iOS App Store deployment 3Automate App Store distribution

过程可参考2Automate beta distribution to TestFlight的
或参考在此https://docs.fastlane.tools/getting-started/ios/appstore-deployment
只是其中的fastlane文件脚本,需要各别修改,demo如下

1
2
3
4
5
6
7
lane :release do
capture_screenshots # generate new screenshots for the App Store
sync_code_signing(type: "appstore") # see code signing guide for more information
build_app(scheme: "XXXX.target.name")
upload_to_app_store # upload your app to App Store Connect
#slack(message: "Successfully uploaded a new App Store build")
end

Generate localized iOS screenshots for the App Store 1Automate screenshots

过程可参考2Automate beta distribution to TestFlight的
或参考在此https://docs.fastlane.tools/getting-started/ios/screenshots/
只是其中的fastlane文件脚本,需要各别修改,demo如下

1
2
3
4
lane :screenshots do
capture_screenshots
upload_to_app_store
end

其它方式的 CI/CD

使用 GitHub 实现简单的 CI/CD
https://www.cnblogs.com/selimsong/p/9398738.html
使用 gitlab ci/cd + fastlane 在 iOS 上实施 ci/cd
https://www.jianshu.com/p/96449c6bd7d9

使用的一些感受

2Automate beta distribution to TestFlight
本想在相同时间内通过自动化精简一些手动操作
自测结果发现,fastlane运行过程中不知何原因(Apple服务器边?或本地网络?)引起出错外,一般都会节约时间
考虑精简繁锁操作的话,可以试试fastlane
fastlane出错的话,还是要后续手动操作(概率发生)

参考链:

https://docs.fastlane.tools/getting-started/ios/beta-deployment/
https://docs.fastlane.tools/getting-started/ios/appstore-deployment/#building-your-app
https://docs.fastlane.tools/getting-started/ios/screenshots/
https://www.jianshu.com/p/04b83b335d53
https://www.cnblogs.com/lulushen/p/8268330.html
https://www.cnblogs.com/pegasus923/p/8674196.html
https://www.jianshu.com/p/c6c7db6f7c44
https://juejin.im/post/5a7d51986fb9a063435ece35
https://docs.fastlane.tools/getting-started/ios/setup/
https://brew.sh/index_zh-cn
https://www.jianshu.com/p/96449c6bd7d9
https://www.cnblogs.com/selimsong/p/9398738.html