1. 程式人生 > >使用Jenkins搭建持續整合服務

使用Jenkins搭建持續整合服務

1. 什麼是持續整合

持續整合 (Continuous Integration, 簡稱 CI) 是軟體工程中的一種實踐, 用於將開發人員不同階段的工作成果整合起來, 通常一天之中會進行多次. 持續整合最初在 極限程式設計 (Extreme Programming) 中提出, 主要用於執行自動化測試. 目前持續整合的概念已經逐漸獨立出來, 並擴充套件為 構建伺服器 (Build Server), 質量控制 (Quality Control) 和 持續交付 (Continuous Delivery) 等多種形式和實踐. 詳細可以參見 Wikipedia.

下面我們就看一下如何搭建 Jenkins

 (一個基於Java的持續整合工具) 並用於執行自動化測試. 我們要達到這樣的效果: 在向位於 BitBucket 的專案 push 程式碼時, Jenkins 自動獲取最新的程式碼並執行測試, 並將測試結果通過Email或其他方式通知我們.

另外, 本文也會介紹幾個持續整合服務商, 可以免去自己安裝和維護的工作. 詳見 持續整合服務商.

2. 安裝和配置Jenkins

下面介紹如何在Ubuntu系統上安裝和配置Jenkins. 如果你對Ubuntu系統不熟悉, 可以參考 Linux伺服器的初步配置流程, 那裡有如何配置 sudo 等資訊.

2.1 安裝Jenkins

詳細的安裝步驟可以參考

官方文件, 主要步驟如下:

wget -q -O - http://pkg.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

這樣就會自動安裝Jenkins和它的依賴(如OpenJDK), 並自動在 8080 埠啟動Jenkins. 如果8080埠已被佔用則會啟動失敗, 可以關閉佔用8080埠的程式, 或者更改Jenkins的配置使用其他埠(見後文).

為了執行專案自動化測試而需要的軟體和工具可以在這裡一併安裝和配置, 例如我的專案需要 Rvm, Ruby 和 PostgreSQL.

2.2 Jenkins命令

以下是用於管理Jenkins服務的常用命令:

  • 檢視Jenkins是否正在執行: sudo service jenkins status
  • 執行Jenkins: sudo service jenkins start
  • 停止Jenkins: sudo service jenkins stop
  • 重啟Jenkins: sudo service jenkins restart

2.3 Jenkins執行選項

Jenkins預設使用的配置檔案位於 /etc/default/jenkins, 在這裡可以更改Jenkins的執行選項. 例如, 如果要修改記憶體大小和執行埠, 可以使用 sudo vi /etc/default/jenkins 開啟這個檔案然後修改這兩個選項:

JAVA_ARGS="-Xmx512m"
HTTP_PORT=9080

修改配置檔案後記得重啟Jenkins: sudo service jenkins restart

2.4 Jenkins安全配置

接下來在瀏覽器開啟 host:port (例如 http://localhost:8080) 就可以訪問到Jenkins的頁面了, 其中 host 是你的伺服器IP或域名, port 是Jenkins的執行埠(預設是8080). 你也可以配合Nignx或Apache來使用80埠, 以及設定SSL等.

第一次執行Jenkins時要做的特別重要的一件事就是配置安全選項, 也就是訪問和修改Jenkins的許可權. 預設的設定是所有人擁有所有的許可權. 我們來改成需要使用使用者名稱和密碼登入.

首先建立一個使用者. 從左邊的選單區依次進入 Manage JenkinsManage UsersCreate User, 然後填入自己的登入資訊.

之後回到首頁, 依次進入 Manage JenkinsConfigure Global Security, 勾上 Enable security 和 Jenkins’ own user database, 去掉 Allow users to sign up 前面的勾.

接下來, 如果你的Jenkins是內部使用, 不想公開給大眾, 可以使用 Matrix-based security, 在 User/group to add: 後面輸入剛才建立的使用者名稱並點 Add, 然後在出現的那一行勾上 Administer (Anonymous那一行都不要勾上).

而如果你想允許沒登入的人檢視Jenkins(只讀許可權), 可以使用 Logged-in users can do anything.

以上是典型的安全配置, 你也可以根據自己的情況決定如何配置.

3. Jenkins Job 示例: 自動化測試

由於我們的示例需要使用 Git 和 Bitbucket, 先做一些必要的安裝和配置.

3.1 安裝和配置 Git 及 ssh key

首先安裝Git: sudo apt-get install git

然後切換到 jenkins 使用者, 下面的命令都要以這個使用者的身份執行:

sudo su jenkins

為 jenkins 使用者配置 Git 使用者名稱和email (根據你的情況進行修改):

git config --global user.name "Jenkins"
git config --global user.email "[email protected]"

然後用 ssh-keygen 命名生成 ssh key. 可以一路回車, 預設生成的 ssh public key 位於 ~/.ssh/id_rsa.pub. 詳細可以參見 SSH原理與運用(一):遠端登入.

<iframe id="iframeu2288174_0" src="http://pos.baidu.com/wcwm?rdid=2288174&amp;dc=2&amp;di=u2288174&amp;dri=0&amp;dis=0&amp;dai=2&amp;ps=2886x124&amp;dcb=BAIDU_SSP_define&amp;dtm=BAIDU_DUP_SETJSONADSLOT&amp;dvi=0.0&amp;dci=-1&amp;dpt=none&amp;tsr=0&amp;tpr=1464069801297&amp;ti=%E4%BD%BF%E7%94%A8Jenkins%E6%90%AD%E5%BB%BA%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90%E6%9C%8D%E5%8A%A1%20%7C%20%E9%99%88%E9%B9%8F%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2&amp;ari=1&amp;dbv=2&amp;drs=1&amp;pcs=1349x667&amp;pss=1349x2937&amp;cfv=0&amp;cpl=4&amp;chi=1&amp;cce=true&amp;cec=UTF-8&amp;tlm=1464069801&amp;ltu=http%3A%2F%2Fchenpeng.info%2Fhtml%2F3081%3Futm_source%3Dtuicool&amp;ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3D2xFXC-6mPi25RnqOWkFgWNrQcT1NcwZs_w4bL0soCZb5zB09Pg6v-AsalQn6-46iGDA-4oUGz_9jrvWx-mKWtq%26wd%3D%26eqid%3Dba90bff60002190f000000045743ee8e&amp;ecd=1&amp;psr=1366x768&amp;par=1366x728&amp;pis=-1x-1&amp;ccd=24&amp;cja=false&amp;cmi=6&amp;col=zh-CN&amp;cdo=-1&amp;tcn=1464069802&amp;qn=fdf729833462eaf6&amp;tt=1464069801228.418.857.859" width="468" height="60" align="center,center" vspace="0" hspace="0" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true" style="box-sizing: border-box; max-width: 100%; border-width: 0px; border-style: initial; vertical-align: bottom; margin: 0px;"></iframe>

然後執行一次 ssh [email protected] 並輸入 yes, 這樣BitBucket就會被自動加到 known_hosts 裡了.

然後需要把 ssh public key 加到BitBucket專案的 Deployment keys, 這樣 jenkins 使用者才有許可權 clone 專案程式碼. 執行 cat ~/.ssh/id_rsa.pub 並複製輸出的 public key 內容 (注意不要複製多餘的空行), 然後開啟BitBucket專案管理頁面的 Deployment keys 頁面, 貼上到 Key 文字框裡, Label 建議填寫 jenkins ci, 然後點選 Add key.

最後, 需要給Jenkins安裝Git外掛. 在Jenkins頁面依次選擇 Manage JenkinsManage PluginsAvailable, 找到並勾上 GIT plugin. 由於我的專案是使用了Rvm, 所以我也會勾上 Rvm. 然後點選頁面最下方的 Install without restart.

3.2 建立Job

下面我們就來建立用於執行自動化測試的Jenkins Job.

在Jenkins頁面點選 New Item, 在 Item name 輸入Job名稱, 例如 my-project-rspec, 點選 OK.

在 Source Code Management 區域勾選 GitRepository URL 填寫專案在BitBucket的地址, 例如 [email protected]:user/repo.git. 在 Branches to build 後面填寫想要對哪個分支援續整合, 我們留空來針對所有分支.

在 Build Triggers 區域勾選 Poll SCM (Schedule 和 Ignore post-commit hooks 留空).

如果要使用 Rvm 外掛, 在 Build Environment 區域勾選 Run the build in a RVM-managed environment, 並在 Implementation 後面填寫你在 Rvm 中使用的 Ruby 版本, 例如 2.0.0-p451.

在 Build 區域依次選擇 Add build stepExecute shell, 然後在 Command 右邊的文字框輸入執行持續整合的指令碼, 例如為我的專案執行自動化測試:

bundle install
export RAILS_ENV=test
bundle exec rake db:schema:load
bundle exec rspec spec

最後, 點選 Save, 回到剛建立好的Job的頁面, 點選 Build Now, 檢視Build的 Console Output, 如果遇到錯誤就做相應的修改, 之後再 Build Now 直到成功.

3.3 配置自動觸發

現在我們已經可以手動觸發持續整合來執行測試了, 下面配置在 push 程式碼時自動觸發.

進入BitBucket專案管理頁面的 Hooks 頁面, 在 Select a hook… 選擇 POST 並點選 Add hook, 然後在 URL 填寫 JENKINS_URL/git/notifyCommit?url=GIT_REPO, 其中 JENKINS_URL 是你的Jenkins地址,GIT_REPO 是在上一步填寫的Git倉庫地址. 例如:

http://localhost:8080/git/[email protected]:user/repo.git

然後點 Save. 以後當有程式碼push到BitBucket專案時, Jenkins就會自動觸發執行測試.

3.4 配置通知

最後, 我們需要配置通知以便在整合失敗時得到通知. 如果你使用 HipChat 或 Slack 那麼建議你直接使用他們接收通知, 只需安裝對應的外掛和簡單的配置即可.

下面我們介紹如何讓Jenkins傳送Email通知. 首先需要配置SMTP. 依次進入 Manage JenkinsConfigure System, 在 E-mail Notification 區域進行設定. 以Gmail為例: SMTP server 輸入smtp.gmail.com, 點選 Advanced…, 勾選 Use SMTP AuthenticationUser Name 和 Password 輸入 Gmail 郵箱地址和密碼, 勾選 Use SSLSMTP Port 填寫 465. 然後可以勾選 Test configuration by sending test e-mail 並填寫自己的Email地址再點 Test configuraton 進行測試, 如果可以收到測試郵件則說明配置成功. 然後點選頁面底部的 Save.

接下來進入Job頁面, 點選 Configure 進入Job的配置頁面, 在最下面的 Add post-build action 選擇 E-mail Notification, 然後在 Recipients 輸入接收通知郵件的郵箱地址, 多個地址之間用英文空格隔開 (建議使用郵件列表地址).

4. 持續整合服務商

以上就是Jenkins持續整合伺服器的基本配置和使用. 除了某些情況下必須像這樣自己搭建持續整合伺服器外, 其實可以考慮一些 SaaS 型別的持續整合服務, 例如 Travis CICircleCICodeship 和 Drone. 此類的服務對於開源專案基本都是免費的. 對於私有專案的收費可能也會比自己搭建和維護持續整合伺服器的成本更低, 值得考慮.

以下是我對這幾個持續整合服務的初步印象:

  • Travis CI: 在GitHub專案中非常流行, 收費版的起步價($129)比較高.
  • CircleCI: 只支援GitHub專案. 聽說速度很快.
  • Codeship: 網站介面很漂亮. 我在使用中遇到兩個不常見的問題: 在用 git push -f 覆蓋了之前失敗的一次commit時, Codeship會由於找不到之前的commit而無法繼續執行; 另外那個觸發自動執行的hook URL只在剛開始建立專案時可以看到, 之後在設定頁面找不到, 這樣如果在BitBucket/GitHub臨時刪除了hook就找不回來了. 這兩個問題貌似只能通過刪除並重建專案來解決.
  • Drone: 基於 Docker. 我在使用中發現的一個問題是, 每次執行都會從零開始構建環境, 例如我的Ruby專案, 每次執行 bundle install 都重新安裝所有依賴導致用時太長, 暫時沒有研究有無解決方法.

最後, 關於自己搭建持續整合服務, 除了Jenkins還有其他類似的工具, 例如 GitLab CIThoughtWorks GoDrone(開源版) 等, 可以參考 Wikipedia 和 開源中國社群 上的列表.

轉載:http://chenpeng.info/html/3081?utm_source=tuicool

相關推薦

no