gpt4 book ai didi

cordova - 使 Cordova 在 CI/CD 环境中构建更高效

转载 作者:行者123 更新时间:2023-12-05 03:56:34 24 4
gpt4 key购买 nike

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

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

所以我计划稍微优化构建过程,这是我的两个想法,我想听听一些关于这些的评论、优点或缺点。

  1. 我可以创建一个单独的“ native 应用程序”构建,它可以创建一个 ipa 和 apk,但 www 目录中没有任何内容。

    其他构建过程应该只抓取这些原生工件,将客户端代码放入 www 文件夹并退出应用程序。这样,基于功能分支的构建仅受限于我们的客户端代码打包器的速度,甚至不需要大量的本地构建依赖项(例如,在“干净”构建代理的情况下)

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

第一个问题:

  • 额外的复杂性
  • 如何知道何时触发 native 重建(将整个 cordova 设置存储在单独的 repo 中?)
  • resign 是否适用于所有平台?

第二个问题:

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

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

我知道我可以不在 mac 上构建 android,我可以将原生部分的构建时间缩短到 5 分钟或更短,但这仍然比 0 多 5 分钟。而且这仅适用于一个平台。

这是一个示例,我所说的拥有单独的 native 应用程序和客户端代码:

创建 Cordova 应用

cordova platform add android
cordova plugin add x.y.z
cordova build android
#export platforms/android/app/build/outputs/apk/debug/app-debug.apk as an artifact

将客户端代码与原生应用捆绑

#grab app-debug.apk artifact from a previous native build(which is rarely run)
a
unzip app-debug.apk originalContent
webpack
cp app-entrypoint.js originalContent/assets/
pushd originalContent
zip -r ../app-modified.apk ./
popd
zipalign -c 4 app-modified.apk
apksigner sign --ks keystore --ks-key-alias=alias app-modified.apk
#export app-modified.apk as an artifact

最佳答案

我在 Cordova 构建方面没有太多经验,所以我无法具体说明您的需求,但是您列出的选项 #1 似乎增加了太多的复杂性,#2 听起来增加了风险/不确定。我个人会避免两者。

尽管如此,我还是有一些建议。由于我不知道您使用的是哪个运行器系统(我主要使用 GitLab 或 Drone.io),我将仅谈谈我之前的用例并假设您使用的是私有(private) GitLab Runner 之类的东西。

#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.

正如您所指出的,下载第 3 方依赖项是运行程序可以做的最慢的事情之一,并且通常对于复杂的构建(例如 android/ios/cordova/etc),这会导致每次运行都下载大量数据。在这种情况下,运行器缓存变得至关重要,因此它只需要每隔一段时间下载一次构建 Assets (例如,每周一次与每次构建)。

一些运行器(如 GitLab 和 Bitbucket)提供这种开箱即用的机制,而其他运行器(Drone)则依赖于插件或手动滚动:

#2 让你的构建环境变得短暂

虽然缓存构建工件是极好的第一步,但您可能会发现设置构建环境也很乏味。您提到在构建过程中运行一个 docker 容器,但是如果您在每次运行时都构建该容器,或者您是否在每次运行时都在该容器内安装东西,那么就会出现一个问题。

特别是对于我的 Android CI 构建,我发现最简单的方法是创建我自己的私有(private)容器,并将其放入私有(private)注册表中以用作运行器容器。这允许所有 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 容器中,或者指示容器在构建之前直接从您的存储库中 check out 代码。

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

关于cordova - 使 Cordova 在 CI/CD 环境中构建更高效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59265430/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com