Android服务器搭建Git+Repo+Gerrit

  • 安装配置
    • 名词解释
    • 安装必要软件
          • 1、 安装所需软件(S)
          • 2、安装配置gisosis
  • 搭建repo服务器

安装配置

名词解释

S:服务器端(Server)
C:客户端(Client)

安装必要软件

1、 安装所需软件(S)

sudo apt-get install git-core openssh-server openssh-client
初次使用git,记得配置用户信息
$ git config --global user.name “John Doe”
$ git config --global user.email johndoe@example.com

2、安装配置gisosis

2.1、下载gitosis(S)
mkdir ~/gitosis_setup
cd ~/gitosis_setup
git clone https://github.com/res0nat0r/gitosis.git
2.2、安装gitosis(S)
cd gitosis
sudo python setup.py install
注意:如果python setup.py install失败,需要安装python-setuptools.py
sudo apt-get install python-setuptools
2.3、为gitosis创建系统用户(S)
sudo adduser --system --shell /bin/sh --gecos ‘git SCM user’ --group --disabled-password --home /home/git git
这种方法是网上比较常见的方法,创建的是一个禁用密码的git用户,但在使用su命令切换git用户的时候,空密码老是
验证失败,建议大家可以使用下面的方法来创建git用户:
sudo useradd -m git
sudo passwd git
之前设置无密码时,clone时总要我输密码。

2.4、创建配置gitosis管理员©
(1)将管理员生成的公钥(即B)上传或拷贝到服务器(即A)上。这里的公钥需要在git服务器管理员(B)下使用ssh-keygen -t rsa命令来创建
2.4.1、生成admin端的公钥©
ssh-keygen -t rsa
根据提示输入一些信息之后,会在/home/admin/.ssh/下生成id_rsa.pub,如下图:
然后将id_rsa.pub拷贝到服务器(S)的tmp目录下:
scp ~/.ssh/id_rsa.pub likai@192.168.1.252:/tmp/id_rsa_admin.pub

2.4.2、执行gitosis-init(S)
进入到拷贝过来的id_rsa.pub所在目录:cd /tmp
sudo chmod 777 id_rsa.pub
sudo -H -u git gitosis-init < id_rsa.pub
sudo chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update
至此,gitosis的安装工作已完成,其相关配置可以由管理员(B)来操作,然后再提交到服务器上。

2.4.3、然后在客户端©从服务器(S)克隆gitosis-admin.git
此操作在客户端完成
mkdir -p ~/git/
cd ~/git/
git clone git@192.168.1.252:gitosis-admin.git
cd gitosis-admin.git

其中,gitosis.conf是gitosis的配置文件,用于配置用户和用户所拥有的权限,keydir是所有组成员的公钥。如果要添加用户,则根据2.4.1章节生成其公钥拷贝到keydir目录下,查看gitosis.conf配置文件如下:(这里要注意下,如果conf文件有任何改动记得同步到远程仓库,否则后面会出现权限不够,导致克隆失败git add gitosis.conf git commit -m “modify gitosis.conf” gitosis.conf git push origin master)

gitosis-admin指示管理员用户组,有用户hanmeng@likai-System,其可以读写gitosis-admin和manifest仓库。manifest后面介绍。
至此,gitosis配置完成,后面介绍如何添加组成员。

3.编辑gitosis.conf(配置gitosis信息)
cd gitosis-admin
你将看到以下文件gitosis.conf和keydir/,gitosis.conf是gitosis的配置文件,用于配置用户和权限,keydir/是所有组成员的公钥。
vi gitosis.conf, 打开gitosis.conf文件,内容为:
[group gitosis-admin]
writable = gitosis-admin
members = asus-wh@asus ##这里的asus-wh@asusr就相当于B的名片,与B的id_rsa.pub中的内容一致,红框中内容
这个是[group gitosis-admin]管理组的权限,members中的用户名就是刚才上传的公钥里面的用户名。
把内容修改为:
[group gitosis-admin]
writable = gitosis-admin
members = asus-wh@asus
[group apps ]
writable = apps
members = asus-wh@asus c-user

这里的c-user其实就是电脑C的名片,同样也需要C的公钥。

这里定义了一个叫apps 的组,这个apps与后来建立的仓库名对应,授予asus-wh@asus和 c-user两个用户写“apps ”这个repo的权限

然后push到服务端后,服务器端就立刻生效。
git commit -a -m “created a new repository”
git push
这样就 更新了服务端的权限。

4.在test目录下创建一个apps的repo
mkdir apps
cd apps
git init

5.加点东西测试
echo “hello” >1.txt (在apps目录下下创建一个内容为hello的1.txt文件)
6. 提交代码
git remote add origin git@192.168.1.1:apps.git
git add .
git commit -am “imitial import”
git push origin master:refs/heads/master

7.增加成员的公钥到系统中
这里就是把C(192.168.1.3)的公钥加进来拷贝到gitosis-admin/keydir目录下
会发现这里面已经有一个公钥了,就是B的公钥,C生成的公钥是id_rsa.pub,避免重复,建议将其重名为
c-user.pub,这个‘c-user’与之前的它的公钥最后那部分内容相同,跟之前的B的“asus-wh@asus”类似。
cd gitosis-admin
git add keydir/c-user.pub

修改gitosis.conf,并提交

[group apps ]
writable = apps
members = asus-wh@asus c-user ##这个c-user与前面c的公钥命名要相同
git commit -a -m “Granted new members commit rights to apps”
git push
8.其它成员获取apps的代码
git clone git@192.168.1.1:apps.git

搭建repo服务器

1、 配置repo
1.1、下载git-repo.git©(这里需要能)
mkdir -p ~/gitCfg
cd ~/gitCfg
git clone https://gerrit-googlesource.lug.ustc.edu.cn/git-repo
1.2、配置repo©
1.2.1、将git-repo.git目录下的repo拷贝到/usr/bin下面:
cd git-repo
sudo cp repo /usr/bin/repo
1.2.2、修改repo
vim /usr/bin/repo
修改
REPO_URL = ‘https://gerrit.googlesource.com/git-repo’
REPO_REV = ‘stable’

REPO_URL = ‘/root/gitCfg/git-repo.git’
REPO_REV = ‘master’

2、 创建版本根目录(S)
进入repositories初始化manifest仓库,这里最好是用git用户来,或者记得更改manifest.git的所属主组。
cd repositories
git init --bare manifest.git

sudo apt-get install git-daemon-sysvinit

3、 配置default.xml文件©
default.xml是repo用来管理多个git仓库的。
3.1、克隆manifest.git
这里可能会因为权限问题导致克隆失败,需要在gitosis.conf中writable值加上manifest
并,同步到远程服务器端
mkdir ~/repo
cd ~/repo
git clone git@192.168.1.252:manifest.git
###clone这一步能成当然是很好,不成的话试试这个git clone git://192.168.1.1/manifest.git

3.2、配置default.xml

这里配置如下:(创建三个测试仓库:project1、project2、project3)





将default.xml保存push到远程仓库:
git add –all
git commit -a -m “add default.xml”
git push --all

如果上面推送报错,请检查远程仓库manifest的所属主组

4.建立测试仓库(S)
cd /home/git/repositories/
git init --bare project1.git
git init --bare project2.git
git init --bare project3.git

修改仓库的文件属性:
sudo chmod 777 -R /home/git/repositories/project1.git project2.git project3.git
上传代码到仓库©
cd /home/git/repositories/ (这个路径是灵活的,我使用的~/repo路径)
git clone git@192.168.1.252:project1.git
git clone git@192.168.1.252:project2.git
git clone git@192.168.1.252:project3.git

git clone git://192.168.27.139/project1.git

当有代码更改是一定要记得先同步到远程仓库,要不然下面repo sync时会报错
注意:这里如果克隆失败请在gitosis.conf写入下图,并同步到远程目录,否则不生效

然后在对应仓库添加代码,并推送到远程服务器

测试repo服务器
mkdir ~/repotest
cd ~/repotest
repo init -u git@192.168.1.252:manifest.git
主要:或试试repo init -u git://192.168.1.117/manifest.git
repo sync
此处如果同步不下来 1.检查gitosis.conf 中是否配置 2.检查default.xml 3.是否在git目录下init 创建 4.将project1.git文件clone 下来提交操作一次
这样就会根据default.xml配置的project拉下来三个代码仓库。
最后去客户机C(192.168.1.3)测试下
C:
安装 Repo
mkdir ~/bin
PATH=~/bin:$PATH
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
chmod a+x ~/bin/repo
修改repo文件内容中的 export REPO_URL=‘https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/’
这一切都是为了让你能够舒适的使用repo
开始刺激的测试:
创建一个测试目录
mkdir test
cd test
repo init -u git://192.168.1.117/manifest.git
repo sync
只需要这两行就会把我们的之前的项目apps同步到test目录下。

Gerrit搭建
https://blog.csdn.net/twilightdream/article/details/72953282
1、 安装apache2服务器
sudo apt-get install --reinstall apache2
2、 建立gerrit账户(S)
sudo adduser gerrit
sudo passwd gerrit
su gerrit

2.配置java环境
oracle官网下载对应平台的jdk并安装,这里我下载:jdk-7u45-linux-i586.tar.gz
使用下面命令安装:
sudo tar zxvf ./jdk-7u45-linux-i586.tar.gz -C /opt
vim ~/.bashrc sudo vim /etc/profile
添加如下内容:
JAVA_HOME=/opt/jdk1.8.0_191
export JRE_HOME= J A V A H O M E / j r e e x p o r t C L A S S P A T H = JAVA_HOME/jre export CLASSPATH= JAVAHOME/jreexportCLASSPATH=JAVA_HOME/lib: J R E H O M E / l i b : JRE_HOME/lib: JREHOME/lib:CLASSPATH
export PATH= J A V A H O M E / b i n : JAVA_HOME/bin: JAVAHOME/bin:JRE_HOME/bin:$PATH
wq保存后,记得source一下

3下载gerrit(S)
这里我直接在百度搜的某个固定版本,gerrit的war包,通常包名为gerrit-xxx.war
,xxx为版本号,这里我下载gerrit-2.11.war
4 安装gerrit
java -jar gerrit-2.15.3.war init -d review_site
以下不使用代理 可以配置
Behind reverse proxy [y/N]? n
auth type = DEVELOPMENT_BECOME_ANY_ACCOUNT
其他默认
Installing plugins.
Install plugin commit-message-length-validator version v2.15.3 [y/N]? y
Installed commit-message-length-validator v2.15.3
Install plugin download-commands version v2.15.3 [y/N]? y
Installed download-commands v2.15.3
Install plugin hooks version v2.15.3 [y/N]? y
Installed hooks v2.15.3
Install plugin replication version v2.15.3 [y/N]? y
Installed replication v2.15.3
Install plugin reviewnotes version v2.15.3 [y/N]? y
Installed reviewnotes v2.15.3
Install plugin singleusergroup version v2.15.3 [y/N]? y
Installed singleusergroup v2.15.3
Initializing plugins.
使用代理配置如下:
gerrit数据库选择默认H2
身份验证时输入http
Authentication method [openid/?]: http
这里配置反向代理,选择y
Behind reverse proxy [y/N]? y

Installing plugins.
Install plugin commit-message-length-validator version v2.15.3 [y/N]? y
Installed commit-message-length-validator v2.15.3
Install plugin download-commands version v2.15.3 [y/N]? y
Installed download-commands v2.15.3
Install plugin hooks version v2.15.3 [y/N]? y
Installed hooks v2.15.3
Install plugin replication version v2.15.3 [y/N]? y
Installed replication v2.15.3
Install plugin reviewnotes version v2.15.3 [y/N]? y
Installed reviewnotes v2.15.3
Install plugin singleusergroup version v2.15.3 [y/N]? y
Installed singleusergroup v2.15.3
Initializing plugins.

修改gerrit配置文件

vim review_site/etc/gerrit.config
修改如下
vim review_site/etc/gerrit.config
[gerrit]
basePath = git
canonicalWebUrl = http://192.168.1.252:8888/
[database]
type = h2
database = db/ReviewDB
[index]
type = LUCENE
[auth]
type = HTTP
[sendemail]
smtpServer = smtp.exmail.qq.com
smtpServerPort = 465
smtpEncryption = SSL
smtpUser = hanmeng@sykean.com
smtpPass = Sunny1214
from = hanmeng@sykean.com
[container]
user = gerrit
javaHome = /opt/jdk1.7.0_45/jre
[sshd]
listenAddress = :29418
[httpd]
listenUrl = proxy-http://
:8888/
[cache]
directory = cache

修改配置
sudo vim /etc/apache2/ports.conf
新增9999端口
. . . . . .admins
Listen 80
Listen 9999
. . . . . .
配置反向代理
sudo vim /etc/apache2/httpd.conf
ServerName gerrit.com
:9999>
ProxyRequests Off
ProxyVia Off
ProxyPreserveHost On
AllowEncodedSlashes On
RewriteEngine On
RewriteRule ^/(.) http://192.168.137.6:8888/$1 [NE,P]

        Order deny,allow        Allow from all        AuthType Basic      AuthName "Gerrit Code Review"      Require valid-user      AuthBasicProvider file      AuthUserFile /home/gerrit/review_site/etc/passwd  ProxyPass / http://192.168.137.6:8888/
主配置文件中加入httpd.conf,使其生效 sudo vim /etc/apache2/apache2.conf 加一句

Include httpd.conf
新建gerrit管理员用户,设置帐号密码

touch ./review_site/etc/passwd
htpasswd -b ./review_site/etc/passwd admin 123
(后续再添加gerrit用户可使用: $: htpasswd -b ./review_site/etc/passwd UserName PassWord )

开启一些模块
sudo a2enmod proxy
sudo a2enmod rewrite
sudo a2enmod ssl
sudo a2enmod proxy_balancer
sudo a2enmod proxy_http
启动服务
./review_site/bin/gerrit.sh restart
sudo /etc/init.d/apache2 restart
客户端可通过http://192.168.27.139:9999访问啦
gerrit网页端配置:
1:登录,浏览器输入192.168.1.252:8080回车验证身份

2:账户信息配置,点击右上角Settings

Contact Information配置全名和邮箱,全名会在界面右上角显示,邮箱用户后续操作中的提示。
添加个人公钥:客户端执行:ssh-keygen -t rsa
复制公钥内容 add进去

添加完公钥之后,可以通过:ssh -p 29418 admin@192.168.10.29(如果测试不通,请检查gerrit界面“SSH Public Keys”是否配置了公钥)来测试ssh是否可以连接,如果连接成功,那么就可以做接下来的操作了。成功提示如下:

失败情况如下,需要把客户端的公钥添加到gerrit界面“SSH Public Keys”

创建项目:
ssh -p 29418 user@localhost gerrit create-project --empty-commit --name demo-project
例如创建清单库和测试库:
ssh -p 29418 admin@192.168.1.252 gerrit create-project --empty-commit --name manifest
ssh -p 29418 admin@192.168.1.252 gerrit create-project --empty-commit --name test
这个时候可以在远程服务器的gerrit服务器的git目录下看到manifest.git和test.git两个仓库,在gerrit网页端的projects->List下也可以看到这两个仓库。
repo默认是通过清单库的default.xml来管理其他项目的,这里单独clone下manifest仓库,添加default.xml文件

上面的fetch因该是fetch=“ssh://admin@118.24.35.225:29418/”
然后推送default.xml到远程manifest仓库
git add default.xml
git commit -m “add default.xml” default.xml
git push origin HEAD:refs/for/master //这句话是推送到gerrit,可以通过管理员审核,然后合并,也就是必须等管理员审核后才能进行下面的。

网页中创建工程
clone工程后 push
git clone ssh://admin@192.168.27.139:29418/MyDemo
vim default.xml
git add .
git status
gitdir=$(git rev-parse --git-dir); scp -p -P 29418 admin@192.168.10.29:hooks/commit-msg ${gitdir}/hooks/
git commit -m ‘add’
git push origin HEAD:refs/for/master

上面的fetch因该是fetch=“ssh://admin@118.24.35.225:29418/”
然后本地创建目录,通过以下操作,同时管理多个git仓库
repo init -u ssh://fengxianglong@192.168.1.252:29418/manifest.git
//这里会在当前目录下生成.repo目录,里面会包含完整的repo和清单库
repo sync //这里会根据清单库的xml文件来同步下载xml里面的project标签定义的所以项目
这里如果有报错,请检查gitosis.conf中是否添加了客户端操作test项目的权限

上传Android代码到gerrit服务器
https://blog.csdn.net/qq_28449863/article/details/80084660
https://www.cnblogs.com/eastnapoleon/p/6595952.html

  1. 配置default.xml
    default.xml是跟Android代码配套的,可参考google Android源码下的default.xml(.repo/manifests/default.xml)进行修改。
    新建仓库android5.1/manifest.git,
    ssh -p 29418 admin@192.168.10.29 gerrit create-project –empty-commit tongxing3288/android-5.1/manifest
    ssh -p 29418 admin@192.168.10.29 gerrit create-project --empty-commit s905x/m-amlogic/platform/hardware/arm
    clone到本地,
    git clone ssh://admin@192.168.115.135 :29418/android5.1/manifest.git
    配置default.xml,(将Android源代码配套的default.xml 拷贝到clone到本地的manifest 中进行修改)
    cd manifest
    vi default.xml

name 处的android88是为了在gerrit仓库中区分 ,name对应的就是远程仓库的地址
path代表本地同步时的本地路径
上传到远程仓库,
git add .

gitdir=$(git rev-parse --git-dir); scp -p -P 29418 admin@192.168.10.29:hooks/commit-msg ${gitdir}/hooks/

git commit -m "add default.xml"

git push origin HEAD:refs/for/master

2.创建git仓库
进入Android代码目录,新建脚本文件,
vim gerrit_create.sh

shidx@Shidx:~/AOSP_Test$ cat gerrit_create.sh

LOCAL_PATH=pwd
MANIFEST_XML_FILE=$LOCAL_PATH/…/HHH/manifest/default.xml #该处是default.xml 的路径

USER_NAME=“admin”
SERVER_IP=“192.168.115.135”
SERVER_PORT=“29418”

OUTPUT_PROJECT_LIST_FILE_NAME= L O C A L P A T H / p r o j e c t l i s t n a m e O U T P U T P R O J E C T L I S T F I L E P A T H = LOCAL_PATH/project_list_name OUTPUT_PROJECT_LIST_FILE_PATH= LOCALPATH/projectlistnameOUTPUTPROJECTLISTFILEPATH=LOCAL_PATH/project_list_path

function getNameAndPath()
{
echo > $OUTPUT_PROJECT_LIST_FILE_NAME
echo > $OUTPUT_PROJECT_LIST_FILE_PATH

while read LINEdo    command_line=`echo $LINE | grep " git_projects.txt`c%%\"*}            echo "$reposity_name" >> $OUTPUT_PROJECT_LIST_FILE_NAME            echo "$reposity_path" >> $OUTPUT_PROJECT_LIST_FILE_PATH        fi    fidone  < $MANIFEST_XML_FILE

}

function creatEmptyGerritProject()
{
for i in cat $OUTPUT_PROJECT_LIST_FILE_NAME;
do
echo $i
echo “ssh -p $SERVER_PORT U S E R N A M E @ USER_NAME@ USERNAME@SERVER_IP gerrit create-project --empty-commit $i”
ssh -p $SERVER_PORT U S E R N A M E @ USER_NAME@ USERNAME@SERVER_IP gerrit create-project --empty-commit $i
done
}

function removeFiles()
{
rm -rf $LOCAL_PATH/project_list_name
rm -rf $LOCAL_PATH/project_list_path
}

getNameAndPath
creatEmptyGerritProject
removeFiles

运行脚本,创建git仓库: . gerrit_create.sh

  1. 上传代码到远程仓库

vim gerrit_push.sh

shidx@Shidx:~/AOSP_Test$ cat gerrit_push.sh
LOCAL_PATH=pwd
MANIFEST_XML_FILE=$LOCAL_PATH/…/HHH/manifest/default.xml

USER_NAME=“admin”
SERVER_IP=“192.168.115.135”
SERVER_PORT=“29418”

function pushLocalToRemote()
{

while read LINEdo    cd $LOCAL_PATH    command_line=`echo $LINE | grep "

}

pushLocalToRemote

运行脚本,push代码: . gerrit_push.sh

  1. 下载代码
    mkdir -p …/des
    cd …/des
    repo init -u ssh://admin@192.168.130.10:29418/all/manifest.git
    repo sync -f -j8

创建 default.xml 文件

1.从源码 aosp/ 找出所有 git 仓库
从厂商得到的 Android 源码 aosp/ 目录大致如下,
aosp
|- art
|- /abi
|- cpp
|- /developers
|- build
|- demos
|- samples
|- /android

因为厂商不用 Repo 管理,所以源码里也没有 manifest/default.xml 文件。
幸好,仔细查看 aosp/ 之后发现,里面有些目录下有 .git/ 目录,说明它就是一个 git 项目。因此可以通过找出所有带 .git/ 目录的目录,来确定 aosp/ 有哪些 git 项目。代码如下:
find aosp/ -type d -name ‘.git’ > git_projects.txt
最终在这份 aosp/ 共找到 531 个 git 项目。

得到 git_projects.txt 后,就可以据此创建 default.xml 文件。git_projects.txt 每一行的内容是这样的:

使用 bash 指令去掉最后开头的 S905X_0907_4G/和末尾的 /.git :
cat git_projects.txt | cut -c 15- | sed ‘s/…$//’ > path.txt
得到的内容如下:

生成 xml 文件的脚本 gen_xml.sh :
#!/bin/bash
echo -e "

<?xml hhhversion=\"1.0\" encoding=\"UTF-8\"?> " >>$1

while read line; do
echo “KaTeX parse error: Can't use function '\"' in math mode at position 5: line\̲"̲ name=\"line” />” >>$1
done
echo -e “\n” >>$1

bash 指令创建 default.xml:
cat path.txt | ./gen_xml.sh default.xml

得到的 default.xml 里, 示例如下:

tongxing3288/android-5.1/source/
%s#m-amlogic/platform#source#g

更多相关文章

  1. Android(安卓)SDK下载地址
  2. Android(安卓)Calendar一闪而过 无法创建event
  3. Android中的Environment.getExternalStorageState使用
  4. AMD windows7安装和打开genymotion、android studio遇到的问题
  5. Android(安卓)requires compiler compliance level 5.0 or 6.0.
  6. Android:安装APK包以后系统文件目录的变化
  7. Android最简单实现日夜间模式切换
  8. Pycharm安装PyQt5的详细教程
  9. NPM 和webpack 的基础使用

随机推荐

  1. spring-android的使用
  2. 安卓相对布局
  3. Android(安卓)SDK Tools Platform-tools
  4. 2010.10.28———Android(安卓)02
  5. Android(安卓)的一些比较好的开源代码项
  6. EditText的一些使用注意点
  7. [Android]Android(安卓)manifest 属性说
  8. Android百度地图相关内容汇总
  9. 【Android】FadingEdge
  10. Android(安卓)NDK应用开发