开源改变世界

在慢速机器上更快地构建? #357

推推 grbl 2年前 (2023-02-02) 155次浏览
打开
MitchBradley 打开了这个问题 2018 年 7 月 11 日 · 22条评论
打开

在慢速机器上更快地构建?#357

MitchBradley 打开了这个问题 2018 年 7 月 11 日 · 22条评论

评论

在慢速机器上更快地构建? #357

在 Raspberry Pi 上安装真的很慢而且经常崩溃。存在许多问题,包括“并发”规则的资源耗尽、长 lint 时间和 build-prod-web 的长时间。这太糟糕了——通常需要一天多的时间才能最终成功——除非绝对必要,否则我通常会避免升级。

我想知道是否有某种方法可以加快速度?例如下面的想法:

  • 消除棉绒步骤。原则上,只有在签入新代码时才有必要。在从干净的树构建时执行此操作应该是多余的。
  • 使并发依赖于构建机器(我不确定这会有多困难)
  • 对于每个版本,在 dist/cnc/web 中制作文件的可下载副本,这样它们就不需要在每台机器上重建(它们是独立于平台的吗?)

其他想法?

在慢速机器上更快地构建? #357
贡献者作者

Aargh,在运行 70 分钟后,我今天的构建尝试第四次崩溃了。幸运的是,我打开了一个“htop”窗口,所以我看到了发生了什么——它耗尽了内存和交换空间。webpack.webconfig.production.js 产生了 9 个子进程,它们一起用完了所有系统内存。

在慢速机器上更快地构建? #357
贡献者作者

我在 PC 上构建了 dist/cnc/web 目录并将其复制到 Pi。那奏效了。

在慢速机器上更快地构建? #357

我相信某处有可用的 raspberry pi 映像,这可能有帮助吗?

在慢速机器上更快地构建? #357
贡献者作者

我不想重新映像 SD 卡,因为那样我将不得不重新配置网络设置、重新加载我保留在系统上的所有 GCode 文件、恢复我的脚本以重置附加的 Arduino 等。

理想的预编译工件是一个 apt 包,它只包含运行 CNCjs 所必需的文件——基本上是 dist/ 子目录的内容,没有 node_modules 中 210 MB 的 41,000 多个文件。webpack“编译”过程本质上是将 210 MB 压缩成大约 5 MB 的内容,然后放入 dist/ 。您仍然需要 node_modules 中的一些模块,但显然不多。

我认为,在运行时你只需要 8 个,而不是 node_modules/ 中的 1386 个模块,即 babel-polyfill、deep-keys、ensure-array、eventemitter3、http-proxy、requires-port、serialport 和 socket.io . 我通过将 node_modules/ 移动到不同的名称,启动服务器以查找错误消息,并使用必要的信息逐步重新填充 node_modules/ 来获得该列表。在我恢复了这 8 个模块之后,cncjs 运行得很好。在某些情况下,稍后可能会按需加载其他一些,但我似乎只用了这 8 个就拥有了全部功能,总共 10 MB,其中 9 个是 babel-polyfill 。也许您真的需要在压缩 index.js 的“module.exports = require()”行中列出的每个模块;如果是这样,那就是65个模块,远少于1386个。

该问题还有其他解决方案。本质问题是 cncjs 设置在很大程度上针对开发人员角色进行了调整,包括仅在编译和测试期间需要的大量内容。

在慢速机器上更快地构建? #357
贾斯汀克利夫特 评论了 2018 年 7 月 24 日  

嗯,知道是否有办法以某种方式使构建过程稍微去并行化吗?听起来它可能会因为内存和交换耗尽而偶尔出现彻底的 OOM 故障,从而使交换(因此超长时间)变得混乱。如果有办法让它主要是串行的……那可能会更快。讽刺地。?

在慢速机器上更快地构建? #357
贡献者作者

降低并行度肯定有帮助——打破“并发”规则是朝着正确方向迈出的一步。可能有一些方法可以降低多线程的程度,我似乎记得去年在做 cncjs 时曾在某个时候发现过它。节点生态系统非常广泛,除非经常使用它,否则很容易迷路和忘记东西。

在慢速机器上更快地构建? #357
合作者

最近我将 webpack 从 v3 升级到 v4,构建时间应该比以前的版本快一点。

要消除测试和 linting 步骤,您可以单独运行npm run build-prod-app或以仅更新或文件夹。这将比 running 快得多,并且不会触发并发构建。npm run build-prod-webdist/cnc/appdist/cnc/webnpm run prepare

"build-prod-app": "cross-env NODE_ENV=production webpack-cli --config webpack.appconfig.production.js && npm run build-i18n-app",
"build-prod-web": "cross-env NODE_ENV=production webpack-cli --config webpack.webconfig.production.js && npm run build-i18n-web",

请注意,以下 webpack 配置文件中有一个 eslint 加载程序插件:

我可以添加一个 env 变量ESLINT_DISABLE=true,这样你就可以使用这个 env 变量绕过 webpack 的 linting 过程。

在慢速机器上更快地构建? #357
合作者
奇顿 评论了 2018 年 7 月 29 日  

对于每个版本,在 dist/cnc/web 中制作文件的可下载副本,这样它们就不需要在每台机器上重建(它们是独立于平台的吗?)

文件夹中的所有文件dist/cnc/web都是平台无关的,如果您从不更改src/web/. 您可以使用 NPM 或 Electron 应用程序从安装了 CNCjs 的机器上复制这些文件。

您认为有必要提供一个仅包含dist/cnc/web发布页面中的文件的 zip 文件吗?

在慢速机器上更快地构建? #357
贡献者
约翰博尔斯 评论了 2019 年 5 月 6 日  

拉出最新的origin/masterf634786 ) 后,我无法再npm run build-prod-app在我的 Pi3B+ 上运行(我之前使用的是技巧@MitchBradley此处提到仅在 pi 上构建服务器端组件)。节点会消耗 ~800mb 内存,然后最终在大约 10 分钟后将被杀死Out of memory

因此,我改为使用binfmt_misc qemu arm 编译魔法设置在我的笔记本电脑上从 Docker 构建 cncjs。这在 macOS Docker 中开箱即用,但需要针对 Linux 进行一些配置。我不确定 Windows。我还必须在 Docker 设置中将 Docker 容器的可用内存从 2gb 增加到 4gb。

cncjsrepo 的根目录开始,我在我的 macOS 笔记本电脑上运行了以下命令,将所有 cncjs 构建为 arm7。

npm run clean
docker run -it -v $PWD:/cncjs -w /cncjs arm32v7/node:8.15.1 npm install --unsafe-perm

然后我将和目录与 Pirsync同步(假设我的 pi 在 v1pi.local 可用,并且已经在 pi 上克隆)distnode_modulescncjs/home/pi/cncjs

rsync -av --delete --include='dist/***' --include='node_modules/***' --exclude='*' ./ pi@v1pi.local:/home/pi/cncjs/

这仍然需要 28m37.662s(根据time),但它至少起作用了!有没有办法在不测试应用程序的情况下安装所有 node_module 依赖项?似乎也npm install运行测试,这花了很长时间。

在慢速机器上更快地构建? #357
合作者

@johnboiles
自 CNCjs 1.10(提交8768197)起, npm run build-prod-appnpm run build-prod-web分别重命名为npm run build-prod-servernpm run build-prod-app

您必须如下更改构建过程:

  • 在 Pi 上:

    • npm 运行干净
    • npm 运行 prebuild-prod
    • npm 运行构建产品服务器
  • 在 PC 或 Mac 上:

    • npm 安装
    • 将 dist/cncjs/app/* 复制到 Pi(位于 /dist/cncjs/app)
在慢速机器上更快地构建? #357
贡献者作者

我编辑了上面引用的评论以反映新名称。@johnboiles,如果您对 Wiki 有编辑权限,也许您会考虑在 Pi 部分制作一个页面来描述该过程。如果你没有许可,我希望@cheton考虑到您最近的贡献有多大帮助,会将您添加到团队中。(现在回到工作流争吵!)

在慢速机器上更快地构建? #357
贡献者作者

关于上面报告中的“我不确定 Windows”——它确实适用于 Windows。我已经在 Windows、原生、Docker/ubuntu 和 WSL/debian 上尝试了 3 种不同的模式。在所有情况下,应用程序的 Web 部分都可以复制到 Pi。

在慢速机器上更快地构建? #357
贡献者

整洁的。是的,看起来Windows Docker 支持开箱即用地运行 ARM 容器。

在所有情况下,应用程序的 Web 部分都可以复制到 Pi。

需要明确的是,如果您使用我的命令,您将在 Docker 容器中同时构建“Web 部件”和“服务器部件”,然后将它们发送到 Pi。

在慢速机器上更快地构建? #357
贡献者作者

啊哈!事实证明,您真正需要在 arm 上构建的唯一东西是串行端口模块。服务器和应用程序都是独立于平台的,除了那个模块。

我刚刚从 PC Linux 构建(实际上是 WSL)中提取(压缩)node_modules/、bin/ 和 dist/,将它们 scp 到 Pi,解压缩,并替换了子目录 node_modules/@serialport与一个建立在 Pi 上的。有效!

在 Pi 上进行 scp 和解压并不是很快,但它比使用 npm 填充 node_modules 快得多。我本可以使用 rsync 或将 tar / untar 合并到 scp 管道中更快地完成它,从而消除一些 Pi 磁盘写入,但对于第一次尝试,我想逐步完成。

这开辟了一个几乎与平台无关的 tarball 的可能性,您可以使用更短的序列为机器进行个性化设置。

在慢速机器上更快地构建? #357
贡献者作者

可以只构建 serialport ARM 二进制文件

npm build node_modules/@serialport/bindings

在 Pi Zero 上只需不到 2 分钟。所以完整的过程是这样的:

  • 在您选择的快速机器上本地构建 cncjs
  • 使用您最喜欢的带宽减少技巧将 bin/、node_modules/ 和 dist/ 复制到 Pi
  • 在 Pi 上运行“npm build node_modules/@serialport/bindings”
在慢速机器上更快地构建? #357
贡献者
约翰博尔斯 评论了 2019 年 5 月 7 日  

好的调查@MitchBradley!作为您流程的变体,您可能也可以使用我的 Docker 技巧在本地构建串行端口,然后发送整个包。我今晚试试这个:

在快速机器上(替换pi@v1pi.local:/home/pi/cncjs/为您的用户名、主机名和 cncjs 路径)

npm run clean
npm install
docker run -it -v $PWD:/cncjs -w /cncjs arm32v7/node:8.15.1 npm build node_modules/@serialport/bindings
rsync -av --delete --include='dist/***' --include='node_modules/***' --exclude='*' ./ pi@v1pi.local:/home/pi/cncjs/

在 pi 上,只是sudo systemctl restart cncjs或任何您的命令是重新启动服务器。

编辑:试过了,成功了!在我的 2.8GHz i7 Mac 上,这 4 个命令只用了 3 分钟 30 秒。

在慢速机器上更快地构建? #357
贡献者作者

我的运气就没那么好。首先,我使用的是 Pi Zero,它是 arm32v6,而不是 v7。表面上这是一个合适的图像 – armv6/node:current-alpine(但我必须记住如何登录到 dockerhub 才能获取它)。在我使用docker run --rm --privileged multiarch/qemu-user-static:register --reset. 那时我走得更远,但现在我被困在 `standard_init_linux.go:190: exec user process caused “no such file or directory” 错误,无论我尝试运行什么命令。互联网似乎认为它与脚本中的 CR-LF 和 LF 差异有关,但我无法弄清楚有问题的脚本可能在哪里。嗯,我想知道它是否在 qemu 设置中?

无论如何,考虑到以下因素,在主机上构建串口几乎没有速度优势:

  • 直接在树莓派上编译只需2分钟
  • 假设串行端口版本很少更改,您不必每次都这样做;只需复制一个二进制文件
  • 在 Windows 上启动 docker 大约需要那么长时间——而 WSL 启动非常快,而且我几乎一直保持它运行。我发现 WSL 正在成为我的首选 Linux 环境。最近,在 64 位可执行交叉编译器不可用的极少数情况下,我一直只使用 Docker 来编译 32 位嵌入式固件。
在慢速机器上更快地构建? #357
贡献者

我花了不到 30 秒的时间在 docker 中编译串口。但那是因为我一直在运行 Docker。如果你必须启动 docker,我完全理解这会耗尽你节省下来的时间。

有趣的是,Docker multiarch 在 Windows 上并不是开箱即用的。我认为 Mac 和 Windows 上的 Docker VM 已经设置好了。

在慢速机器上更快地构建? #357
贡献者作者

事实证明,您要么需要一个已经包含 /usr/bin/qemu-arm-static 的映像,要么必须从命令行绑定挂载它。那个 hypriot/rpi-node 图像里面有它,而 arm32v*/node 图像没有。我不确定多架构设置步骤是否必要。也许它已经设置好了,而我深陷鼠洞,以至于我没有弄清楚。无论如何,我的 Docker Fu 很弱,而且我很少使用它,以至于它在使用之间往往会消失。

我想在主机上编译串口的一个好处是你不必在 Pi 上安装 npm。也许你可以只使用 node 而不是 NPM。当然,串口构建的事情归结为 C++ 编译,所以您可以在没有 npm 的情况下手动完成。

这个生态系统需要大量的编译器争论。我以为我厌倦了摆弄 C 编译器设置,但这是一个完全不同的膨胀程度。

在慢速机器上更快地构建? #357

是的。js/node/npm 是“有趣的”。不是很好。?

在慢速机器上更快地构建? #357
贡献者作者
MitchBradley commented 2019 年 8 月 20 日  

The following attachment contains the files necessary to run cncjs on a Raspberry Pi, except for the serialport module. It was created by running the docker image under Linux and then executing this command:

tar caf cncjs.tar.gz bin/cncjs node_modules/{@babel,@types,ansi-styles,chalk,color-convert,color-name,core-js,escape-string-regexp,has-f
lag,regenerator-runtime,supports-color} dist/cncjs/{app,main.js,node_modules,package-lock.json,package.json,server,server-cli.js}

cncjs-1.9.20.tar.gz

Copy it to a Pi and then:

mkdir ~/cncjs-1.9.20 && cd ~/cncjs-1.9.20
tar xaf ../cncjs.tar.gz
npm build  dist/cncjs/node_modules/@serialport/bindings

The result of that will be a functional cncjs installation in the directory ~/cncjs-1.9.20 . You can run it with

~/cncjs-1.9.20/bin/cncjs
You will first need to stop a previously-running instance of cncjs is there is one. That will probably involve some pm2 commands if you followed the Raspberry Pi setup guide previously.

喜欢 (0)