如何免费为多个项目存储库配置TravisCI

Travis CI是针对Github存储库的出色托管连续集成服务。 特别适用于快速测试。 当我将Trabase CI与Firebase iOS快速入门挂钩时,我不得不实施一些技巧。

因为我们,

  • 1个回购中有多个项目,
  • 使用CocoaPods 1.0(默认值为0.5),
  • 在测试中将Google plist文件包含到每个项目中,
  • 更新每个测试项目的info.plist,
  • 跨虚拟机并行构建,
  • 缓存捆绑程序和依赖项(荚)。

构建生命周期

Travis CI的构建包括两个步骤:

  • install :安装所需的任何依赖项
  • script :运行构建脚本

您可以在安装步骤( before_install )之前,脚本步骤之前( before_script )或之后( after_script )运行自定义命令。

before_install步骤中,您可以安装项目所需的其他依赖项,例如Ubuntu软件包或自定义服务。 所以我在这里

  • 安装CocoaPods 1.0(默认为0.5)
  • 进入每个示例文件夹并安装Pod
  • 复制到模拟的Google plist文件中
  • 使用sed更新Google plist和info.plist
  • 将Google plist文件添加到每个目标中。 (使用ruby和xcodeproj)
  -gem卸载cocoapods -a 
— gem install cocoapods -v'1.1.1'
— gem install xcpretty
— cd $ SAMPLE
— pod安装— repo-update
— cp ../mock-GoogleService-Info.plist ./GoogleService-Info.plist
— sed -i'''/BUNDLE_ID</{n;s/id/com.google.firebase.quickstart.'$SAMPLE'Example/;}'GoogleService-Info.plist
— sed -i'''s / YOUR_REVERSED_CLIENT_ID / com.googleusercontent.apps.123456789000-hjugbg6ud799v4c49dim8ce2usclthar /'“ $ SAMPLE”示例/Info.plist
— gem install xcodeproj
—红宝石../info_script.rb $ SAMPLE
-cd-

然后在script ,我运行xcodebuild

before_installscript在执行中合并,并针对每个script执行
生成矩阵中的条目。 您设置的环境变量
env:两者均可访问。

跨虚拟机并行构建

为了加快测试套件的速度,您可以使用以下方法将其分解为几个部分:
Travis CI的构建矩阵功能。

假设您要将单元测试和集成测试分为两个
不同的构建工作。 它们将并行运行并充分利用可用的
为您的帐户建立能力。

这是有关如何在.travis.yml中利用此功能的示例:

 环境: 
— TEST_SUITE =单位
— TEST_SUITE =集成

在这里,我为每个样品名称使用“ SAMPLE”变量。 这可以帮助我进入每个文件夹,分别设置其包ID,并找出要构建的项目和方案名称。

  env:SAMPLE = AdMob 

缓存目录(捆绑程序,依赖项)

借助缓存,Travis CI可以在构建之间保留目录。 这是
对于需要从源代码下载和/或编译的依赖项特别有用。

建立阶段

Travis CI尝试在脚本之后但在after_successafter_failure运行之前上载缓存。 请注意,上传缓存失败不会将作业标记为失败。

邦德勒

在Ruby和Objective-C项目上,通过Bundler安装依赖项会占构建持续时间的很大一部分。 在构建之间缓存包可大大减少构建运行的时间。

下面描述了用于获取和存储缓存的逻辑。

启用Bundler缓存

对于包含以下内容的Ruby项目,将自动启用Bundler缓存:
Gemfile.lock。 (尚未自动启用捆绑程序缓存)您可以在.travis.yml中显式启用捆绑程序缓存:

 语言:红宝石 
缓存:捆绑器

每当您更新软件包时,Travis CI也会更新缓存。

可可豆

在Objective-C项目中,通过CocoaPods安装依赖项会占用您构建的很大一部分。 在生成之间缓存已编译的Pod有助于减少此时间。

如果要同时启用Bundler缓存和CocoaPods缓存,则可以同时列出它们:

 语言:Objective-C 
快取:
-捆扎机
-椰子

确定Podfile路径

默认情况下,Travis CI会假设您的Podfile位于目录的根目录中。
资料库。 如果不是这种情况,则可以指定Podfile的位置
像这样:

 语言:Objective-C 
podfile:路径/到/ Podfile

为了能够缓存豆荚:
–我必须为每个样本指定podfile。 这就是为什么我必须在build-matrix中指定它。
–我尝试使用podfile: $SAMPLE/Podfile但它不会
环境变量,因此我必须在build-matrix中明确定义它。
–我创建了第一个样本(Admob),而不仅仅是使用env
默认并使用以下matrix: include:将所有条目添加到构建matrix: include:

 快取: 
-捆扎机
-椰子
  podfile:admob / Podfile 
env:SAMPLE = AdMob
 矩阵: 
包括:
-podfile:分析/ Podfile
env:SAMPLE = Analytics
-podfile:身份验证/ Podfile
env:SAMPLE =身份验证

结果:

  • 我设置了正确的bundle-id并为每个样本运行pod。
  • 我为每个样品缓存了正确的捆扎机和豆荚。
  • 所有这些测试都在travis时间限制内并行,快速运行。
  • 使用缓存和构建矩阵,我的测试在10分钟内完成,而不是以前的1小时40分钟。

PS:最近,我遇到了一个问题,我的测试失败并出现错误65,原因是模拟器未及时准备就绪。 所以我写了一个脚本来重试它们,它就像魔术一样工作!

 设置-o pipefail && xcodebuild \ 
-workspace $ {SAMPLE} / $ {SAMPLE} Example.xcworkspace \
-scheme $ {SAMPLE}示例\
-sdk iphonesimulator \
-destination'platform = iOS Simulator,name = iPhone 7'\
建立
测试
ONLY_ACTIVE_ARCH =是\
CODE_SIGNING_REQUIRED =否\
| xcpretty

结果= $?
如果[$ RESULT == 65]; 然后
回声“ xcodebuild以65退出,正在重试”
设置-o pipefail && xcodebuild \
...
...
 其他 
退出$ RESULT
科幻

进一步阅读:“如何在Docker上本地运行TravisCI”。