目录

Kibana 7.6.3 源码编译 + 构建踩坑

https://imgkr2.cn-bj.ufileos.com/4cafe58a-c5c7-4b0f-a895-0d332c4c0f4c.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=LbnTKyC%252BSDuNWdSULb2M%252FiGm%252B3E%253D&Expires=1609811697

最近工作上接到个需求,需要对 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 的版本一致。

https://imgkr2.cn-bj.ufileos.com/27a95948-1b01-44ef-93eb-700e3fe5560b.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=1xC66nBVDS%252FhL4RwBdDuI1%252B4anM%253D&Expires=1609821370

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

https://imgkr2.cn-bj.ufileos.com/e8420379-fc62-465b-811a-789e11f5f53a.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=m1yIeDg2Lg4VStld%252BVWePp%252F%252FlUI%253D&Expires=1609811574

Step1:准备操作

  • 下载 Kibana 7.6.3 源码
  • 使用 nvm 切换至对应 node.js 版本

https://imgkr2.cn-bj.ufileos.com/aa126797-676e-4d41-962f-399ac4534a85.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=5nN5i4%252B8HDo9%252FgSIarqm9jAoGQ8%253D&Expires=1609821321

  • 安装 kbn:yarn add kbn —g
  • 确保 git master 上有 commit 记录,否则:

https://imgkr2.cn-bj.ufileos.com/223a6b6e-c129-4c70-b072-57a7d26080e8.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=JEICFvXsztF2BhZosj36vDx4U88%253D&Expires=1609811555

Step2:编译阶段

1
yarn kbn bootstrap

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

iedriver 问题

https://imgkr2.cn-bj.ufileos.com/be8a4ed6-0b29-4e16-bc2e-f36206780039.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=naA%252FllvFZgIeLb1y1%252FU6xpuRQoE%253D&Expires=1609811545

原因:网络问题

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

chromedriver 问题

原因:网络问题

解决方案:使用 TB 源

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

https://imgkr2.cn-bj.ufileos.com/ce76b7d4-644a-45fa-aa4f-e2920bdab6d6.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=40piprSMlI%252BiLTKKfhS7yp8miyI%253D&Expires=1609821352

原因:网络问题

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

1
yarn config set PUPPETEER_SKIP_CHROMIUM_DOWNLOAD 1

解决方案 2: 重新设置下载地址

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

geckodriver 问题

原因:网络问题

解决方案:使用 TB 源

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

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

https://imgkr2.cn-bj.ufileos.com/993d2135-bd1b-46be-a38b-1be038afc6ad.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=mZKtFJcAm%252BbRyNkbzeQNrklj1v0%253D&Expires=1609821423

Step3:构建阶段

1
2
yarn build --skip-os-packages  
yarn build 

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

下载 node.js 包超时

https://imgkr2.cn-bj.ufileos.com/7919f750-d8d1-4933-a70f-95be802f4838.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=v4iFTVPhMYePK6QxYdyNwLs1O8o%253D&Expires=1609811490

原因:源码中 node.js 下载地址以及 sha256 签名文件的地址都是这样定义的

1
2
3
4
5
// 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

1
2
3
4
5
// 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 打包内存溢出

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

https://imgkr2.cn-bj.ufileos.com/65d35857-d1a3-4066-bba0-d777077fc90f.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=HlcU2cOny5a%252BcGuejdA2ZNP10PM%253D&Expires=1609819091

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

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

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

1
export NODE_OPTIONS=--max_old_space_size=4096

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

https://imgkr2.cn-bj.ufileos.com/76543c92-4729-485c-975a-161ea1b079ed.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=nBm7xojMSzJ4bvo0wlWWqJatGoE%253D&Expires=1609811471

原因:当前操作系统非 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.

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

1
yarn build --skip-os-packages

https://imgkr2.cn-bj.ufileos.com/86e9d828-9d8e-4f0c-81f1-c5a3208d0180.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=BUjke2ygxLQRkfAKoK8BxS5LmYQ%253D&Expires=1609821243

相关参数说明:

https://imgkr2.cn-bj.ufileos.com/4bad82db-9d16-406a-88d6-70648c9e263c.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=PkFXe3nzHkI2%252BzJmJrz11PQ%252BS34%253D&Expires=1609811452

成功,但……

https://imgkr2.cn-bj.ufileos.com/b5b09712-48a1-40b6-bfb4-98165c664d24.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=PbDEpqNTgJ8%252FltlGTDqNc0lKUF4%253D&Expires=1609811306

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

构建优化

省去下载 nodejs 步骤

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

https://imgkr2.cn-bj.ufileos.com/9865d66b-59a8-44b5-9a12-e5724db81a8f.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=2Hs0MawKt%252BqitUdQxAKKWVIfgmk%253D&Expires=1609821220

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

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

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

减少构建

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

https://imgkr2.cn-bj.ufileos.com/9c4cbbca-e745-45b1-9cd3-afecda62e3ab.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=%252FGSk0RsTWsd6J2tXtmuuPdPsFx4%253D&Expires=1609811271

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

  • 修改 src/dev/build/lib/config.js, 只打包 Linux 包

https://imgkr2.cn-bj.ufileos.com/3ca68e2e-c50a-47cd-afc0-bbc2170c9146.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=21mVw2O7dPlzjo9ClGU81%252BtyqDw%253D&Expires=1609821149

  • 修改 package.json,去掉 –all-platforms

https://imgkr2.cn-bj.ufileos.com/2c976c5e-0817-44bf-9da7-5ab8ca7135ac.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=MLONqxWFnad%252BHv%252BAnf6WWa%252Ff5lY%253D&Expires=1609821087

对比

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

https://imgkr2.cn-bj.ufileos.com/2d2c373d-151f-4c49-b3f0-9aaec0c44927.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=rvEN0nzYqJNJO3avW6E9XYfKpjY%253D&Expires=1609810359

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

踩坑总结

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

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

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

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

另外不太确定的点是

  • 机器硬件性能

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


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

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