草庐IT

如何用Gerrit管理你的Android代码?

移动Labs 2023-03-28 原文
作者|户锐,单位:中国移动智慧家庭运营中心

Labs 导读

Android源码是基于Linux的开源操作系统,目前Android ROM开发的代码管理工具基本上是采用Git。由于Android代码非常复杂,Google将其划分为多个git repo,这样不仅可以避免一个repo的代码太多,还可以根据repo的功能将其分配给不同团队进行管控。为了对Android代码质量进行管控,Google采用了Gerrit进行coderview,并利用jenkins做代码静态检测和自动化验证,当然还有集成CI工具。目前中国移动智慧家庭运营中心AOS-RM项目已经部署自己的Gerrit服务器,Gerrit对AOS-RM项目代码质量管理起到了非常重要的作用。

作为Android ROM相关的开发者,有必要了解什么是Gerrit,Gerrit的工作流程是怎么样的,Gerrit服务器怎么搭建,以及如何将Android codebase导入自己的Gerrit服务器。接下来本文将为大家详细解答以上问题。

Part 01  Gerrit简介

Gerrit是Google为Android系统研发量身定制的一套免费开源的代码审核系统,使用网页界面。利用网页浏览器,同一个团队的软件开发者可以相互审阅彼此修改后的代码,决定是否提交,回退或是继续修改。它使用版本控制系统Git作为底层。目前Gerrit被广泛使用,与Android开发相关,尤其是做Android ROM开发的公司基本都使用Gerrit进行code review。根据统计使用Gerrit的top3领域是IOT,Software Development以及Big Data。

数据来源:https://www.slintel.com/tech/source-code-management/gerrit-market-share

Part 02  Gerrit的工作流程

  1. 开发人员首先从git repo服务器上下载代码,首次下载Android codebase代码用git clone或者repo sync;
  2. 代码修改完毕并通过自我验证后以git push origin HEAD:refs/for/branch_name的方式提交到Gerrit上进行code review,其中branch_name需要根据实际情况修改为对应的分支名;
  3. Jenkins自动触发静态代码检查和编译,如果通过则verify+1,否则verify-1;
  4. Jenkins verify -1 后,根据提示修改代码,进入步骤2;
  5. Jenkins verify+1后,要求其他开发人员和MDE(模块owner,具有+2的权限)进行code review;
  6. 其他开发人员和MDE进行code review如果发现问题,则提出修改意见并-1,如果没有问题则+1和+2;
  7. 如果codereview有-1,则根据进行澄清或者根据意见修改,然后进入步骤2;
  8. 如果没有codereview -1,MDE点submit按钮,代码入库,流程完毕。

Part 03  Gerrit服务器搭建

3.1 安装git

sudo apt-get install git

3.2 安装jdk11

sudo apt install openjdk-11-jdk

3.3 安装gitweb

sudo apt-get install gitweb

3.4  Gerrit安装包下载

wget https://gerrit-releases.storage.googleapis.com/gerrit-3.5.1.wa

3.5 安装Gerrit(gerrit-3.5.0.1.war存放在~/gerrit目录下面)

cd ~/gerrit
mkdir review_site
java -jar gerrit-3.5.0.1.war init -d ./review_site/ (可以都选择默认,然后修改config文件)
sudo vim /home/gerrit/review_site/etc/gerrit.config
发送邮件配置的密码保存在secure.config,发送邮件的密码是授权码

3.6 安装Apache

sudo apt-get install apache2

3.7 配置Apache

sudo vim /etc/apache2/httpd.conf 内容如下图
sudo vim /etc/apache2/ports.conf 加入 Listen 8081(如果80端口没有被占用,不用修改)
sudo vi /etc/apache2/apache2.conf 加入 Include httpd.conf

3.8 使能proxy module

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_balancer
sudo a2enmod lbmethod_byrequests

3.9 添加账户

htpasswd -b /xxx/passwords account xxxx
如果passwords文件不存在,第一次需要加-c,
htpasswd -c -b /xxxx/passwords account xxxx

3.10 启动apache

sudo systemctl start apache2
sudo systemctl restart apache2

​3.11 启动gerrit

/xxxx/bin/gerrit.sh start
/xxxx/bin/gerrit.sh restart

3.12 访问gerrit

http://IP地址:端口号/

Part 04  Android Codebase导入Gerrit

4.1 创建AOSP仓库

利用浏览器在Gerrit服务器上创建AOSP仓库,将Only server as parent for other repositories设置为True

4.2 下载Android Codebase(-u的参数根据实际情况做修改)

repo init -u https://android.googlesource.com/platform/manifest --mirror
repo sync

4.3 创建repo(将IP修改为自己的服务器IP地址)

4.3.1 循环创建repo
repo forall -c 'echo $REPO_PROJECT; ssh -p 29418 account@IP gerrit create-project --owner AOSP_account $REPO_PROJECT;
4.3.2 设置repo的parent
repo forall -c 'echo $REPO_PROJECT; ssh -p 29418 account@IP gerrit set-project-parent --parent AOSP $REPO_PROJECT;
4.3.3 将Codebase的代码push到Gerrit服务器​
repo forall -c 'echo $REPO_PROJECT; git push
ssh://account@IP:29418/$REPO_PROJECT +refs/heads/* +refs/tags/*

Part 05  生成和定制manifest  

5.1clone一份platform/manifest仓库的代码

git clone "ssh://account@IP:29418/platform/manifest" && scp -p -P 29418 account@IP:hooks/commit-msg "manifest/.git/hooks/

5.2 将仓库中的manifest复制一份,并重命名

一定要设置review字段,否则repo sync后的代码不会产生change id

如果要增加自己特有的仓库,则增加一个project节点,并配置name,path和revision即可,最后将新的xml文件提交到gerrit服务器,完成review后merge到远程仓库。

Part 06  下载和上传代码 

repo init -u ssh://account@IP:29418/platform/manifest.git -b branch_name --repo-url=ssh://account@IP:29418/repo.git -m mymanifest.xml
repo sync -j4

Part 07  仓库权限配置  

详细说明可以参考:

https://gerrit-documentation.storage.googleapis.com/Documentation/3.5.0/access-control.htm
配置中,需要根据实际情况进行修改,不同组对不同仓库具有不同的访问权限,切记不要开放对refs/*的push权限,否则开发人员可以跳过Gerrit,直接push到git服务器。​

有关如何用Gerrit管理你的Android代码?的更多相关文章

  1. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

  2. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  3. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  4. ruby-on-rails - 浏览 Ruby 源代码 - 2

    我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru

  5. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  6. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  7. ruby-on-rails - 获取 inf-ruby 以使用 ruby​​ 版本管理器 (rvm) - 2

    我安装了ruby​​版本管理器,并将RVM安装的ruby​​实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby​​。有没有办法让emacs像shell一样尊重ruby​​的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el

  8. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

  9. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  10. 程序员如何提高代码能力? - 2

    前言作为一名程序员,自己的本质工作就是做程序开发,那么程序开发的时候最直接的体现就是代码,检验一个程序员技术水平的一个核心环节就是开发时候的代码能力。众所周知,程序开发的水平提升是一个循序渐进的过程,每一位程序员都是从“菜鸟”变成“大神”的,所以程序员在程序开发过程中的代码能力也是根据平时开发中的业务实践来积累和提升的。提高代码能力核心要素程序员要想提高自身代码能力,尤其是新晋程序员的代码能力有很大的提升空间的时候,需要针对性的去提高自己的代码能力。提高代码能力其实有几个比较关键的点,只要把握住这些方面,就能很好的、快速的提高自己的一部分代码能力。1、多去阅读开源项目,如有机会可以亲自参与开源

随机推荐