Skywalking的編譯打包

       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文件;

# 加速器配置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系統直接輸命令。

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也是一種方法)。

3. 執行mvn命令

可以用安裝的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目錄下生成兩個安裝包:

把其中一個包解開,就能看到我們所需要的安裝啓動文件:

常見問題處理:

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

[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報錯:

[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決定的:

                <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-webapp\target\classes\public下,然後修改apm-webapp\pom.xml,將npm install和build過程都註釋了:

這樣就實現了獨立構建的skywalking-ui結果文件放到整體包中一起打包(這樣就忽略了skywalking-ui在構建時,因爲網絡原因導致整體打包被中斷)。當然你也可以什麼也不改,把skywalking-ui目錄刪除,多構建幾次,可能也會成功。或都將上面的pom.xml文件進行修改,不用npm命令,改成用cnpm命令,可能也會成功。

4. protoc調用錯誤

新版本好像沒有這個問題,老版本在初次執行mvnw clean package -DskipTests時會報錯如下:

這個錯誤一般在老版本,如6.6.0,第一次使用時會出現,現在我沒發現有(應該已經集成了),如果出現可以按以下方式處理:

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

  • 將protoc-3.3.0-win32中的protoc.exe拷貝到c:\windows\system32和SysWOW64中
  • 將protoc.exe文件拷貝到解壓後的protobuf-3.3.0\src目錄中
  • protobuf-3.3.0\java 目錄下執行mvn package命令編輯該包生成protobuf-java-3.3.0.jar文件(這一步相當於安裝了)

差不多就是這些了,如果遇到新的問題,應該也是可以歸到以上幾類(至少問題的原理是一樣的)。一般我們是不推薦自己構建skywalking,畢竟官網一直在更新安裝包,已經能滿足大部分人的使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章