Skywalking作为一款优秀的开源APM监控系统,对于性能监控帮助挺大,去年开始我们自己就对这个开源的系统做了些改动和本地化的开发,改完后就会涉及到编译打包,现在我们从网上找到挺多这方面的文章,但是我那时候很少能搜到,所以当时摸索过程中踩了很多坑。现在我重新整理一下这方面的思路,并且做些简化,也参考了别人的方法:
jdk: 1.8
maven: maven 3
git: 版本随意
IDE: intelliJ IDEA (依个人习惯,我编译打包有时候根本没用到IDE,毕竟挺占内存的)
另外不要用VPN,很多人以为会下载很快,但可能会导致编译失败。
本次构建的是Skywalking的master分支,对于当前来说应该相当于是 Skywalking 8.1.0 版。
git clone https://github.com/apache/skywalking.git
(1) 问题:clone代码失败,github在国外,连接太慢了。
解决方法:
一是配置加速器,通过改hosts文件;
# 加速器配置hosts如下
219.76.4.4 github-cloud.s3.amazonaws.com
192.30.253.112 github.com
151.101.185.194 github.global.ssl.fastly.net
方法二是自己在码云https://gitee.com/ 开一个账号,也创建个skywalking项目,同时把上面skywalking源码链接同步到你的项目中(码云上也有官网的skywalking,不过不是最新的;为什么要用同步,而不用Fork,因为同步是强制更新最新的源码,简单粗暴)。然后git时换成gitee的链接去clone代码(国内的网站很快,如我的是
https://gitee.com/smooth00/skywalking)。
可以在IntelliJ IDEA打开Terminal命令窗口并输入命令,也可以直接在cmd下或是linux系统直接输命令。
git submodule init
git submodule update
submodule update这一步非常关键,大部分错误出在这一步。以上命令就是为了获取skywalking子模块的源码,子模块包括apm-network、query-graphql-plugin、skywalking-ui、e2e-ttl-es,具体的依赖信息可查看根目录的 .gitmodules文件:
[submodule "apm-protocol/apm-network/src/main/proto"]
path = apm-protocol/apm-network/src/main/proto
url = https://github.com/apache/skywalking-data-collect-protocol.git
[submodule "oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol"]
path = oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol
url = https://github.com/apache/skywalking-query-protocol.git
[submodule "skywalking-ui"]
path = skywalking-ui
url = https://github.com/apache/skywalking-rocketbot-ui.git
[submodule "test/e2e/e2e-protocol/src/main/proto"]
path = test/e2e/e2e-protocol/src/main/proto
url = https://github.com/apache/skywalking-data-collect-protocol.git
执行git submodule update报错,或是没有任何反应都是不行的。很多时候因为网络原因,update的文件不全,我们就需要重新执行update命令,执行前,需要删除上面.gitmodules对应的path目录,重新执行命令让它重新下载。比如编译到apm-network这一步报错,往往是因为apm-protocol/apm-network/src/main/proto下的文件缺失,所以重新执行命令下载。
(当然还有个诀窍,就是手动去url链接的地址下载skywalking-data-collect-protocol的包,解压到对应path下也是可以的,这种方式可以避免因为网络而导致下载的问题)
另外一个比较容易出问题的是前端ui代码的下载(skywalking-rocketbot-ui),网速不给力嘛,要么去手动下载,要么用clone代码的方式,用加速器或是直接同步到gitee再去下载(通过更改.gitmodules文件中的url也是一种方法)。
可以用安装的mvn命令,也可以用skywalking源码中自带的mvnw命令(推荐用这个):
# IDEA打开Terminal执行,或是进入到skywalking目录下执行
# linux下执行
./mvnw clean package -DskipTests
# windows下执行
mvnw clean package -DskipTests
# 第二次为了避免重复构建全部源码,可以对某个模块编译并打完整包
# 编译 agent 包
./mvnw package -Pagent,dist
# 编译 backend 包并且打完整包
./mvnw package -Pbackend,dist
# 编译 UI 忽略Tests,并且打完整包
./mvnw package -Pui,dist -DskipTests
这一步执行时间长短和网速有关系,编译全量需要20min~1h,编译一个模块2min~20min,编译到后面看到一个个的SUCCESS就表示成功了。
最后会在dist目录下生成两个安装包:
把其中一个包解开,就能看到我们所需要的安装启动文件:
maven-wrapper.jar错
第一次执行mvnw clean package -DskipTests 一般会报以下错误:
这是因为maven-wrapper.jar下载并拷贝到.mvn/wrapper下失败,把链接复制出来,手动去下载吧,下载后把maven-wrapper-x.x.x.jar文件,改名成maven-wrapper.jar,并拷贝到.mvn/wrapper目录下。
执行mvnw clean package -DskipTests失败,提示缺少部分类,例如缺少类KeyStringValuePair.java
[ERROR] /Users/terry/Gits/agent/skywalking/skywalking-github/apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/trace/component/command/TraceIgnoreCommand.java:[39,48] 找不到符号
[ERROR] 符号: 变量 KeyStringValuePair
[ERROR] 位置: 类 org.apache.skywalking.apm.network.trace.component.command.TraceIgnoreCommand
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR] mvn -rf :apm-network
缺类的情况很常见,原因是因为前面提到的git submodule update没有更新到submodule,解决方法就是看报的哪个模块,比如这是报的apm-protocol/apm-network,到.gitmodules中找到对应模块源码的路径:
删除对应的目录,重新 git submodule update,或者按前面说的方法,手动去下载源码吧。
[ERROR] Failed to execute goal com.github.eirslett:frontend-maven-plugin:1.6:
npm (npm install) on project apm-webapp: Failed to run task: 'npm install --
registry=https://registry.npmjs.org/' failed. org.apache.commons.exec.ExecuteException:
Process exited with an error: -4048 (Exit value: -4048) -> [Help 1]
碰到这个错,很多人会想到是不是https://registry.npmjs.org/ 的问题,就想改成国内的https://registry.npm.taobao.org ,结果还是报错,其实只要这个网址是通的,就无所谓改成什么。之所以报错,就是前面提到git submodule update,这一步是UI的构建,不成功无非就是UI源码没下载好,或是node.exe没下载好,node的版本是由apm-webapp\pom.xml决定的:
${ui.path}
v8.17.0
最重要的一点,还不是下载的问题,而是在npm install过程中下载node_modules的插件就出错了,所以UI的构建如果总是不成功,我们也可以独立出来,通过cnpm install也是可以的,关键是要能将vue.js编译生成dist文件:
独立编译成的UI dist文件,也是可以放到apm-webapp中打包的,可以将上图dist中的文件拷贝到apm-webapp\target\classes\public下,然后修改apm-webapp\pom.xml,将npm install和build过程都注释了:
这样就实现了独立构建的skywalking-ui结果文件放到整体包中一起打包(这样就忽略了skywalking-ui在构建时,因为网络原因导致整体打包被中断)。当然你也可以什么也不改,把skywalking-ui目录删除,多构建几次,可能也会成功。或都将上面的pom.xml文件进行修改,不用npm命令,改成用cnpm命令,可能也会成功。
新版本好像没有这个问题,老版本在初次执行mvnw clean package -DskipTests时会报错如下:
这个错误一般在老版本,如6.6.0,第一次使用时会出现,现在我没发现有(应该已经集成了),如果出现可以按以下方式处理:
protoc-3.3.0-win32.zip
protobuf-java-3.3.0.zip
mvn package
命令编辑该包生成protobuf-java-3.3.0.jar文件(这一步相当于安装了)差不多就是这些了,如果遇到新的问题,应该也是可以归到以上几类(至少问题的原理是一样的)。一般我们是不推荐自己构建skywalking,毕竟官网一直在更新安装包,已经能满足大部分人的使用。