Skywalking的编译打包

2020-07-13 10:18:37 浏览数 (1)

Skywalking作为一款优秀的开源APM监控系统,对于性能监控帮助挺大,去年开始我们自己就对这个开源的系统做了些改动和本地化的开发,改完后就会涉及到编译打包,现在我们从网上找到挺多这方面的文章,但是我那时候很少能搜到,所以当时摸索过程中踩了很多坑。现在我重新整理一下这方面的思路,并且做些简化,也参考了别人的方法:

基础环境:

jdk: 1.8 maven: maven 3 git: 版本随意

IDE: intelliJ IDEA (依个人习惯,我编译打包有时候根本没用到IDE,毕竟挺占内存的)

另外不要用VPN翻墙,很多人以为翻墙会下载很快,但可能会导致编译失败。

构建项目:

本次构建的是Skywalking的master分支,对于当前来说应该相当于是 Skywalking 8.1.0 版。

1. clone代码

git clone https://github.com/apache/skywalking.git (1) 问题:clone代码失败,github在国外,连接太慢了。

解决方法:

一是配置加速器,通过改hosts文件;

代码语言:javascript复制
# 加速器配置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)。

2. 执行git命令

可以在IntelliJ IDEA打开Terminal命令窗口并输入命令,也可以直接在cmd下或是linux系统直接输命令。

代码语言:javascript复制
git submodule init

git submodule update

submodule update这一步非常关键,大部分错误出在这一步。以上命令就是为了获取skywalking子模块的源码,子模块包括apm-network、query-graphql-plugin、skywalking-ui、e2e-ttl-es,具体的依赖信息可查看根目录的 .gitmodules文件:

代码语言:javascript复制
[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也是一种方法)。

3. 执行mvn命令

可以用安装的mvn命令,也可以用skywalking源码中自带的mvnw命令(推荐用这个):

代码语言:javascript复制
# 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目录下生成两个安装包:

把其中一个包解开,就能看到我们所需要的安装启动文件:

常见问题处理:

1. 报maven-wrapper.jar错

第一次执行mvnw clean package -DskipTests 一般会报以下错误:

这是因为maven-wrapper.jar下载并拷贝到.mvn/wrapper下失败,把链接复制出来,手动去下载吧,下载后把maven-wrapper-x.x.x.jar文件,改名成maven-wrapper.jar,并拷贝到.mvn/wrapper目录下。

2. 提示缺少部分类

执行mvnw clean package -DskipTests失败,提示缺少部分类,例如缺少类KeyStringValuePair.java

代码语言:javascript复制
[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 <goals> -rf :apm-network

缺类的情况很常见,原因是因为前面提到的git submodule update没有更新到submodule,解决方法就是看报的哪个模块,比如这是报的apm-protocol/apm-network,到.gitmodules中找到对应模块源码的路径:

删除对应的目录,重新 git submodule update,或者按前面说的方法,手动去下载源码吧。

3. npm install报错:

代码语言:javascript复制
[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-webapppom.xml决定的:

代码语言:javascript复制
                <configuration>
                    <workingDirectory>${ui.path}</workingDirectory>
                    <nodeVersion>v8.17.0</nodeVersion>
                </configuration>

最重要的一点,还不是下载的问题,而是在npm install过程中下载node_modules的插件就出错了,所以UI的构建如果总是不成功,我们也可以独立出来,通过cnpm install也是可以的,关键是要能将vue.js编译生成dist文件:

独立编译成的UI dist文件,也是可以放到apm-webapp中打包的,可以将上图dist中的文件拷贝到apm-webapptargetclassespublic下,然后修改apm-webapppom.xml,将npm install和build过程都注释了:

这样就实现了独立构建的skywalking-ui结果文件放到整体包中一起打包(这样就忽略了skywalking-ui在构建时,因为网络原因导致整体打包被中断)。当然你也可以什么也不改,把skywalking-ui目录删除,多构建几次,可能也会成功。或都将上面的pom.xml文件进行修改,不用npm命令,改成用cnpm命令,可能也会成功。

4. protoc调用错误

新版本好像没有这个问题,老版本在初次执行mvnw clean package -DskipTests时会报错如下:

这个错误一般在老版本,如6.6.0,第一次使用时会出现,现在我没发现有(应该已经集成了),如果出现可以按以下方式处理:

  • 下载需要的安装包:https://github.com/protocolbuffers/protobuf/releases/tag/v3.3.0

protoc-3.3.0-win32.zip protobuf-java-3.3.0.zip

  • 将protoc-3.3.0-win32中的protoc.exe拷贝到c:windowssystem32和SysWOW64中
  • 将protoc.exe文件拷贝到解压后的protobuf-3.3.0src目录中
  • protobuf-3.3.0java 目录下执行mvn package命令编辑该包生成protobuf-java-3.3.0.jar文件(这一步相当于安装了)

差不多就是这些了,如果遇到新的问题,应该也是可以归到以上几类(至少问题的原理是一样的)。一般我们是不推荐自己构建skywalking,毕竟官网一直在更新安装包,已经能满足大部分人的使用。

欢饮光临smooth的博客:https://smooth.blog.csdn.net/

0 人点赞