关于Gerrit的安装参考下面链接
【Android源码】Gerrit安装
要实现上传Android源码,需要经历以下几步:
- 下载Android代码
- 创建源码仓库
- 创建manifests仓库
- 上传源码
- 其他电脑下载源码
要证明Gerrit中的源码真实可用,肯定是以其他人能真正共享到代码才行,所以第5步必不可少。
1. 下载Android源码
可以参考我之前写的文章,【Android源码】AOSP下载
下面我会大致过一遍(切记,电脑的环境很重要,我以前在虚拟机上下载,问题挺多的,很烦人,后来在一台Ubuntu的服务器上下载,Android12,147G,157万个文件夹,很快就下载完了,配置很硬)
- 安装git
sudo apt install git
- 安装依赖
# 更新系统软件包
sudo apt update
# 安装必要的软件包
sudo apt install -y \
git \
curl \
wget \
unzip \
python3 \
openjdk-11-jdk \
build-essential \
zlib1g-dev \
gcc-multilib \
g++-multilib \
libc6-dev-i386 \
lib32ncurses5-dev \
x11proto-core-dev \
libx11-dev \
libgl1-mesa-dev \
libxml2-utils \
xsltproc \
unzip \
ccache \
libssl-dev \
bc
- 配置环境变量
# 编辑 .bashrc 或 .zshrc
nano ~/.bashrc # 或者 nano ~/.zshrc
# 添加以下环境变量
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export PATH=$PATH:$JAVA_HOME/bin
export USE_CCACHE=1
# 使环境变量生效
source ~/.bashrc # 或者 source ~/.zshrc
# 验证java
java --version
- 设置git身份,添加自己的邮箱和姓名
git config --global user.email "xxx@qq.com"
git config --global user.name "xxx"
- 验证Python3:// 至少要安装3.6以上
python3 --version
- 创建bin,并加入到PATH中
mkdir ~/bin
PATH=~/bin:$PATH
- 下载repo并设置权限
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
## 如果上述 URL 不可访问,可以用下面的:
# curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o ~/bin/repo
## curl -sSL 'https://gerrit-googlesource.proxy.ustclug.org/git-repo/+/master/repo?format=TEXT' |base64 -d > ~/bin/repo
chmod a+x ~/bin/repo
# 验证repo的安装
repo --version
- 初始化Android版本
# https://android.googlesource.com/platform/manifest
mkdir android12
cd android12
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-12.1.0_r1
- 下载
repo sync
...
Checking out: 100%(1052/1052), done in 10m4.919s
repo sync has finished successfully.
完成标准:1568660项 147.7G大小
2. 创建Android源码仓库
步骤:创建一个create.sh脚本,复制出project.list(来源android12源码:~/android12/.repo/project.list)
- ~/android12/.repo/project.list 这里包含了所有源码的路径
art
bionic
bootable/libbootloader
bootable/recovery
build/bazel
build/blueprint
build/make
build/pesto
build/soong
compatibility/cdd
cts
dalvik
developers/build
developers/demos
developers/samples/android
development
device/amlogic/yukawa
...
- 随便找一个路径创建create.sh脚本
cd ~/gerrit
touch create.sh
nano create.sh
脚本内容如下:
#!/bin/bash
USER_NAME="admin"
SERVER_IP="10.168.10.140"
SERVER_PORT="29418"
# PROJECT_DIR="aosp"
# 路径要改成自己的ssh的路径
SSH_KEY="/home/xx/.ssh/id_rsa"
eval $(ssh-agent -s)
ssh-add $SSH_KEY
echo "SSH_AGENT_PID=$SSH_AGENT_PID"
echo "SSH_AUTH_SOCK=$SSH_AUTH_SOCK"
function creatEmptyGerritProject()
{
for i in `cat project.list`;
do
echo $i
echo "ssh -p $SERVER_PORT $USER_NAME@$SERVER_IP gerrit create-project --empty-commit $i"
ssh -p $SERVER_PORT $USER_NAME@$SERVER_IP gerrit create-project --empty-commit $i
done
}
creatEmptyGerritProject
kill $SSH_AGENT_PID
解释一下:
- USER_NAME : 这里是来源自己Gerrit创建的账户,我的是admin。
- SERVER_IP: 是Gerrit服务器地址。
- PROJECT_DIR : 很多人提供的脚本设置了项目名,我发现在,google原生代码里并没有设置这个。所以我也删掉了(其实是后面吃亏了,才重新修改了这个地方)
- SSH_KEY: 可以设置,也可以不用设置,因为我一开始代码无法连接Gerrit服务器,是由于SSH的问题,所以做了设置,如果你本身不存在这个问题,可以删掉如下脚本
# 路径要改成自己的ssh的路径
SSH_KEY="/home/xx/.ssh/id_rsa"
eval $(ssh-agent -s)
ssh-add $SSH_KEY
- cat project.list:将project.list和放入同一路径下执行脚本。
ssh -p $SERVER_PORT $USER_NAME@$SERVER_IP gerrit create-project --empty-commit $i
这句是核心脚本,其实就是将project.list中的路径一条条取出来,然后创建Gerrit仓库。- 最后运行
sudo ./create.sh
启动脚本,等待创建成功就行。 - 成功标志是:在Gerrit Web中能看到创建了上百个仓库。
3. 创建manifests仓库
第2步创建了所有关于源码的仓库。但是,那是上千个仓库,如果我们其他电脑需要下载这些仓库,不可能单独每个都去git clone一次。所以需要创建manifests仓库,统一管理所有的库。
cd ~/gerrit
# 创建manifests仓库
$ ssh -p 29418 admin@10.168.10.140 gerrit create-project --empty-commit aosp/manifests
# 创建成功可以在Gerrit服务器中找到这个仓库
# 然后下拉aosp/manifests代码
$ git clone ssh://admin@10.168.10.140:29418/aosp/manifests
通过上面几步,可以看到创建了一个manifests文件夹。
-
复制~/android12/.repo/manifests/default.xml 到 manifests路径下
-
修改default.xml
-
一定需要修改default.xml文件,因为这份default.xml是Google原生提供的,但我们Gerrit服务器的路径并不是一致的,分支也不一样(网上有很多关于default.xml的上传,但并没有人说过要改,要怎么改,我没找到)。
-
tag的修改,默认的如下
<default revision="refs/tags/android-12.1.0_r1" remote="aosp" sync-j="4" />
我并没有创建"refs/tags/android-12.1.0_r1"的tag,所以我改成了master
-
default.xml中包含大量的
<project path="art" name="platform/art" groups="pdk" />
后面全局下载的是时候,其实我们并没有这种"platform/art",包含"platform"路径的仓库。所以需要全局删掉name中的platform
-
还有配置中包含name和path不一致的情况,全部按照path的内容,将name修改掉,可以自己写一个python脚本来实现(不会的自行百度)。
-
-
最后提交代码
git add .
git commit -m "add default.xml"
git push origin master
最后验证:可以通过查看Gerrit Web上的提交日志, 也可以自己把代码拉取下来看看就知道了。
4. 上传源码
这一步就到了上传~/android12中的所有源码了。
创建uploadAosp.sh脚本
cd ~/android12
touch uploadAosp.sh
内容如下
#!/bin/bash
USER_NAME="admin"
SERVER_IP="10.168.10.140"
SERVER_PORT="29418"
#PROJECT_DIR="aosp"
echo "SSH_AGENT_PID=$SSH_AGENT_PID"
echo "SSH_AUTH_SOCK=$SSH_AUTH_SOCK"
function pushGerritProject()
{
file="./.repo/project.list"
lines=`cat $file | wc -l`
for ((i=1;i<=$lines;i++))
do
line=`awk 'NR=="'$i'"{print $0}' $file`
cd $line
echo `pwd`
rm -rf .git
git init
git remote add origin ssh://$USER_NAME@$SERVER_IP:$SERVER_PORT/$line.git
git pull origin master
git add -A .
git commit -am "init commit"
git push origin master
cd -
done
}
pushGerritProject
- 如果在上传的过程中遇到权限问题,可能是因为Gerrit SSH导致的,按照第二步新增ssh-add的代码
- 正常的日志很清楚的,自己一看就知道,出错的话,也会很明显的提示,解决错误就好了。
- 成功截图
- 我看了下,android12的文件情况(2209660项,176.7GB大小),这还是没有编译的情况,所以做这事之前,一定要考虑清楚自己电脑的情况
5. 其他电脑下载源码
以前都是通过repo cync在google的Gerrit服务器上下载代码,这步就是通过我们自己的Gerrit服务器来下载Android12的源码了。
准备一台Ubuntu20的系统,可以是虚拟机。首先登录到Gerrit Web端,可以通过ip访问,创建一个自己本地的账户,我的是mygerrit。
- 首先要创建这台Ubuntu系统的ssh key
ssh-keygen -t rsa -b 4096 -C "demo@163.com"
邮箱改成自己的。
2. 复制~/.ssh/id_rsa.pub中的内容,并导入到Gerrit–>Setting—>SSH Keys中
3. 验证是否导入成功
ssh -p 29418 mygerrit@10.168.10.140
# 输出如下内容表示成功
**** Welcome to Gerrit Code Review ****
Hi hmanvm, you have successfully connected over SSH.
Unfortunately, interactive shells are disabled.
To clone a hosted Git repository, use:
git clone ssh://hmanvm@10.168.10.140:29418/REPOSITORY_NAME.git
Connection to 10.168.10.140 closed.
我遇到的问题,基本上是ssh没设置成功,导致没有拉取代码的权限,还有就是第三步中的default.xml配置出问题,导致耽搁时间了。有时需要ssh-add id_rsa来将ssh导入进去。
4. 拉取Gerrit中的源码
mkdir ~/android12
cd ~/android12
# 初始化manifests库, 第三步创建的manifests库这里用到了
repo init -u ssh://mygerrit@10.168.10.140:29418/aosp/manifests
# 最后同步
repo sync
剩下的就是等待了。