Travis Stages的iOS部署管道

持续集成的过程执行各种活动,例如分析,构建,测试和部署iOS应用。 将每个构建任务分解成各个阶段并独立执行它们是一个好主意。 此过程也称为构建管道或部署管道。 作为iOS开发人员,您可能已经体验到构建iOS应用可能需要很多时间才能进行测试。 管道是处理iOS开发的各个阶段以获得快速反馈的方式。 在花费了数小时的构建和测试阶段之后,我们可能不想因代码样式问题而导致构建失败。 自托管的持续集成服务器(如Jenkins和TeamCity)具有创建构建管道的良好支持,但是基于云的CI服务器(如TravisCI,CircleCI等)也正在推出部署流水线功能。 在这篇文章中,我们将看到如何使用Travis Stages功能设置iOS部署管道。 请注意,我以TravisCI为例,因为我将其用于一些开源项目。 其他可能基于CI的CI服务器也可能具有类似的功能。

iOS部署阶段

在进入TravisCI设置之前,我们将了解部署任何iOS应用的重要阶段是什么。 主要的构建阶段是

  • 分析源代码中的代码样式问题
  • 使用XCTest或其他框架进行测试
  • 构建和存档iOS应用
  • 将iOS应用分发到其他Beta测试服务
  • 将iOS应用上传到iTunes Connect

这些是必须在连续集成服务器上自动化的主要阶段,才能实现自动部署。

特拉维斯舞台

万一TravisCI刚开始使用,它是一个嵌入Github的基于云的持续集成平台,该平台允许为开源以及企业项目运行CI构建。 它具有良好的文档,可帮助您开始进行持续集成。 TravisCI宣布了Travis Stages的新功能,以实现针对开源项目和企业项目的部署管道。 可以通过在.travis.yml文件中添加以下代码示例来启用这些阶段

 工作: 
包括:
-阶段:测试
脚本:./ test 1
-#阶段名称不是必需的,将继续使用`test`
脚本:./ test 2
-阶段:部署
脚本:./ deploy

为了在iOS项目中应用此原理,让我们在GitHub上创建一个开源项目,如下所示(您可以使用任何iOS应用)

  • 在Xcode中创建名为SwiftLint-CI的空白单视图应用, 其中包含单元和UI测试目标
  • 使用CocoaPods添加SwiftLint来检查Swift代码语法。 这可以通过创建Podfile并运行pod install命令来完成。

现在,我们已经为CI配置了一个基本的iOS项目。 现在,我们可以添加支持以在TravisCI上运行构建并启用以下阶段。

  • 使用SwiftLint为Lint Swift代码构建阶段
  • 构建阶段以运行单元测试
  • 构建阶段以运行UI测试

使用阶段创建.travis.yml

TravisCI使用macOS虚拟映像来运行构建,所有映像的列表都可以在此处找到。 我们可以选择最新的xcode9图像来运行演示应用程序的构建。 我们必须运行一个脚本来执行SwiftLint并使用Fastlane Scan运行XCTest。 我们可以这样设置我们的.travis.yml文件:

 语言:Objective-C 
osx_image:xcode9
通知:
电子邮件:false
分支机构:
只要:
-大师
  before_install: 
-gem install fastlane --no-ri --no-rdoc --no-document
 工作: 
包括:
-阶段:Swiflint
脚本:
-./Pods/SwiftLint/swiftlint --reporter junit
  -阶段:XCTest 
脚本:
-快速通道扫描-s SwiftLint-CITests
  -阶段:XCUITest 
脚本:
-快速通道扫描-s SwiftLint-CIUITests

上面的配置文件将分别为SwiftLint,单元测试和UI测试运行3个不同的阶段。 在TravisCI上触发构建后,它将如下所示

这表明我们为每个阶段都建立了构建管道,除非通过了上一个阶段,否则任何阶段都不会运行。

扩展Travis阶段以进行iOS部署

现在,我们已经建立了用于代码分析以及运行单元和UI测试的构建管道。 我们可以进一步利用此管道,将iOS应用程序部署到iTunes Connects。 自动化和分发构建不属于本文的范围,但是您可以在此处阅读我以前的文章,其中介绍了使用Fastlane工具将iOS部署自动化到iTunes connect的自动化。 我们可以延长Travis阶段来部署这样的应用程序:

 工作: 
包括:
-阶段:Swiflint
脚本:
-./Pods/SwiftLint/swiftlint --reporter junit
  -阶段:XCTest 
脚本:
-快速通道扫描-s SwiftLint-CITests
  -阶段:XCUITest 
脚本:
-快速通道扫描-s SwiftLint-CIUITests
  -阶段:构建应用 
#编写脚本以在构建之前在TravisVM中创建钥匙串,导入证书,下载配置文件
脚本:
-快速通道健身房-s SwiftLint-CI -q发布
  -阶段:上传到TestFlight 
脚本:
-fastlane飞行员上传--changelog“新功能”

假设我们在TravisCI虚拟机中设置了所有配置和证书,此配置会将iOS应用程序带到TestFlight。 请注意,您必须使用不同的Fastlane操作来创建钥匙串,将证书导入钥匙串,以允许TravisCI虚拟机对应用程序进行代码签名。 通过这种方式,我们可以将iOS部署阶段分为TravisCI阶段,以获得更好的可见性。

分阶段并行Travis构建

我们仍然可以在阶段内并行处理Travis构建,以加快整体构建的执行速度。 我们可以并行运行单元和UI测试,也可以同时将IPA分发到Fabric和TestFlight等多个平台。 不确定TravisCI是否已记录了并行性,但是在阶段中以并行方式运行构建有一个技巧,我们必须为阶段提供相同的名称以并行运行。 在我们的SwiftLint-CI应用程序中,我们可以将正在运行的单元测试和UI测试并行化,方法是将其称为“ XCTest”阶段,如下所示:

 工作: 
包括:
-阶段:Swiflint
脚本:
-./Pods/SwiftLint/swiftlint --reporter junit
  -阶段:XCTest 
脚本:
-快速通道扫描-s SwiftLint-CITests
  -阶段:XCTest 
脚本:
-快速通道扫描-s SwiftLint-CIUITests

请注意,我们为构建阶段使用了相同的名称,但每个阶段运行不同的脚本。 这将并行运行“ XCTest”阶段。 这是在一个阶段中并行运行Travis构建的技巧。 并行构建将如下所示:

使用Travis舞台的利弊

尽管Travis构建阶段似乎是创建部署管道的绝佳选择,但仍有一些陷阱需要考虑。 这是为iOS部署管道使用Travis构建阶段的一些利弊。

优点

  • 我们可以了解部署管道的每个阶段的构建
  • 如果构建阶段在部署管道中失败,我们可以及早获得反馈
  • 可以在构建阶段应用并行性,因为我们可以在阶段并行运行多个作业。 当前,我们并行运行单元测试和UI测试。
  • 每个阶段分配环境变量
  • 可用于在不同阶段将应用程序部署到Fabric和TestFlight

缺点

  • 仍处于测试版,并且存在一些错误。 在此处检查已知问题
  • 为阶段中的每个构建触发新的VM,因此检查每个任务的存储库很耗时
  • 需要以相同的名称运行阶段以实现并行性,这是脚本执行的重复。
  • 无法在阶段之间共享数据,需要使用不可行的AWS S3存储桶。

源代码和TravisCI构建

  • GitHub源代码

Github存储库SwiftLint-CI中提供了此帖子的示例源代码。

  • TravisCI构建

顺序构建在这里可用,并行化构建在这里

结论

基于云的CI服务器提供了在多个阶段中运行iOS构建的功能,从而为iOS应用创建无缝的部署管道。 我们可以利用这些功能在构建过程中获得更好的反馈和可见性。

像XCBlog的 XCTEQ 发布的帖子一样 您可能还喜欢我们的一些服务,例如访客博客或Mobile DevOps(CI / CD)或测试自动化。 Github 搜索我们的 服务 ,开源项目, 或者在 Twitter Facebook Youtube LinkedIn 上关注我们 下载我们的 XCBlog iOS应用程序以离线阅读博客。

X CTEQ 一家专门从事基于Mobile DevOps,CI / CD,Mobile,AI / ML的测试自动化Checkout XCTEQ产品和服务的公司, 网址 http://www.xcteq.co.uk 或写信给我们info@xcteq.co。英国..