如何免费为多个项目存储库配置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_install
和script
在执行中合并,并针对每个script
执行
生成矩阵中的条目。 您设置的环境变量
env:
两者均可访问。
跨虚拟机并行构建
为了加快测试套件的速度,您可以使用以下方法将其分解为几个部分:
Travis CI的构建矩阵功能。
假设您要将单元测试和集成测试分为两个
不同的构建工作。 它们将并行运行并充分利用可用的
为您的帐户建立能力。
这是有关如何在.travis.yml中利用此功能的示例:
环境:
— TEST_SUITE =单位
— TEST_SUITE =集成
在这里,我为每个样品名称使用“ SAMPLE”变量。 这可以帮助我进入每个文件夹,分别设置其包ID,并找出要构建的项目和方案名称。
env:SAMPLE = AdMob
缓存目录(捆绑程序,依赖项)
借助缓存,Travis CI可以在构建之间保留目录。 这是
对于需要从源代码下载和/或编译的依赖项特别有用。
建立阶段
Travis CI尝试在脚本之后但在after_success
或after_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”。