使Cordova在CI / CD环境中构建的效率更高

时间:2019-12-10 10:45:05

标签: cordova continuous-integration

我想加快具有许多功能分支的混合应用程序的构建过程。 我们有docker容器来创建cordova android和ios构建。从头开始构建Cordova应用程序 可能真的很慢,它必须下载各种第三方库,您需要针对Android的gradle依赖项,针对iOS的cocoapods更新等。有时,由于docker-mac io的性能罚款,可能需要30至40分钟才能完成所有本地版本。很多。

基本上,我们应用程序的本机部分实际上是静态的,我们很少添加或更改插件,所以我不明白为什么我应该随时重建一个ipa,apk或任何本机平台 >当我们只更改了一些javascript代码时。

所以我打算稍微优化构建过程,这是我的两个想法,我想听听一些有关这些想法的利弊。

  1. 我可以创建一个单独的“本机应用”版本,该版本可以创建一个ipa和apk,但在www目录中没有任何内容。

    其他构建过程应仅获取这些本机工件,将客户端代码放入www文件夹中,然后为应用程序签名。这样,基于功能的构建分支仅受客户端代码捆绑器速度的限制,甚至对于本机构建甚至不需要很多依赖项(例如,在使用“干净”构建代理的情况下)

  2. 不是构建构建代理的构建目录,而是可以将与cordova相关的代码移动到共享目录,在其中添加平台,每个构建都只链接那里的www文件夹,然后我可以开始cordova prepare

第一个问题:

  • 其他复杂性
  • 如何知道何时触发本地重建(将整个cordova设置存储在单独的repo中?)
  • 辞职适用于每个平台吗?

第二个问题:

  • 锁定/缓存问题(构建branchB时,branchA中的文件留在那里)
  • 如果我不使用网络驱动器进行共享(但我真的不想),则仅帮助同一个代理

我真的没有找到任何可以帮助我的现有方法论或实用程序。

我知道我不能在Mac上进行android构建,我可以将本机部分的构建降低到5分钟或更短时间,但是仍然比0多5分钟。而且这仅适用于一个平台。

1 个答案:

答案 0 :(得分:3)

我对Cordova的构建经验不足,所以我不能专门针对您的需求,但是您列出的选项中#1似乎增加了太多的复杂性,而#2听起来却增加了风险/不确定。我个人都避免。

但是,由于我有一些建议,所以一切都不会丢失。由于我不知道您使用的是哪个运行程序系统(我主要使用GitLab或Drone.io),因此,我只讲一下我以前的用例,并假设您正在使用私有GitLab运行程序之类的东西。

#1添加缓存

这是加快构建速度的最佳/最快方法。

Building a cordova app from scratch can be really slow, it has to download various third party libs, you need gradle dependencies for android, cocoapods update for ios, etc.

正如您所指出的,下载第三方依赖项是跑步者可以做的最慢的事情之一,而且对于复杂的构建(例如android / ios / cordova / etc),这通常会导致每次运行都下载大量数据。在这种情况下,流道缓存非常重要,因此它只需要偶尔一次下载构建资源(例如每周一次与每次构建)。

某些跑步者(如GitLab和Bitbucket)提供了现成的机制,而其他跑步者(Drone)则依赖于插件或手动滚动:

#2使您的构建环境变得短暂

虽然缓存构建工件是一个很好的第一步,但是您可能会发现设置构建环境也很繁琐。您提到在构建过程中运行一个Docker容器,但是随后出现一个问题,即是否要为每次运行构建该容器,或者是否要为每次运行在该容器中安装东西。

特别是对于我的Android CI构建,我发现创建自己的私有容器并将其放入私有注册表中作为流道容器最容易。这使得所有JDK和Android SDK配置只需执行一次,并允许跑步者专注于仅应用程序构建而不是设置。幸运的是,我还让Docker容器在构建过程中执行了初始应用构建,因此我也已经安装了所有gradle软件包。

#3并行构建

我不确定您是否正在使用此功能,但是使用并行构建可以将管道的总运行时间减少一半(尽管这对单个作业没有帮助)。

在GitLab中,这是通过正确设置“阶段”,然后在每个阶段设置多个作业来完成的。对于GitLab示例:

stages:
 - Build

"Build iOS":
  stage: Build
  script:
     - ...

"Build Android":
  stage: Build
  script:
     - ...

或者通过'depends_on'关键字与Drone配合使用:https://discourse.drone.io/t/how-to-setup-parallel-pipeline-steps-1-0/3251

#4 IO改进

Sometimes, also due docker-mac io performance penalties

我假设您是专门指将本地文件夹装入docker容器吗?如果是这样,请不要为构建挂载卷,而应在构建之前将文件复制到Docker容器中,或指示容器在构建之前直接从您的存储库中签出代码。

我主要运行Windows,但也使用WSL和Docker,因此磁盘IO损失对我来说甚至更糟,因此在运行构建之前,我经常选择/选择文件的位置(取决于操作系统是什么)。做建筑)。