搭建本地AOSP Gerrit Server完全指南 (一)

搭建本地AOSP Gerrit Server完全指南 (一)_第1张图片

前言

本文引导入如何从0到1,搭建一个专属自己的Gerrit伺服器(Gerrit Server)

本文是系列文的第一篇,本系列在介绍如何建立本地自有(localhost) Gerrit Server并且将AOSP (Android Open Source Project)的原始码完整导入此Gerrit Server。

文章分为三个部份,本文是第一部份,教导如何架设Gerrit Server,如果你已经很熟悉这个工作,可以直接跳至第二或第三部份。

  • 第一部份:架设Gerrit Server (本文)
  • 第二部份:将AOSP完整导入Gerrit Server
  • 第三部份:如何从本地Gerrit Server建立一个AOSP Branch

真正利用Gerrit来确保Code的品质并且保留企业内部技术。

进行此AOSP导入工作的主要目的在于本人专业工作上需要修改AOSP原始码以符合客制化的需求,但AOSP本身 庞大的原始码及代码库(Repository)不适合再导入公司内部原有已存在的Gerrit Server。于是乎,将AOSP导入一个新建的Gerrit Server成为一个合理的选择。另外更重要的原因是,自身内部专案的AOSP原始码必须能够提供以下功能:

  • 进行Code Review,确保稳定性及纪录留存以保留技术知识。
  • 同步Merge Android官方原始码,确保官方修正的问题可以同步合入自身专案。

在完成本文系统的三篇文章中所述的任务之后,你应该可以:

  • 建立基本Gerrit Server的能力
  • 抓取AOSP并导入自有Gerrit Server的能力
  • 同步AOSP并且合入官方修改的原始码的能力
  • 建立自身AOSP Branch并且修改及进行Code Review

本文在Ubuntu 18.04进行,基本上我在Ubuntu 16.04也执行过同样任务,所以差别不大,所以你的系统是在Ubuntu 16.04,应该完全可以适用。

所需软件

  • Gerrit (version 2.16.4)
  • Git
  • Open JDK 8
  • MySQL (非必要)
  • Gerrit Delete Project Plug-in (非必要,但很好用)

安装及设定

因为Gerrit是以Java开发,而且AOSP也需要Java 8做为Java Compilter,我们首先安装Open JDK 8。

安装OpenJDK 8

Ubuntu 18.04 预载OpenJDK 11,但为了之后编译(BUILD)AOSP,所以我们把Java环境设为OpenJDK 8。使用apt-get进行安装。如果是在Ubuntu 16.04安装,只要直接安装OpenJDK 8应该就没问题了。

sudo apt-get install openjdk-8-jdk
sudo update-alternatives --config java
There are 3 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                            Priority   Status
------------------------------------------------------------
  0            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1101      auto mode
  1            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1101      manual mode
 *2            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      manual mode
  3            /usr/lib/jvm/java-8-oracle/jre/bin/java          1081      manual mode

Press  to keep the current choice[*], or type selection number: 2

安装完成后,执行指令update-alternatives --config java,以选择openjdk-8做为预设Java。执行java -version,确认java版本为openjdk 8

java -version
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-8u191-b12-0ubuntu0.18.04.1-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)

安装Git

很简单就直接用apt-get安装

 sudo apt-get install git-all

安装Gerrit Server

  • 安装MySQL (若选择使用H2,或是已有MySQL Server,则可跳过)
sudo apt-get install mysql-client   
sudo apt-get install mysql-server
sudo mysql_secure_installation #初始MySQL root密碼
Securing the MySQL server deployment.

Connecting to MySQL using a blank password.

VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?

Press y|Y for Yes, any other key for No: Y

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 0
Please set the password for root here.

New password: 

Re-enter new password:
sudo mysql
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

将MySQL Root密码设为password

安装MySQL完成后,加入Linux User-- **gerrit**

  • 首先新增一个Linux使用者gerrit,以方便管理
sudo adduser --system --shell /bin/bash --gecos 'Gerrit server owner' --group --disabled-password --home /home/gerrit gerrit
  • 设定MySQL
mysql -u root -p
CREATE USER 'gerrit'@'localhost' IDENTIFIED BY 'Gerrit1234';
CREATE DATABASE reviewdb;
ALTER DATABASE reviewdb charset=latin1;
GRANT ALL ON reviewdb.* TO 'gerrit'@'localhost';
FLUSH PRIVILEGES;
quit
sudo su gerrit #切換至gerrit
cd #将目录切换至/home/gerrit

将gerrit加入MySQL,并初始database,完成后sudo su转至gerrit user (gerrit@localhost的MySQL密码为Gerrit1234,可自行替换) 修改MySQL sql_mode

sudoedit /etc/mysql/mysql.conf.d/mysqld.cnf

在mysqld.cnf中的[mysqld]下,加入

sql_mode = "ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

若少了本行,则Gerrit在初始化Database时会发生错误。

  • 下载Gerrit:点此下载

本文使用的是v2.16.4,下载后的档案为gerrit-2.16.4.war (可以直接下指令:wget https://gerrit- releases.storage.googleapis.com/gerrit-2.16.4.war 取得本文gerrit版本)

我们在gerrit的家目录下建立两个目录,名称任取(当然也可以把目录建在其他gerrit user可以存取的任何目录),一个目录是Gerrit Server Site,另一个是存放Git Repository的地方。Git Repository导入AOSP后至少有100 Gbytes,所以要确保磁碟空间够大。

本文把Gerrit server目录建立在/home/gerrit/aosp_review_site,把Git Respository建在/home/gerrit/aosp_git

mkdir aosp_review_site
mkdir aosp_git
  • 至此可以开始安装Gerrit
java -jar gerrit-2.16.4.war init -d ~/aosp_review_site
...
Location of Git repositories   [git]: /home/gerrit/aosp_git
Database server type           [h2]: mysql
...
gerrit's password              : 
              confirm password :
...
Canonical URL                  [http://localhost:8080/]: http://192.168.10.12:8080/

安装的过程有很多问答,大部份回预设值(直接按Enter),只有以上列出的部份根据本身的需求做改变。像是 我自己安装的Gerrit Server在192.168.100.56,这个值你是一定要改掉的。Location of Git repositories是指你的Git Repository的目录,我指定在aosp_git目录下。Database server type在本文使用MySQL而不是预设的h2。

  • 启动Gerrit

进行第一次启动,执行以下指令

~/aosp_review_site/bin/gerrit.sh start
Starting Gerrit Code Review: WARNING: Could not adjust Gerrit's process for the kernel's out-of-memory killer.

         This may be caused by /home/gerrit/aosp_review_site/bin/gerrit.sh not being run as root.

         Consider changing the OOM score adjustment manually for Gerrit's PID= with e.g.:

         echo '-1000' | sudo tee /proc//oom_score_adj
OK

在Gerrit Server安装目录下有个bin目录,执行gerrit.sh start则启动gerrit。启动时的WARNING可以先无视。之后把gerrit的启动交给root就可以解决了。

开启Browser,输入安装的Server的位址及埠http://192.168.100.56:8080,若看到此画面,则成功安装Gerrit。
搭建本地AOSP Gerrit Server完全指南 (一)_第2张图片

安装成功后的Gerrit Web UI画面(尚未登入)

右上角有个Sign in,点击登入,在Gerrit Server的设计,第一位登入者即是管理员Administrator

  • 首次登入

本文是使用OpenID做为授权(Authentication)依据,所以之前我就在LaunchPad Net注册一个帐号。

搭建本地AOSP Gerrit Server完全指南 (一)_第3张图片

按下Sign in with a Launchpad ID后,登入,成为管理员如果还没有LaunchPad帐号,去https://launchpad.net/ 注册一个,快速,简单!

登入成功后,首先是先把自己的username加入。因为我们用OpenID登入,一开始是没有username。这会造成后续 的command line: ssh -p29418 xxx@host gerrit之类型式的命令无法使用,所以必须先设好username。设定好之后就不能改了,所以必须考虑清楚。

设定username的地方先点击在右上角的齿轮icon(就是Settings),然后在username输入,在本例中,输入的 是larson。

你可以看出,输入后就不能改了。

搭建本地AOSP Gerrit Server完全指南 (一)_第4张图片

设定使用者帐号,设定后不能再改!

再来就是加入SSH Key

此时我们登入另一个PC做为Gerrit Client,由该PC经由网路连结至Gerrit Server。(如果没有另一台Linux可试就直接在localhost建立一个帐号来试) 首先检查你的家目录~/.ssh目录下是否已有SSH public key,如果没有就必须以下列命令产生。

ssh-keygen -t rsa -C "[email protected]"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/larson/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/larson/.ssh/id_rsa.
Your public key has been saved in /home/larson/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:+/NFKhFBTmgNj4FQgBllFYCbA4hjIlMYdK8OeXuvxNU [email protected]
The key's randomart image is:
+---[RSA 2048]----+
|==oB**+oo=+      |
|X.=.. . o*..     |
|++ o . .. +      |
|  = .   .  .     |
| o +   .SE.   .  |
|  + o .  . . o   |
|   o +  . . . .  |
|    o .  ... .   |
|     ...  .o.    |
+----[SHA256]-----+

cat ~/.ssh/id_rsa.pub 
ssh-rsa 2EAAAADAQABAAABAQD53E9s9sSKaZ2RRok9i/UmYCBkTBENM73emUHxNOdPcHKQNUMtvVVq2J2IWfyUrc+vyFemu
...CITPjYRbWJZAyVfsY0q9hQvNTjVxYSrSyKif [email protected]

注意:email的前缀名称最好和你的gerrit account相同,例如你的gerrit account名称是foo,那email最好是foo@…,在gerrit上并没有这样的要求,但往后会用到的repo命令,在这一点上是有要求的。

在Gerrit Web上将cat出的id_rsa.pub内容复制贴上至Settings(右上角齿轮)->SSH Keys,贴至“New SSH key”栏位中

搭建本地AOSP Gerrit Server完全指南 (一)_第5张图片

在Gerrit Server中,加入SSH Key

最后按下“ADD NEW SSH KEY” 后,即完成加入SSH Key。

完成后利用命令列进行测试。

ssh -p 29418 [email protected]
The authenticity of host '[192.168.100.56]:29418 ([192.168.100.56]:29418)' can't be established.
ECDSA key fingerprint is SHA256:FBtsyexuskBOcPsRkjUq9STYXd7a2q9SVQbDii8Q2WI.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[192.168.100.56]:29418' (ECDSA) to the list of known hosts.

  ****    Welcome to Gerrit Code Review    ****

  Hi Jeremy Chen, you have successfully connected over SSH.

  Unfortunately, interactive shells are disabled.
  To clone a hosted Git repository, use:

  git clone ssh://[email protected]:29418/REPOSITORY_NAME.git

有Welcome的提示就代表SSH key加入成功,可以远端直接下命令。若失败则会有Connection refused的错误讯息。此时可能是email不合或其他连线原因。

在推送整个AOSP之前,我们先初始建立一个Project,测试是否可以成功建立并进行Code Review。建立第一个Project

其实在Gerrit 2.16版之后在UI上已经没有『Project』 这个名词了,而是一律使用Repository来表示一个代码库的概念。不过Project仍是对大多数有用过Gerrit code review的人而言,对“Project”这个名词仍是比较熟悉的,而且

在gerrit命令集也是用gerrit create-project之类的方式来称呼。所以本文仍用建立Project来描述这个工作。在Browser->Repository下,可以在右上角看见“CREATE NEW"。点击!

搭建本地AOSP Gerrit Server完全指南 (一)_第6张图片

建立第一个Repository (或称Project)

Project名称是test-project,Owner是目前唯一个用户,就是管理者larson,按CREATE后第一个Project完成建 立。

  • 第一个Code Review

在Gerrit Client中的test-project,建立并推送push第一个档案main.cpp至Gerrit Server进行Review。首先从Gerrit Server取出Project (此时为空Project,只含一个.git目录)。流程都是按照官方指令

https://gerrit-review.googlesource.com/Documentation/intro-gerrit-walkthrough.html

git clone ssh://[email protected]:29418/test-project
Cloning into 'test-project'...
remote: Counting objects: 2, done
remote: Finding sources: 100% (2/2)
remote: Total 2 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (2/2), done.
cd test-project
scp -p -P29418 [email protected]:hooks/commit-msg .git/hooks/
chmod u+x .git/hooks/commit-msg
commit-msg                                                                                        100% 1392     1.4MB/s   00:00    
git remote -v
origin ssh://[email protected]:29418/test-project (fetch)
origin ssh://[email protected]:29418/test-project (push)

建立第一个档案main.cpp,并推送至Gerrit Server

touch main.cpp #建立第一個檔案
echo -e "#include \n\nint main(int argc, char**argv){\n\treturn 0;\n};\n" > main.cpp #加入原始碼
git status 
On branch master
Your branch is up to date with 'origin/master'.

Untracked files:
  (use "git add ..." to include in what will be committed)

 main.cpp

git add main.cpp
git commit -m"Test: first code review" main.cpp
[master 1b12406] Test: first code review
 1 file changed, 6 insertions(+)
 create mode 100644 main.cpp
git push origin HEAD:refs/for/master#上傳至Gerrit Server進行Code Review
Counting objects: 3, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 326 bytes | 326.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: Processing changes: refs: 1, new: 1, done    
remote: 
remote: SUCCESS
remote: 
remote: New Changes: 

在Gerrit Website中,点选Changes->Open即可看到第一个Code Review!

搭建本地AOSP Gerrit Server完全指南 (一)_第7张图片

第一个Code Review代码审视

点击进入后,就可以将Code推入Git Repository (当然你也可以Abandon它!)

安装delete-project Plug-in

在前期测试时delete-project的Gerrit Plug-in是很重要的,尤其是下一篇会导入整个AOSP的时候,一有差错则可能需要手动把不小心导入的数百个Projects慢慢删掉。所以我们需要一个可以方便删除Project的工具,而测试Gerrit Server时建立的的第一个Project,test-project,当然是会删除的标的!

自行Build出Plug-in是满麻烦的,直接拿Prebuilt的JAR档来安装即可,除非你是要去修改功能或要开发新的Plug- in,否则实在不需要从原始代码开始Build起。

Prebuilt版本的下载处:https://gerrit-ci.gerritforge.com/job/plugin-delete-project-bazel-stable-2.16/

复制delete-project.jar的连结位址后

ssh -p 29418 [email protected] gerrit plugin install -n delete-project.jar https://gerrit-ci.gerritforge.com/job/plugin-delete-project-bazel-stable-2.16/lastSuccessfulBuild/artifact/bazel-genfiles/plugins/delete-project/delete-project.jar

如果发生错误讯息:fatal: remote plugin administration is disabled 表示你由远端安装Plug-in,此时有两个方法

(1)回到Gerrit Server本地安装(2)在gerrit.conf中加入新的Section

[plugins]
    allowRemoteAdmin = true

加入要重新启动Gerrit Server,在Gerrit Server下: /home/gerrit/aosp_review_site/bin/gerrit.sh restart

完成重启后再把上述安装Plug-in的命令执行一次即可。

回到Gerrit Website,在Browse->Repository下选test-project。在左侧点选Command,即可看到命令列中多出一个DELETE PROJECT的命令。(如果没看到有可能是Browser Cache,按F5重刷一次!)

搭建本地AOSP Gerrit Server完全指南 (一)_第8张图片

Gerrit Delete Project插件

执行Delete Project时务必小心,因为一不小心之前累积的Knowledge就付诸流水了。我想这也是Gerrit没有把Delete Project这么平常不过的功能实作出来的主因吧!如果Gerrit Server正式上线后,我也是建议把此功能先Disable掉,否则悲剧随时可能发生!

按下「 DELETE PROJECT」之后会再确认一次,按下Delete把Project删除!

如此我们就有一个干净的Gerrit Server来进入第二个部份:PART2

你可能感兴趣的:(版本控制,架构/管理,android,java,开发语言)