gitlab+gerrit+jenkins持續集成框架

1.持續集成之gitlab+gerrit+jenkins

1.1. GitLab

1.1.1. 簡介

  GitLab 是一個使用使用Ruby on Rails搭建的,用於倉庫管理系統的開源項目。使用Git做爲代碼管理工具,並在此基礎上搭建起來的web服務java

1.1.2. 環境搭建

  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

    • Apt-get安裝

      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包安裝

      下載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.

 

1.1.3. 建立TEST項目

  建立test 項目

   

 

1.1.4.  Gerrit Review支持

         前面咱們在Gitlab上搭建了一個 test的工程,普通用戶是沒有辦法去 push 的,只能使用 git review 命令提交. 而 git review 命令須要 .gitreview 文件存在於項目目錄裏。

 

1.1.4.1安裝支持庫

    須要安裝git-review, readline

    Apt-get install git-review 

    Linux :pip install readline

    Windows:pip install pyreadline

    

1.1.4.2 用 admin用戶給test項目添加.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

    

1.1.5. 用戶建立

  以admin帳戶登陸建立帳戶 

  

  

1.1.6 SSH設置

  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

    

    

1.1.7. Git自帶code review功能

  • 強制 Review:在 Gitlab 上建立的項目,指定相關用戶只有 Reporter 權限,這樣用戶沒有權限使用 git push 功能,只能 git review Gerrit 系統上,Jenkins 在監聽 Gerrit 上的項目事件會觸發構建任務來測試代碼,Jenkins 把測試結果經過 ssh gerrit 個這個項目打上 Verified 成功或失敗標記,成功通知其它人員 Review
  • Ø  Gitlab 保護 Master 分支:在 Gitlab 上建立的項目能夠把 Master 分支保護起來,普通用戶能夠本身建立分支並提交代碼到本身的分支上,沒有權限直接提交到 Master 分支,用戶最後提交申請把本身的分支 Merge Master,管理員收到 Merge 請求後,Review 後選擇是否合併。 

  a)  針對某次提交進行評論
    

  b) 負責人設置master/release分支受保護,只有負責人能夠提交,其餘人不能push

    Branch protected總開關

    

    項目分支開關

    

    

  c)  沒被容許提交的用戶沒法提交

    

  d) GitLab提交合並請求給負責人

    同時發送郵件給該負責人,讓他知道有人要合併分支 

    

    

  e)  負責人接收到合併請求

    

  f)  接受合併

    

1.1.8 備份

  • Gitlab 建立備份

    使用Gitlab一鍵安裝包安裝Gitlab很是簡單, 一樣的備份恢復與遷移也很是簡單. 使用一條命令便可建立完整的Gitlab備份:

    gitlab-rake gitlab:backup:create

    使用以上命令會在/var/opt/gitlab/backups目錄下建立一個名稱相似爲1393513186_gitlab_backup.tar的壓縮包, 這個壓縮包就是Gitlab整個的完整部分, 其中開頭的1393513186是備份建立的日期.

  • Gitlab 修改備份文件默認目錄

    你也能夠經過修改/etc/gitlab/gitlab.rb來修改默認存放備份文件的目錄:

    gitlab_rails['backup_path'] = '/mnt/backups'

    /mnt/backups修改成你想存放備份的目錄便可, 修改完成以後使用gitlab-ctl reconfigure命令重載配置文件便可.

  • Gitlab 自動備份

    也能夠經過crontab使用備份命令實現自動備份:

    sudo su -

    crontab -e

    加入如下, 實現天天凌晨2點進行一次自動備份:

    0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create

  • Gitlab 恢復

    一樣, Gitlab的從備份恢復也很是簡單:

    #中止相關數據鏈接服務
stop unicorn    gitlab-ctl
    gitlab-ctl stop sidekiq
    # 從1393513186編號備份中恢復
    gitlab-rake gitlab:backup:restore BACKUP=1393513186
    # 啓動Gitlab
    sudo gitlab-ctl start
  • Gitlab遷移

    遷移如同備份與恢復的步驟同樣, 只須要將老服務器/var/opt/gitlab/backups目錄下的備份文件拷貝到新服務器上的/var/opt/gitlab/backups便可(若是你沒修改過默認備份目錄的話). 可是須要注意的是新服務器上的Gitlab的版本必須與建立備份時的Gitlab版    本號相同. 好比新服務器安裝的是最新的7.60版本的Gitlab, 那麼遷移以前, 最好將老服務器的Gitlab 升級爲7.60在進行備份.

  • 其餘

    最新版本的Gitlab已經修復了HTTPS設備的BUG, 如今使用官方HTTPS配置便可輕鬆啓用HTTPS.

1.1.9 遇到問題

  a)  Your configuration specifies to merge with the ref 'master'

    緣由:這多是 TortoiseGit 當前版本的一個 BUG

    解決:

    

1.2. Gerrit

1.2.1 簡介

  gerrit的工做模式是全部真正的merge由gerrit負責,咱們的提交只是提交給了gerrit,gerrit會通知項目的負責人來審覈代碼,同時也會調用一些自動化測試構建工具來檢查代碼是否符合要求,只有都經過後纔會的合併進主幹代碼。因此能夠把gerrit當作是代碼和提交者之間的一道門。

1.2.2. 環境搭建

  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) 服務重啓

1.2.3 帳戶建立

  如下模擬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。

    

    

 

1.2.4  Gitlab 支持

1.2.4.1  克隆gitlab test項目

  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

    
    

1.2.4.2  自動同步項目到gitlab

  同步 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 ….] 字段便可。務必按照上面步驟配置複製功能。

1.2.5.  Jenkins 支持

1.2.5.1.  Jenkins 帳戶

  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’ 組

    

1.2.5.2  Verified功能支持

     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 保存更改

 

1.2.6. 注意

  若是想 Gitlab 上建立的項目使用 Gerrit 的 Code Review 功能,兩個系統的用戶必須統一,也就是說無論哪一個用戶使用 Gerrit,前提是這個用戶在 Gitlab 和 Gerrit 上都已註冊,郵箱一致、sshkey 一致。

1.2.7 遇到問題

  • Error Missing project All-Projects

    重裝java -jar gerrit.war init -d /home/gerrit/gerrit_dir 

    注意:若是從新初始化了gerrit,而且版本庫路徑與之前的同樣,記得刪除版本看路徑下的All-projects.git 這個目錄, 否則第一個用戶登陸失敗,沒法獲取超級管理員權限

 

  • Unable to authenticate user by Authorization request header. Check container or server configuration

    問題緣由:因爲版本庫下有子目錄,經過nginx代理是指定的目錄不正確致使 把 proxy_pass http://192.168.0.122:8090/; 改成 proxy_pass http://192.168.0.122:8090; ##不要最後的斜槓

 

  • com.google.gerrit.httpd.auth.container.HttpLoginServlet : Unable to authenticate user by Authorization request header.  Check container or server configuration.

    注意:郵箱驗證的時候,使用nginx提供的端口進入,不要直接使用gerrit的端口進入驗證

    測試這裏是使用8082端口,不要訪問8081端口 

 

  • 使用nginx用戶驗證的方式,沒法使用sign out, gerrit沒法調用nginx

1.3. Jenkins

1.3.1 簡介

  Jenkins是一個開源軟件項目,旨在提供一個開放易用的軟件平臺,使軟件的持續集成變成可能。

1.3.2. 環境搭建

  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

 

1.3.2.  Gerrit Verified支持

1.3.2.1.  Gerrit Triggle插件配置

  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重啓保證狀態正常

    

1.3.2.1.  Verified項目配置

    只要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

      此處測試代碼可依據項目狀況而定,可爲空

      

1.3.2. 郵件支持

  

  

  郵件發送測試 

  

1.4.  Git 客戶端 review支持

  須要安裝git-review, readline

  Apt-get install git-review

 

  Linux :pip install readline

  Windows:pip install pyreadline

  

1.5.  Review+Test+Push實例

1.5.1. 流程

  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 提交者收到消息

    

1.5.2. 遇到問題

  a) 設置git提交的默認編輯器爲vim

    If you want to set the editor only for Git, do either (you don’t need both):

    •   Set core.editor in your Git config: git config --global core.editor "vim"
    •   Set the GIT_EDITOR environment variable: export GIT_EDITOR=vim

 

  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

相關文章
相關標籤/搜索