分類:
軟體內建和項目管理(3)
去年寫的這五篇 CI 文章時候友善郵件測試,自己搞了一個 thstack.com 域名玩。當時也沒在意,所有的文章裡郵箱位址都是引用 @thstack.com 域名。讓我沒想到是,2014 年這個神奇的一年,thstack.com 會成為我們的公司名字和域名。
我想說的是,我們内部的郵件系統也在用 @thstack.com,和這幾個文章裡的郵箱會沖突,導緻一些朋友完全照着我的檔案測試。結果最近收到了很多垃圾郵件。
我還想說的是,不要讓别人懷疑你的智商。
我最想說的一句是,搞 CI 是一個高尚的工作。
随着計算機的高速發展、各種時代變革的到來。百度、360、騰訊這些賺錢機器之間為了利益掐個沒完沒了。開源項目、社群的活躍進而引來持續內建 (CI)系統的誕生。也越發的聽到更多的人在說協同開發、靈活開發、疊代開發、持續內建和單元測試這些拉風的術語。但是也僅僅隻是聽到在說而已,也沒有見 到國内有幾家公司能有完整的 CI 體系流程。反之一些開源項目都有完整的 CI 體系。我覺得就這一點國内的公司還是要去學習的。
由于對上面那些生澀的詞感冒,專門研究了下 CI 相關的系統,才有了這幾篇文章
我用到的系統有:
Gitlab:代碼托管
Gerrit:Code Review
Jenkins:代碼測試
一開始測試使用了 Gitorious 來做代碼的托管,發現界面的功能不全,比較蛋疼。雖然 Gerrit 本身有代碼托管功能,Gerrit 的界面不敢恭維、也沒有 Gitlab 的功能強大。so …
決定使用 Gitlab 還有一點重要原因就是它本身提供保護分支的功能,可以達到 Review 效果。這樣和 Gerrit 結合的話,可以針對不同的使用者群來配置設定 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 後選擇是否合并。
由于沒有閑置伺服器、公網 IP、域名讓我去浪費。想到 qingcloud 上還有 2k 沒花,是以需要把三套系統整合塞到一個 vps 中。在整合三套系統中遇到一些需要規劃的小問題
每個系統都有發送郵件的功能,最好弄三個郵箱賬号
三個系統都預設監聽了 8080 端口,需要規劃端口
規劃了端口的同時随便規劃下三個域名,後端做個端口轉發友善使用者通路
知道什麼需要規劃後,就來設定吧:
使用系統
修改 ssh 時候不需要輸入 yes,如果不設定後面 Jenkins 連接配接 Gerrit 時候會報錯
Gitlab、Gerrit、Jenkins 版本和下載下傳位址
<a href="https://github.com/gitlabhq/gitlabhq" target="_blank">Gitlab 6.4 Stable</a>
<a href="http://gerrit-releases.storage.googleapis.com/gerrit-2.8.war" target="_blank">Gerrit 2.8 War</a>
<a href="http://pkg.jenkins-ci.org/debian/binary/jenkins_1.544_all.deb" target="_blank">Jenkins 1.544 Deb</a>
設定主機名
注冊四個郵箱賬号,其中 [email protected] 用來管理三套系統
規劃三個域名和端口
設定解析
簡單規劃完後就可以動手去搭建了,後面幾篇文章會記錄安裝的過程。
目錄
<a href="http://longgeek.com/2013/12/26/ci-system-structures-ii-gitlab-installation/#i" target="_blank">1 設定源</a>
<a href="http://longgeek.com/2013/12/26/ci-system-structures-ii-gitlab-installation/#i-2" target="_blank">2 安裝依賴包</a>
<a href="http://longgeek.com/2013/12/26/ci-system-structures-ii-gitlab-installation/#i-3" target="_blank">3 系統使用者</a>
<a href="http://longgeek.com/2013/12/26/ci-system-structures-ii-gitlab-installation/#GitLab_Shell" target="_blank">4 GitLab Shell</a>
<a href="http://longgeek.com/2013/12/26/ci-system-structures-ii-gitlab-installation/#Mysql" target="_blank">5 Mysql</a>
<a href="http://longgeek.com/2013/12/26/ci-system-structures-ii-gitlab-installation/#GitLab" target="_blank">6 GitLab</a>
<a href="http://longgeek.com/2013/12/26/ci-system-structures-ii-gitlab-installation/#Nginx" target="_blank">7 Nginx</a>
<a href="http://longgeek.com/2013/12/26/ci-system-structures-ii-gitlab-installation/#i-4" target="_blank">8 界面簡單使用</a>
設定國内 163 apt 源
Gitlab 依賴包、庫
安裝 markdown 文檔風格依賴包
安裝 git,Gerrit 依賴 gitweb,同時 GitLab 依賴 git 版本 >= 1.7.10,Ubuntu apt-get 預設安裝的是 1.7.9.5,當然不更新也是沒有問題的
更新 Git 版本(可選)
Gitlab 需要收發郵件,安裝郵件伺服器
如果安裝了 ruby1.8,解除安裝掉,Gitlab 依賴 2.0 以上
下載下傳編譯 ruby2.0
修改 gem 源指向 taobao
安裝 Bundel 指令
給 Gitlab 建立一個 git 使用者
下載下傳 Gitlab Shell,用來 ssh 通路倉庫的管理軟體
修改 gitlab-shell/config.yml
安裝 GitLab Shell
安裝 Mysql 包
給 Gitlab 建立 Mysql 資料庫并授權使用者通路
下載下傳 GitLab 源代碼,并切換到最新的分支上
配置 GitLab,修改 gitlab.yml,其中 host: 項和 gitlab-shell 中 gitlab_url 的主機一緻
建立相關目錄
修改相關目錄權限
修改 unicorn.rb 監聽端口為:8081
配置 GitLab 通路 mysql 資料庫設定
設定 GitLab 使用指定郵箱發送郵件,注意 production.rb 的檔案格式,開頭空兩格
安裝 gem
修改 Gemfile 檔案中源指向為 taobao
雖然在檔案中指向了國内 taobao 源,但是依然會卡一會,耐心等待…
初始化資料庫并激活進階功能
輸入 yes 來初始化資料庫、建立相關表,最後會輸出 GitLab Web 管理者用來登入的賬号和密碼
設定 GitLab 啟動服務
設定 GitLab 使用 Logrotate 備份 Log
檢查GitLab及其環境的配置是否正确:
啟動 GitLab 服務
最後編譯一下
安裝 Nginx 包
配置 Nginx
啟動 Nginx
通路
點選儲存更改後,系統會自動給剛才輸入的郵箱位址發送一封确認修改資訊,點選郵件内容中的連接配接後會自動用新賬号郵箱登入。
建立一個 GROUP:
<a href="http://longgeek.com/wp-content/uploads/2013/12/gitlab-click-group.jpg" target="_blank"></a>
很顯然 longgeek 使用者是沒有 push 到 master 分支得權限。接下來會安裝 Gerrit、Jenkins。以及它們三個如何整合成流程。請參考後面得文章。
重新安裝 gerrit 需要特别注意:
如果有項目在使用記得備份 /etc/gerrit/git 目錄
rm -fr /etc/gerrit
mysql -uroot -p
>>>drop database gerritdb;
>>>create database gerritdb;
重新安裝吧。
如果 /etc/gerrit/logs/error_log 裡出現 java.lang.IllegalStateException: Missing project All-Projects 這個錯誤,那就重新安裝下,記得清除一下 db。
<a href="http://longgeek.com/2013/12/26/ci-system-structures-iii-gerrit-installation-configuration/#_Gerrit" target="_blank">1 下載下傳 Gerrit 包</a>
<a href="http://longgeek.com/2013/12/26/ci-system-structures-iii-gerrit-installation-configuration/#_Gerrit-2" target="_blank">2 安裝 Gerrit 依賴</a>
<a href="http://longgeek.com/2013/12/26/ci-system-structures-iii-gerrit-installation-configuration/#_Gerrit-3" target="_blank">3 建立 Gerrit 資料庫</a>
<a href="http://longgeek.com/2013/12/26/ci-system-structures-iii-gerrit-installation-configuration/#i" target="_blank">4 開始安裝</a>
<a href="http://longgeek.com/2013/12/26/ci-system-structures-iii-gerrit-installation-configuration/#Nginx" target="_blank">5 Nginx</a>
<a href="http://longgeek.com/2013/12/26/ci-system-structures-iii-gerrit-installation-configuration/#i-2" target="_blank">6 通路</a>
<a href="http://longgeek.com/2013/12/26/ci-system-structures-iii-gerrit-installation-configuration/#i-3" target="_blank">7 最後</a>
目前最新版為 2.8
Gerrit 的包是 java 格式,需要安裝 jre
上一篇再安裝 GitLab 時已經安裝了 Mysql,直接建立庫
把 gerrit 安裝再 /etc/gerrit/ 下
在安裝完後 Gerrit 預設會打開浏覽器,由于我的系統是 Server 版沒有桌面和浏覽器,是以才會出現上面倒數第三行的 …FAILED 同時從上面的資訊看出我使用了 http 方式驗證、啟用代理伺服器,指定了 Gerrit 端口為 8082,URL 為 review.thstack.com。需要在 nginx 裡設定下端口轉發。
Gerrit 啟動腳本
修改 Nginx 配置檔案,給 Gerrit 做端口轉發和通路控制,把下面内容寫入到檔案最後
建立 htpasswd.conf 檔案,并添加 admin 使用者、密碼到檔案中
預設第一個登入 Gerrit 的使用者是 Admin。
使用 htpasswd 建立 longgeek 使用者和密碼
如果想 Gitlab 上建立的項目使用 Gerrit 的 Code Review 功能,兩個系統的使用者必須統一,也就是說不管哪個使用者使用 Gerrit,前提是這個使用者在 Gitlab 和 Gerrit 上都已注冊,郵箱一緻、sshkey 一緻。當然 Nginx 通路控制使用者的密碼那就随意了。至于 Gitlab 上建立的項目如何同步到 Gerrit 上、Gitlab 如何使用 Gerrit 的 Code Review 功能等等都在 Jenkins 安裝完之後會一起整合在一起。請關注後面的文章。
本文作為之前幾篇文章的延續,在動手安裝 Jenkins 之前,確定參考了如下文章:
<a href="http://longgeek.com/2013/12/24/ci-build-system-a-basic-environmental-setting-planning/" target="_blank">CI 系統搭建:一. 基礎環境設定、規劃</a>
<a href="http://longgeek.com/2013/12/26/ci-system-structures-ii-gitlab-installation/" target="_blank">CI 系統搭建:二. GitLab 的安裝配置</a>
<a href="http://longgeek.com/2013/12/26/ci-system-structures-iii-gerrit-installation-configuration/" target="_blank">CI 系統搭建:三. Gerrit 的安裝配置</a>
<a href="http://longgeek.com/2013/12/27/ci-system-structures-iv-jenkins-installation-configuration/#Jenkins" target="_blank">1 Jenkins</a>
<a href="http://longgeek.com/2013/12/27/ci-system-structures-iv-jenkins-installation-configuration/#i" target="_blank">2 下載下傳包</a>
<a href="http://longgeek.com/2013/12/27/ci-system-structures-iv-jenkins-installation-configuration/#Jenkins-2" target="_blank">3 Jenkins</a>
<a href="http://longgeek.com/2013/12/27/ci-system-structures-iv-jenkins-installation-configuration/#Nginx" target="_blank">4 Nginx</a>
<a href="http://longgeek.com/2013/12/27/ci-system-structures-iv-jenkins-installation-configuration/#i-2" target="_blank">5 通路</a>
一個可擴充的開源持續內建伺服器,可擴充 Jenkins 系統叢集方式、大量的插件方式擴充,顯然 Jenkins
自己已經形成了一個小生态圈。還有一點不得不說的是 Jenkins 本身的疊代開發非常猛,看了下版本釋出周期平均一周一個版本。具體的
在寫這篇文章時候,Jenkins 最新版本為 1.544
安裝依賴包
安裝 Jenkins
jenkins 預設監聽了 8080 端口,修改為 8083
重新 jenkins 服務
配置 Nginx 端口轉發,在檔案末尾加入下面配置
重新開機 Nginx,就可以用 jenkins.thstack.com 通路 Jenkins 了
在系統中給 Jenkins 使用者生成 ssh 密鑰,Jenkins 使用者在安裝包的時候自動建立了,家目錄在 /var/lib/jenkins
用 htpasswd 建立 jenkins 使用者通路控制密碼
繼續換個浏覽器或者清除浏覽器記錄,用 jenkins 使用者通路 Gerrit
回到 Jenkins,設定 Gerrit Trigger 插件,填寫剛才在 Gerrit 上注冊的 jenkins 使用者資訊 點選 -> 系統管理 -> Gerrit Trigger -> 填寫 Gerrit Server 中的資訊,最後點選 Test Connection,會在左側出現 Success,如果失敗檢查輸入的資訊是否有誤*
2014.04.05 update:
點選 ‘Test Connection’ 如果出現下面内容,不要着急,繼續跟着我的部落格往下做。這個問題會在第五篇文章裡解決掉。
<a href="http://longgeek.com/wp-content/uploads/2013/12/jenkins-gerrit-trigger-ssh1.jpg" target="_blank"></a>
如果上面一步出現下圖錯誤,是因為 jenkins ssh Gerrit 時候需要輸入 yes,卡住了 可以手工 ssh 輸入一下 也是。在傳回界面 多重新整理幾次就沒有錯誤資訊了。 su – jenkins ssh -p 29418 [email protected] gerrit
<a href="http://longgeek.com/wp-content/uploads/2013/12/jenkins-gerrit-conn-err.jpg" target="_blank"></a>
OK,Jenkins 設定完畢,接下來就需要針對項目在 jenkins 上建立建構任務,放在下一篇文章裡。
參考之前的文章:
<a href="http://longgeek.com/2013/12/27/ci-system-structures-iv-jenkins-installation-configuration/" target="_blank">CI 系統搭建:四. Jenkins 的安裝配置</a>
<a href="http://longgeek.com/2014/01/07/ci-system-structures-five-gitlab-gerrit-jenkins-three-integration/#Gerrit_Jenkins" target="_blank">1 Gerrit 和 Jenkins 整合</a>
<a href="http://longgeek.com/2014/01/07/ci-system-structures-five-gitlab-gerrit-jenkins-three-integration/#GitLab_openstack" target="_blank">2 GitLab 上為 openstack 項目的一些準備</a>
<a href="http://longgeek.com/2014/01/07/ci-system-structures-five-gitlab-gerrit-jenkins-three-integration/#gitreview" target="_blank">2.1 .gitreview</a>
<a href="http://longgeek.com/2014/01/07/ci-system-structures-five-gitlab-gerrit-jenkins-three-integration/#testrconf" target="_blank">2.2 .testr.conf</a>
<a href="http://longgeek.com/2014/01/07/ci-system-structures-five-gitlab-gerrit-jenkins-three-integration/#Gerrit_openstack" target="_blank">3 Gerrit 上為 openstack 項目的一些準備</a>
<a href="http://longgeek.com/2014/01/07/ci-system-structures-five-gitlab-gerrit-jenkins-three-integration/#_Gerrit_openstack" target="_blank">3.1 在 Gerrit 上建立 openstack 項目</a>
<a href="http://longgeek.com/2014/01/07/ci-system-structures-five-gitlab-gerrit-jenkins-three-integration/#clone_8211bare_Gitlab_Gerrit" target="_blank">3.2 clone –bare Gitlab 上的倉庫到 Gerrit</a>
<a href="http://longgeek.com/2014/01/07/ci-system-structures-five-gitlab-gerrit-jenkins-three-integration/#_Gerrit_openstack_Gitlab_openstack" target="_blank">3.3 同步 Gerrit 的 openstack 項目到 Gitlab 上的 openstack 項目目錄中</a>
<a href="http://longgeek.com/2014/01/07/ci-system-structures-five-gitlab-gerrit-jenkins-three-integration/#_Jenkins_openstack" target="_blank">4 在 Jenkins 上對 openstack 項目建立建構任務</a>
<a href="http://longgeek.com/2014/01/07/ci-system-structures-five-gitlab-gerrit-jenkins-three-integration/#_Review" target="_blank">5 送出 Review 任務</a>
讓 Gerrit 支援 Jenkins,Gerrit 在 2.7 版本後去掉了 ‘lable Verified’,需要自己添加
檢視 Jenkins 的 log 發現會一直出現下面的資訊,是因為 Jenkins 沒有權限監聽 Gerrit 的 ‘Stream Events’
在 Gerrit 全局設定中能看到 Gerrit 的 ‘Stream Events’ 動作權限預設對 ‘Non-Interactive Users’ 組開放
<a href="http://longgeek.com/wp-content/uploads/2013/12/gerrit-Non-Interactive-Users.jpg" target="_blank"></a>
用 [email protected] 使用者登入 Gerrit 系統,添加 [email protected] 使用者到 ‘Non-Interactive Users’ 組
現在送出的 Review 請求隻有 Code Rivew 稽核,我們要求的是需要 Jenkins 的 Verified 和 Code Review 雙重保障,在 Projects 的 Access 欄裡,針對 Reference: refs/heads/ 項添加 Verified 功能*
編輯 .gitreview 檔案
添加到版本庫
Python 代碼我使用了 testr,需要先安裝 testr 指令
在 openstack 這個項目中添加 .testr.conf 檔案
送出到版本庫中
要知道 review 是在 gerrit 上,而 gerrit 上現在是沒有項目的,想讓 gitlab 上的項目能在 gerrit 上 review 的話,必須在 gerrit 上建立相同的項目,并有相同的倉庫檔案.
用 admin 使用者在 Gerrit 上建立 openstack 項目
在 Gerrit 上 clone Gitlab 的 openstack 項目
當使用者 git review 後,代碼通過 jenkins 測試、人工 review 後,代碼隻是 merge 到了 Gerrit 的 openstack 項目中,并沒有 merge 到 Gitlab 的 openstack 項目中,是以需要當 Gerrit openstack 項目倉庫有變化時自動同步到 Gitlab 的 openstack 項目倉庫中。Gerrit 自帶一個 Replication 功能,同時我們在安裝 Gerrit 時候預設安裝了這個 Plugin。現在隻需要添加一個 replication.config 給 Gerrit。
添加 replication.config 檔案
上面的 url 是用 root 使用者來做 Gerrit 的 openstack 項目複制到 Gitlab 的 openstack 項目中,需要免密碼登入,生成密鑰
設定 ~/.ssh/config
在 ~/.ssh/known_hosts 中,給 gitlab.thstack.com 添加 rsa 密鑰
重新啟動 Gerrit 服務
Gerrit 的複制功能配置完畢,在 gerrit 文檔中有一個 ${name} 變量用來複制 Gerrit 的所有項目,這裡并不需要。如果有多個項目需要複制,則在 replication.config 中添加多個 [remote ....] 字段即可。務必按照上面步驟配置複制功能。
切換到 longgeek 使用者,之前建立了一個 longgeek 使用者,友善測試
同步後,使用 git pull 指令就可以從 Gitlab 上的 openstack 倉庫下來代碼
如此便是一個完整的 CI 體系流程了,剩下的最重要的是如何用、真正的用起來。