GitLab 是一個使用使用Ruby on Rails搭建的,用於倉庫管理系統的開源項目。使用Git做爲代碼管理工具,並在此基礎上搭建起來的web服務java
a) Install and configure the necessary dependenciespython
If you install Postfix to send email please select 'Internet Site' during setup. Instead of using Postfix you can also use Sendmail or configure a custom SMTP server. If you wish to use Exim, please configure it as an SMTP server.linux
On Centos 6 and 7, the commands below will also open HTTP and SSH access in the system firewall.nginx
sudo apt-get install curl openssh-server ca-certificates postfixgit
b) Add the GitLab package server and install the package.web
Curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh|sudo bashshell
sudo apt-get install gitlab-eevim
If you are not comfortable installing the repository through a piped script, you can find the entire script here.bash
Alternatively you can select and download the package manually and install using服務器
下載deb包
https://packages.gitlab.com/gitlab/gitlab-ee
安裝deb包
sudo dpkg -i gitlab-ee_8.1.2-ee.0_amd64.deb
c) 1.1.2.3. Configure and start GitLab
sudo gitlab-ctl reconfigure
d) 1.1.2.4. Browse to the hostname and login
http://10.24.6.8:80
Username: root
Password: 5iveL!fe
e) 2.1.6. Upload your license(EE版本須要認證)
Go to Admin > License and upload your .gitlab-license file.
Don't have a license yet? Get a subscription.
建立test 項目
前面咱們在Gitlab上搭建了一個 test的工程,普通用戶是沒有辦法去 push 的,只能使用 git review 命令提交. 而 git review 命令須要 .gitreview 文件存在於項目目錄裏。
須要安裝git-review, readline
Apt-get install git-review
Linux :pip install readline
Windows:pip install pyreadline
.gitreview
文件a) 拷貝gitlab的test項目
gerrit@gerrit:~/cfg$ git init cfg
gerrit@gerrit:~/cfg$ git init cfg
gerrit@gerrit:~/cfg/cfg$ git config --global user.name 'root'
gerrit@gerrit:~/cfg/cfg$ git config --global user.email xxxxxxxx@qq.com
gerrit@gerrit:~/cfg/cfg$ git clone http://10.24.6.8/root/test.git
gerrit@gerrit:~/cfg/cfg$ cd test/
b) 添加gitreview文件
gerrit@gerrit:~/cfg/cfg/test$ vim .gitreview
文件內容爲:
c) 上傳gitreview文件
gerrit@gerrit:~/cfg/cfg/test$ git add .gitreview
gerrit@gerrit:~/cfg/cfg/test$ git commit .gitreview -m 'add .gitreview file by admin.'
gerrit@gerrit:~/cfg/cfg/test$ git push origin master
以admin帳戶登陸建立帳戶
a) Su 進入linux對應帳戶
b) 建立sshkey
$ sudo -u gerrit -H ls /home/gerrit/.ssh
$ sudo -u gerrit -H ssh-keygen -C xxxxxx@qq.com
郵箱爲gitlab的帳戶註冊郵箱
c) 獲取ssh pub key
$ sudo -u gerrit -H cat /home/gerrit/.ssh/id_rsa.pub
d) 登陸新建立用戶設置SSH Keys
a) 針對某次提交進行評論
b) 負責人設置master/release分支受保護,只有負責人能夠提交,其餘人不能push
Branch protected總開關
項目分支開關
c) 沒被容許提交的用戶沒法提交
d) GitLab提交合並請求給負責人
同時發送郵件給該負責人,讓他知道有人要合併分支
e) 負責人接收到合併請求
f) 接受合併
使用Gitlab一鍵安裝包安裝Gitlab很是簡單, 一樣的備份恢復與遷移也很是簡單. 使用一條命令便可建立完整的Gitlab備份:
gitlab-rake gitlab:
backup:create
使用以上命令會在/var/opt/gitlab/backups
目錄下建立一個名稱相似爲1393513186_gitlab_backup.tar
的壓縮包, 這個壓縮包就是Gitlab整個的完整部分, 其中開頭的1393513186
是備份建立的日期.
你也能夠經過修改/etc/gitlab/gitlab.rb
來修改默認存放備份文件的目錄:
gitlab_rails['backup_path'] = '/mnt/backups'
/mnt/backups
修改成你想存放備份的目錄便可, 修改完成以後使用gitlab-ctl reconfigure
命令重載配置文件便可.
也能夠經過crontab使用備份命令實現自動備份:
sudo su -
crontab -e
加入如下, 實現天天凌晨2點進行一次自動備份:
0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create
一樣, Gitlab的從備份恢復也很是簡單:
#中止相關數據鏈接服務
stop unicorn gitlab-ctl
gitlab-ctl stop sidekiq
# 從1393513186編號備份中恢復
gitlab-rake gitlab:backup:restore BACKUP=1393513186
# 啓動Gitlab
sudo gitlab-ctl start
遷移如同備份與恢復的步驟同樣, 只須要將老服務器/var/opt/gitlab/backups目錄下的備份文件拷貝到新服務器上的/var/opt/gitlab/backups便可(若是你沒修改過默認備份目錄的話). 可是須要注意的是新服務器上的Gitlab的版本必須與建立備份時的Gitlab版 本號相同. 好比新服務器安裝的是最新的7.60版本的Gitlab, 那麼遷移以前, 最好將老服務器的Gitlab 升級爲7.60在進行備份.
最新版本的Gitlab已經修復了HTTPS設備的BUG, 如今使用官方HTTPS配置便可輕鬆啓用HTTPS.
a) Your configuration specifies to merge with the ref 'master'
緣由:這多是 TortoiseGit 當前版本的一個 BUG
解決:
gerrit的工做模式是全部真正的merge由gerrit負責,咱們的提交只是提交給了gerrit,gerrit會通知項目的負責人來審覈代碼,同時也會調用一些自動化測試構建工具來檢查代碼是否符合要求,只有都經過後纔會的合併進主幹代碼。因此能夠把gerrit當作是代碼和提交者之間的一道門。
a) Jdk安裝
安裝最新版本Oracle JRE/JDK,使用PPA(personal package archieve)WEBUPD8的方式安裝。
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
若是你正在使用OPenJDK,那麼先將它移除以避免產生任何的衝突
sudo apt-get remove --purge openjdk*
而後使用下面的命令安裝Oracle Java 7
sudo apt-get install oracle-java7-installer
b) 添加gerrit用戶
adduser gerrit
c) 創建存放代碼的目錄
mkdir /home/gerrit/gerrit_dir/
d) 安裝git
sudo apt-get install git
e) 安裝
sudo java -jar gerrit-2.11.4.war init -d /home/gerrit/gerrit_dir/
一路按回車,先以默認方式安裝,以後再手動修改配置文件。
f) 配置gerrit
vim review_site/etc/gerrit.config
g) NGINX 安裝
sudo apt-get install nginx
h) NGINX 配置
查看/etc/nginx/nginx.conf配置文件讀取那些sites配置文件
發現這裏只include /etc/nginx/sites-enabled裏面的文件
在/etc/nginx/sites-enabled新增一個端口映射虛擬服務器文件gitlab
配置nginx端口映射,8082映射到gerrit的8081端口
i) 服務重啓
如下模擬admin帳戶建立
a) NGINX 帳戶訪問:建立 htpasswd.conf 文件,並添加 admin 用戶、密碼到文件中
# touch /etc/gerrit_account/htpasswd.conf
# htpasswd /etc/gerrit_account/htpasswd.conf admin
默認第一個登陸 Gerrit 的用戶是 Admin。
b) 郵箱驗證
註冊郵箱,並添加對應密鑰
c) 帳戶登錄
默認第一個登陸 Gerrit 的用戶是 Admin。
a) 建立test項目
b) 使用gitlab的 gerrit身份從gitlab克隆 test項目
注意:gerrit的ssh key須要同時能登錄gitlab和gerrit)
$ cd /home/gerrit/gerrit_dir
$ rm -rf test.git
$ git clone --bare git@10.24.6.8:root/test.git
同步 Gerrit 的test項目到 Gitlab 上的test項目
當用戶 git review 後,代碼經過 jenkins 測試、人工 review 後,代碼只是 merge 到了 Gerrit 的 test-project1 項目中,並無 merge 到 Gitlab 的 test 項目中,因此須要當 Gerrit test項目倉庫有變化時自動同步到 Gitlab 的 test項目倉庫中。Gerrit 自帶一個 Replication 功能,同時咱們在安裝 Gerrit 時候默認安裝了這個 Plugin。如今只須要添加一個 replication.config 給 Gerrit
a) 進入gerrit代碼存放目錄gerrit_dir,增長replication.config
gerrit@gerrit:~/gerrit_dir$ vim etc/replication.config
文件內容爲:
[remote "test"]
projects = test
url = git@10.24.6.8:root/test.git
push = +refs/heads/*:refs/heads/*
push = +refs/tags/*:refs/tags/*
push = +refs/changes/*:refs/changes/*
threads = 3
b) 設置gerrit用戶的 ~/.ssh/config
文件內容爲:
Host 10.24.6.8:
IdentityFile ~/.ssh/id_rsa
PreferredAuthentications publickey
c) 在gerrit用戶的~/.ssh/known_hosts 中,給 10.24.6.8(gitlab) 添加 rsa 密鑰
gerrit@gerrit:~/gerrit_dir$ sh -c "ssh-keyscan -t rsa 10.24.6.8 >> /home/gerrit/.ssh/known_hosts"
gerrit@gerrit:~/gerrit_dir$ sh -c "ssh-keygen -H -f /home/gerrit/.ssh/known_hosts"
d) 從新啓動 Gerrit 服務
gerrit@gerrit:~/gerrit_dir$ ./bin/gerrit.sh restart
e) Gerrit 的自動功能配置完畢
在 gerrit 文檔中有一個 ${name} 變量用來複制 Gerrit 的全部項目,這裏並不須要。若是有多個項目須要複製,則在 replication.config 中添加多個 [remote ….] 字段便可。務必按照上面步驟配置複製功能。
a) 建立用戶jenkins
$ sudo -u gerrit -H htpasswd /home/gerrit_account/htpasswd.conf Jenkins
b)
用jenkins用戶登陸Gerrit更新郵箱xxxxxxx@qq.com並驗證
c) 建立jenkins密鑰
$ sudo ssh-keygen -C xxxxxx@qq.com
d) 用jenkins用戶登陸Gerrit服務器,更新SSH公鑰
獲取公鑰
$ sudo -u jenkins -H cat /home/jenkins/.ssh/id_rsa.pub
e) Gerrit 的 ‘Stream Events’配置
管理員登陸gerrit
Projects->List->All-Projects
Projects->Access
Global Capabilities->Stream Events 點擊 Non-Interactive Users
添加 Jenkins@zjc.com 用戶到 ‘Non-Interactive Users’ 組
Verified功能,就是利用jenkins肯定gerrit提交的代碼是否有問題,須要jenkins給個確認
a) 若是安裝Gerrit時沒有或者沒有選擇添加Verified標籤功能[‘lable Verified’],須要本身添加
gerrit@gerrit:~$ cd cfg/
gerrit@gerrit:~/cfg$git config --global user.name "admin"
gerrit@gerrit:~/cfg$git config --global user.email "423884230@qq.com"
gerrit@gerrit:~/cfg$git remote add origin ssh://admin@10.24.6.12:29418/All-Projects
gerrit@gerrit:~/cfg$ git pull origin refs/meta/config
gerrit@gerrit:~/cfg$ vim project.config
在文件末添加
[label "Verified"]
function = MaxWithBlock
value = -1 Fails
value = 0 No score
value = +1 Verified
gerrit@gerrit:~/cfg$ git commit -a -m "Update permissions"
gerrit@gerrit:~/cfg$ git push origin HEAD:refs/meta/config
gerrit@gerrit:~$ rm -rf cfg/
b) Verified 功能設置
如今提交的 Review 請求只有 Code Rivew 審覈,咱們要求的是須要 Jenkins 的 Verified 和 Code Review 雙重保障,在 Projects 的 Access 欄裏,針對 Reference: refs/heads/ 項添加 Verified 功能:
l Projects -> List -> All-Projects
l Projects -> Access -> Edit -> 找到 Reference: refs/heads/* 項
l -> Add Permission -> Label Verified -> Group Name 裏輸入 Non-Interactive Users -> 回車 或者 點擊Add 按鈕 -> 在最下面點擊 Save Changes 保存更改
若是想 Gitlab 上建立的項目使用 Gerrit 的 Code Review 功能,兩個系統的用戶必須統一,也就是說無論哪一個用戶使用 Gerrit,前提是這個用戶在 Gitlab 和 Gerrit 上都已註冊,郵箱一致、sshkey 一致。
重裝java -jar gerrit.war init -d /home/gerrit/gerrit_dir
注意:若是從新初始化了gerrit,而且版本庫路徑與之前的同樣,記得刪除版本看路徑下的All-projects.git 這個目錄, 否則第一個用戶登陸失敗,沒法獲取超級管理員權限
問題緣由:因爲版本庫下有子目錄,經過nginx代理是指定的目錄不正確致使 把 proxy_pass http://192.168.0.122:8090/; 改成 proxy_pass http://192.168.0.122:8090; ##不要最後的斜槓
注意:郵箱驗證的時候,使用nginx提供的端口進入,不要直接使用gerrit的端口進入驗證
測試這裏是使用8082端口,不要訪問8081端口
Jenkins是一個開源軟件項目,旨在提供一個開放易用的軟件平臺,使軟件的持續集成變成可能。
a) Install Jenkins
wget -q -O - https://jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins
b) Starting Jenkins
sudo nohup java -jar /usr/share/jenkins/jenkins.war > /var/log/jenkins_log 2>&1 &
c) 開啓
http://xxxxx:8080/
d) 插件安裝
Git Plugin
SSH Plugin
URL Trigger Plugin
Gerrit Trigger Plugin
e) 註冊用戶
先開啓用戶註冊按鈕,用戶註冊完畢之後,關閉用戶註冊
Gerrit Trigger
a) 安裝gerrit triggle插件
Gerrit Triggle 配置文檔https://wiki.jenkins-ci.org/display/JENKINS/Gerrit+Trigger
b) 設置Gerrit Trigger
主頁面->Manage Jenkins->Gerrit Trigger->Add New Server
Add New Server : Check4Gerrit
勾選 Gerrit Server With Default Configurations
c) 填寫gerrit的jenkins帳戶信息,並測試
若是點擊Test Connection後出現如圖所示的錯誤User jenkins has no capability to connect to Gerrit event stream.,這是由於因Jenkins 沒有權限監聽 ,參考Gerrit 的 ‘Stream Events’配置
d) Gerrit Triggle設置成功
e) Gerrit Triggle重啓保證狀態正常
只要gerrit有提交代碼,jenkins都能檢測到,並verified代碼正確性,而後把結果告訴gerrit
a) Jenkins上建立test項目
用 jenkins 登陸http://10.24.6.12:8080/
b) Git頁面設置
參考文檔https://wiki.jenkins-ci.org/display/JENKINS/Gerrit+Trigger
c) Build頁面設置
Add build step -> Execute shell
cd $WORKSPACE
[ ! -e .testrepository ] && testr init
testr run
此處測試代碼可依據項目狀況而定,可爲空
郵件發送測試
須要安裝git-review, readline
Apt-get install git-review
Linux :pip install readline
Windows:pip install pyreadline
a) 下載項目
git clone http://10.24.6.8/root/test.git
cd test
b) 設置添加change_id鉤子
增長一個hook, 自動增長chang_id到提交日誌裏面,必須
gitdir=$(git rev-parse --git-dir); scp -p -P 29418 test1@10.24.6.12:hooks/commit-msg ${gitdir}/hooks/
c) 改變代碼:
vim t99.txt
d) 上傳代碼:
git add .
注意使用amend進行提交changid
git commit –amend
e) 在gerrit上看到提交
f) Jenkins 自動獲取提交信息並判斷是否verified
g) 在gerrit上添加review成員
h) REVIEW成員收到郵件
i) REVIEW 人員登錄處理
j) admin點擊CodeReview2
k) Jenkins自動點擊,而後submit
l) GitLab 顯示commit記錄
m) 郵件通知REVIEW人員說明
n) REVIEW 提交者收到消息
a) 設置git提交的默認編輯器爲vim
If you want to set the editor only for Git, do either (you don’t need both):
b) missing Change-Id in commit message footer
須要安裝插件,並使用git commit –amend提交代碼,看截圖部分
c) GIT REVIEW remote rejected for change closed
remote: Processing changes: refs: 1, done
To ssh://xxxxx@gerrit.dev.xxxxx.net:29418/xxxxxx
! [remote rejected] HEAD -> refs/for/master (change 14823 closed)
error: failed to push some refs to 'ssh://xxxxx@gerrit.dev.xxxxx.net:29418/xxxxxx'
緣由是註釋和以前提交的同樣,而且已經被closed
使用git commit –amend修改註釋
d) git rebase –continue Bug for need merge
例如衝突文件爲foo.c
使用git-svn rebase獲取svn服務器上的最新文件,致使衝突,
不過此時svn版本信息已經添加到本地git庫中(經過git log能夠查看)
打開foo.c,修改代碼,解決衝突;
執行git rebase --continue,git提示我:
You must edit all merge conflicts and then
mark them as resolved using git add
執行git add foo.c,告知git已完成衝突解決;
再次執行git rebase --continue,提示"Applying: git v1",此時"git v1"版本又一次成功加入本地版本庫,你可經過git log查看;
執行git-svn dcommit將foo.c的改動同步到svn中心庫,到此算是完成一次衝突解決。
git比較智能,會提示你解決問題的方法,因此遇到問題時注意看提示文檔。
2015-12-09 11:13:03