1. 程式人生 > >Gerrit原始碼開發環境搭建詳解

Gerrit原始碼開發環境搭建詳解

Gerrit

         Gerrit,開放原始碼的程式碼審查軟體,使用網頁介面。利用網頁瀏覽器,同一個團隊的軟體程式設計師,可以相互審閱彼此修改後的程式程式碼,決定是否能夠提交,退回或者繼續修改。它使用Git作為底層版本控制系統。原先是為了管理Android計劃而產生。Gerrit最早是由Python寫成,第二版之後改成用Java與SQL。使用Google Web Tookit 來產生前端的JavaScript。

Gerrit的構建系統

         Gerrit在2.8版本之後,專案完全採用Buck系統構建。Buck是一個構建系統,以Google的內部構建系統“blaze”為模型,它是由前Google,現Facebook工程師開發的。在Facebook,該構建系統是開源的,基於apache許可,位於GitHub上。Buck基於Python構建,不過在Gerrit中它主要用於編譯Java。

         Buck語言是個DSL,使用Python作為底層構建檔案。Buck相對於Maven的主要優勢在於速度快。Buck構建可以跨模組並行執行,預設情況下,Buck構建會執行1.25xCPU個執行緒。Buck只支援Mac OS 與 Linux,不支援Windows。

         Buck有三個主要的概念:

                   (1)構建規則

                             構建規則是一個程式從一組輸入檔案產生一個輸出檔案

                   (2)構建目標

                             構建目標是一個標識構建規則的字串。

                   (3)構建檔案

                             構建檔案,定義了一個或多個構建規則。

         Gerrit專案中Buck檔案常見規則:

                   (1)java_library()

                                     用於定義一組Java檔案,可以一起被編譯。java_library()規則的主要輸出是一個單獨的JAR檔案,其中包含所有的編譯後的類檔案和資源。示例如下:

                            java_library(

                                   name= 'JsonUtil',

                                   srcs= ['JsonUtil.java'],

                                   deps= [

                                          '//third_party/guava:guava',

                                          '//third_party/jackson:jackson',

                                   ],

                            )

                   (2)genrule()

                            從一個shell命令生生一個輸出檔案。示例如下:

                            genrule(

                                   name= 'gen',

                                   out= 'out.txt',

                                   cmd= 'cp $SRCS \$(dirname $OUT)',

                                   srcs= [

                                          'test1.txt',

                                          'test2.txt',

                                   ],

                            )

                   (3)remote_file()

                            用來從網際網路上下載一些用作其他規則的依賴關係的檔案。這些規則是通過運

                            行 buck fetch 下載,或者可以下載 buckbuild 的一部分。示例如下:

                            remote_file(

                              name = 'android-ndk-r10e-darwin-x86_64',

                              url ='https://dl.google.com/android/ndk/android-ndk-r10e-darwin-x86_64.bin',

                              sha1 ='b57c2b9213251180dcab794352bfc9a241bf2557',

                            )

                   (4)prebuilt_jar()

                            用來識別一個JAR檔案,檢查我們的庫作為預編譯的二進位制檔案,而不是一個由

                            buck從原始碼頻繁構建。這些都是用來引用第三方JAR檔案(比如junit.jar)和

                            用作依賴性ofjava_library()規則。示例如下:

                            prebuilt_jar(

                              name = 'junit',

                              binary_jar = 'junit-4.8.2.jar',

                              source_jar = 'junit-4.8.2-sources.jar',

                              javadoc_url ='http://kentbeck.github.com/junit/javadoc/4.8/',

                            )

                            java_library(

                              name = 'tests',

                              srcs = glob(['tests/**/*Test.java']),

                              deps = [

                                ':junit',

                              ],

                            )

搭建Gerrit開發環境

         Gerrit環境搭建步驟如下:

                   (1)下載Gerrit原始碼

                            gitclone --recursive https://gerrit.googlesource.com/gerrit

                            NOTE:--recursive 引數是為了保證內嵌的plugins都能被下載到

                   (2)IntelliJIDEA 安裝buck外掛

                            ①git   ②python2.6+   ③Buck  for IDEA   ④GWT

                   (3)Linux/Ubuntu安裝外掛

                            ①curl   工程第一次編譯時聯網下載jar包

                                     apt-get  install curl

                            ②git    apt-get install  git

                            ③gerrit  apt-get install  gerrit

                            ④maven   apt-get install maven2

                            ⑤ant  apt-get install  ant

                            ⑥buck  用於工程編譯

                                     git  clone  https://github.com/facebook/buck

                                     cd  buck

                                     ant

                                     mkdir~/bin

                                      PATH=~/bin:$PATH

                                     在 ~/bin 中新增可執行檔案 buck和buckd的符號連結

                                      ln -s 'pwd'/bin/buck ~/bin/

                                      ln -s 'pwd'/bin/buckd ~/bin/

                                      驗證buck是否可訪問

                                      which buck

                            ⑦watchman

                                     git  clone https://github.com/facebook/watchman.git

                                     cd  watchman

                                     ./autogen.sh

                  (二者選其一即可)

                                     安裝在使用者目錄下(withoutroot privileges):

                                     ./configure --prefix $HOME/watchman

                                     make install

                                      安裝下系統目錄下:

                                     ./config

                                     make

                                     sudo make install

                   (4)所有外掛安裝好之後,File--> open --> 下載的gerrit原始碼    

Gerrit原始碼編譯                   

一、在IDEA終端進行如下操作:

         (1)建立eclipseproject

                   tools/eclipse/project.py

         (2)構建  gerrit web應用

                    ①buck  build  gerrit

                            生成的是gerrit.war

                    ②buck  build  all

                            生成的是release.war

                    ①和②選其一執行即可,WAR包輸出路徑:buck-out/gen/gerrit.war

         NOTE: 重新構建需要先執行: buck  clean

二、Dependencies

         依賴JAR在構建時會自動下載,buck也可以下載任何丟失的JAR檔案,以使後續沒有網路訪問的情況下可以構建執行

         tools/download_all.py

下載時,可能需要顯式地指定使用的代理,然後curl下載

export http_proxy=http://<proxy_user_id>:<proxy_password>@<proxy_server>:<proxy_port>

搭建Gerrit伺服器

         以MySql資料庫、HTTP驗證、Apache代理為例

         ①安裝Mysql資料庫,Apache伺服器

         ②使用root許可權進入Mysql資料庫,執行如下操作:

                  CREATE USER 'gerrit2'@'localhost'IDENTIFIED BY 'secret';

                CREATE DATABASE reviewdb;

                ALTER DATABASE reviewdbcharset=latin1;

                GRANT ALL ON reviewdb.* TO 'gerrit2'@'localhost';

                  FLUSH PRIVILEGES;

         ③初始化網站

                   sudoadduser gerrit2

                   sudosu gerrit2

                 cd  ~/gerrit

                   java -jar  gerrit.war  init  -d review_site

(相應配置可參照:http://codexc.com/blog/2014/09/how-to-installation-and-configuration-gerrit-v2-10-with-github-oauth/)

         ④設定apache代理