vlambda博客
学习文章列表

Kibana 7.6.3 源码编译 + 构建踩坑

最近工作上接到个需求,需要对 Kibana 做简单的二次开发,而我也是第一次接触 Kibana,于是记录一下踩过的坑。


环境信息

  • MacOS v10.13.6 + MacBook Pro 15寸 2018款
  • Kibana 7.6.3 + Elastic Search 7.6.1
  • node 10.19.0

注:理论上应该保证 Kibana 和 Elastic 版本完全一致的…… 但毕竟只给了个 warning,而到目前为止没遇到问题

重要提示

1. 请务必保证 kibana 的版本与 elastic 的版本一致。

Kibana 7.6.3 源码编译 + 构建踩坑

2. 最好不要使用 root,否则安装依赖的时候会有问题

Kibana 7.6.3 源码编译 + 构建踩坑

Step1:准备操作

  • 下载 Kibana 7.6.3 源码
  • 使用 nvm 切换至对应 node.js 版本
Kibana 7.6.3 源码编译 + 构建踩坑
  • 安装 kbn:yarn add kbn ---g
  • 确保 git master 上有 commit 记录,否则:
Kibana 7.6.3 源码编译 + 构建踩坑

Step2:编译阶段

yarn kbn bootstrap 

在此特别感谢这篇文章kibana7.6.2源码开发编译[1]给与的帮助,以下报错信息的 QA 几乎都参考了此文:

iedriver 问题

Kibana 7.6.3 源码编译 + 构建踩坑

原因:网络问题

解决方案:package.json 中删除 iedriver 的依赖。iedriver 主要是用来给 Selenium 作自动化测试用。

chromedriver 问题

原因:网络问题

解决方案:使用 TB 源

yarn config set "chromedriver_cdnurl" "https://npm.taobao.org/mirrors/chromedriver"

puppeteer 问题

Failed to download Chromium r662092!  Set "PUPPETEER_SKIP_CHROMIUM_DOWNLOAD" env variabled to skip download.

Kibana 7.6.3 源码编译 + 构建踩坑

原因:网络问题

解决方案 1:设置环境变量来阻止下载最新版本的 Chromium

yarn config set PUPPETEER_SKIP_CHROMIUM_DOWNLOAD 1
yarn config set puppeteer_download_host=https://npm.taobao.org/mirrors

geckodriver 问题

原因:网络问题

解决方案:使用 TB 源

yarn config set registry https://registry.npm.taobao.org/

最后,yarn kbn bootstrap 成功~ (不出意外的话)

Kibana 7.6.3 源码编译 + 构建踩坑

Step3:构建阶段

yarn build --skip-os-packages  ✅
yarn build ❎

业务代码开发完后,准备打包构建,这部分遇到的坑的解决方法都是看官方文档 Building a Kibana distributable[2] + 看运气。

下载 node.js 包超时

Kibana 7.6.3 源码编译 + 构建踩坑
// src/dev/build/tasks/nodejs/node_download_info.js
const url = `https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/dist/v${version}/${downloadName}`;

// src/dev/build/tasks/nodejs/node_shasums.ts
const url = `https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/dist/v${nodeVersion}/SHASUMS256.txt`;

解决方案:改源码中的下载站点为 nodejs.org

// src/dev/build/tasks/nodejs/node_download_info.js
const url = `https://nodejs.org/dist/v${version}/${downloadName}`;

// src/dev/build/tasks/nodejs/node_shasums.ts
const url = `https://nodejs.org/dist/v${nodeVersion}/SHASUMS256.txt`;

Webpack 打包内存溢出

根据网上相关文章[3] 的说法,这个问题是由于 node 消耗的内存超过了预设值(64位系统:1.4 GB,32位系统:0.7 GB)。

Kibana 7.6.3 源码编译 + 构建踩坑

可以通过在 build 命令中加入 --max-old-space-size=4096 参数来调整 node 最大允许使用内存

// package.json
"build""node --max-old-space-size=4096 scripts/build",

或者 node v8.0 以上可以通过以下命令调整全局设置

export NODE_OPTIONS=--max_old_space_size=4096

如图报错,deb、OS 相关报错

Kibana 7.6.3 源码编译 + 构建踩坑

原因:当前操作系统非 Linux,并且执行的命令没有带上 --skip-os-packages 参数

Packages are built using fpm, dpkg, and rpm. Package building has only been tested on Linux and is not supported on any other platform.

解决方案:老老实实看官方文档别偷懒

yarn build --skip-os-packages
Kibana 7.6.3 源码编译 + 构建踩坑

相关参数说明:

Kibana 7.6.3 源码编译 + 构建踩坑

成功,但……

Kibana 7.6.3 源码编译 + 构建踩坑

总共花了 2330 秒,将近 40 分钟,四舍五入就是一小时…… 时间有点久

构建优化

省去下载 nodejs 步骤

默认情况下,每次 build 都会先清空之前下载好的 nodejs 库,本着能省就省的态度,可以略过这环节

Kibana 7.6.3 源码编译 + 构建踩坑

再配合 --skip-node-download 的构建参数,略过下载 nodejs 环节。

yarn build --skip-node-download --skip-os-packages

友情提示:如果 Kibana 版本变动后导致所需 nodejs 版本也变了,此处还是需要改回来,老老实实再下载一份配套的 nodejs

减少构建

观察了一下打包后的文件,除了 linux 版本,还有 windows 和 mac 版的

Kibana 7.6.3 源码编译 + 构建踩坑

因为实际生产环境只需要 linux 版本,于是想办法干掉 windows 和 mac 版

  • 修改 src/dev/build/lib/config.js, 只打包 Linux 包
Kibana 7.6.3 源码编译 + 构建踩坑
  • 修改 package.json,去掉 --all-platforms

对比

简单优化后构建耗时 1875 秒,半小时左右,提升了差不多 10 分钟……

理论上还有更多优化空间,下次一定专门研究一下。

踩坑总结

这次 Kibana 7.6.3 二次开发体验下来耗时耗力的坑有两方面确定的原因:

  • 编译/构建时的网络问题
  • 构建时不熟悉官方文档

前者网络问题通过修改下载源可以解决,但如果不提前了解相关的坑,新接触该项目时仍会一个一个遇到相关问题,花不少时间浪费在了网络超时的等待时间中。

后者主要是体现在构建时偷懒,输入 yarn build,忽略了官方文档上说明的相关参数,直接莽。其实只要看一眼花个 1 分钟就可以了。

另外不太确定的点是

  • 机器硬件性能

之前在网上看到相关文档说建议用性能好的机子去构建项目,原本认为自己机器 18年的 pro 应该没啥问题的,但还是花了半个小时以上... 由于还没有用其他机器构建过,所以不太确定是我机器问题,还是说项目构建代码仍有较大的优化空间。


以上,记录下自己遇到的问题,希望这篇文章对入坑 Kibana 二次开发的小伙伴有帮助。

也感谢阅读到这里,第一次接触 Kibana,如果有错误,欢迎各位大佬拍砖指正~

参考资料

[1]

kibana7.6.2源码开发编译: https://www.cnblogs.com/Bud-blog/p/13469086.html

[2]

Building a Kibana distributable: https://www.elastic.co/guide/en/kibana/7.x/building-kibana.html

[3]

Webpack打包报'JavaScript heap out of memory'错误: https://www.cnblogs.com/jianxuanbing/p/9331042.html