傳統的軟件開發、測試、運維須要三個團隊在三個不一樣的環境中進行,而三個環境的不一樣引起了不少的問題。如:工做內容的重複;開發環境中可運行的程序在測試和運維環境下卻未必正常;開發人員提交代碼前的測試不充分而引入新的BUG,沒有有效的機制進行提交前的充分測試;測試出的BUG由於環境的複雜使得開發人員難以復現等等。html
Docker的出現讓一切都不一樣以往,Docker能夠將系統與應用打包成一個鏡像,能夠根據Dockerfile和一個簡單的構建命令輕易的重現開發和測試的環境。將Docker引入持續集成(Continuous Integration - CI)構建系統中,保證了開發、測試、運維環境的統一。結合Github和Jenkins能夠實現自動化測試和自動部署。現已有不少基於Docker容器技術的開發、測試、運維一站式解決方案。Docker相關產品應用的出現使得Docker的使用愈來愈方便。java
持續集成的特色:git
它是一個自動化的週期性的集成測試過程,從檢出代碼、編譯構建、運行測試、結果記錄、測試統計等都是自動完成的,無需人工干預;web
須要有專門的集成服務器來執行集成構建;docker
須要有代碼託管工具支持;數據庫
持續集成的做用:瀏覽器
保證團隊開發人員提交代碼的質量,減輕了軟件發佈時的壓力;服務器
持續集成中的任何一個環節都是自動完成的,無需太多的人工干預,有利於減小重複過程以節省時間、費用和工做量;架構
開源項目Jenkins是一個基於Java開發的開放易用的持續集成平臺,可用於執行和監控重複性的工做:持續的軟件版本發佈/測試項目;監控外部調用執行的工做。能夠方便的安裝第三方插件,能夠實時監控持續集成過程當中存在的錯誤,並提供詳細的日誌文件,還具有提醒功能,還能用圖表的形式形象地展現項目構建的趨勢和穩定性。其具有如下特色:運維
易安裝:僅僅一個 java -jar jenkins.war,從官網下載該文件後,直接運行,無需額外的安裝,更無需安裝數據庫;
易配置:提供友好的GUI配置界面;
變動支持:Jenkins能從代碼倉庫(Subversion/CVS)中獲取併產生代碼更新列表並輸出到編譯輸出信息中;
支持永久連接:用戶是經過web來訪問Jenkins的,而這些web頁面的連接地址都是永久連接地址,所以,你能夠在各類文檔中直接使用該連接;
集成E-Mail/RSS/IM:當完成一次集成時,可經過這些工具實時告訴你集成結果(據我所知,構建一次集成須要花費必定時間,有了這個功能,你就能夠在等待結果過程當中,幹別的事情);
JUnit/TestNG測試報告:也就是用以圖表等形式提供詳細的測試報表功能;
支持分佈式構建:Jenkins能夠把集成構建等工做分發到多臺計算機中完成;
文件指紋信息:Jenkins會保存哪次集成構建產生了哪些jars文件,哪一次集成構建使用了哪一個版本的jars文件等構建記錄;
支持第三方插件:使得 Jenkins 變得愈來愈強大;
想了解更多詳細信息請移步Jenkins官方網站。
BuildPipeline:這是Jenkins的一個插件,它能夠將多個須要協同工做的Jenkins任務按照流水線進行排序,將各任務間的關係變爲可視化的圖表,使得部署流程清晰可見。
經過Docker能夠將每個任務模塊化,並經過Dockerfile製做有針對性的鏡像來運行任務,並能夠經過管道獲取各任務的執行時間和結果,爲產品的成功發佈奠基基礎。接下來就是根據自身狀況合理的利用和調度Docker。
讓單元測試運行的更順暢;
單元測試驅動開發是一個很好的應用程序開發方式,單元測試每每也是和代碼一塊兒被提交到代碼倉庫中。可是不少單元測試一般依賴於不少其餘服務,而這些服務的標準化配置每每是一個難點,如數據庫的搭建、防火牆的配置等。而Docker容器則能夠將這些配置一塊兒打包到新的鏡像中,從而輕鬆的完成這些測試。
讓虛擬機再也不困擾集成測試和功能測試;
爲下降成本,過去不少不一樣業務的測試會運行在同一個虛擬機中,這樣的測試環境並不純粹。而經過Docker則能夠在數秒內部署出一套清潔的測試環境,包括微服務的架構的測試環境,同時這些測試環境是能夠共享的。
測試團隊和客戶無需再配置冗長的配置文件;
一般軟件的複雜度越高,其環境配置也就越複雜,傳統的測試一般須要先根據用戶文檔進行環境配置,並且還不必定一次性成功,錯誤的環境配置也更容易報出Bug。而Docker則能夠經過打包鏡像保證開發、測試、運維環境的一致性,包括配置文件、路徑、權限等。
能夠輕易復現Bug場景;
傳統開發過程當中,客戶的環境每每沒法共享給開發團隊,致使Bug的復現出現困難,不得不經過客戶的log進行分析。而Docker則能夠經過鏡像馬上覆現客戶的運行場景,更快的定位問題。
Dockerfile能夠構建流程清晰可見;
Dockerfile是描述Docker鏡像構建步驟的一個文檔,從FROM開始,每一步都是以上一步指令產生的鏡像爲基礎,執行當前的命令,而後將執行結束後的整個環境打包成一個新的鏡像層並添加到基礎鏡像以後。以哪一個鏡像爲基礎,又前後對該鏡像進行了哪些操做都清晰可見,而鏡像的構建又是嚴格依照該文件描述的步驟進行,因此說,只要Dockerfile相同,依據其所構建的鏡像也是相同的,固然,前提條件是你的基礎鏡像也相同。
成熟的測試套件和工具能夠經過鏡像共享;
軟件廠商發佈的測試套件和工具能夠直接打包進鏡像進行發佈。環境的配置直接使用鏡像便可,而再也不是根據用戶手冊進行配置。
Docker的目標:Build,Ship,and Run Any App,Anywhere;即在任何地方構建、部署、運行任何應用程序。
可是Docker依然有它自身的侷限性:
由於容器與主機公用內核,因此若是容器須要使用不一樣的內核版本,主機內核就須要作同步變動;
不能修改內核參數或自主定製內核;
對內核版本有依賴,Docker一般須要3.10或以上版本的內核;
在容器中加載或卸載內核模塊會影響到主機和其餘容器;
跨主機通訊能力不足;
沒法像qemu同樣模擬嵌入式系統運行環境;
雖然某些舊版本內核也能夠運行Docker,可是Docker官方對這類內核不提供支持,而這類內核極可能潛在諸多問題。另外,運行Docker對不少內核編譯選項有要求,基於舊版本內核的Linux發行版不必定開啓了這些編譯選項,可能須要用戶從新編譯內核才能運行。
方法一:直接在主機中配置Jenkins環境;
wget -qO - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | apt-key add - && echo 'deb http://pkg.jenkins-ci.org/debian binary/' | tee /etc/apt/sources.list.d/jenkins.list && apt-get update && apt-get -y install jenkins
方法二:使用Docker鏡像配置Jenkins環境;
# 拉取Jenkins鏡像 $ docker pull jenkins && mkdir /opt/jenkins/data # 啓動jenkins容器 $ docker run -d --name jenkins-server -p 7780:8080 -p 50000:50000 -v /opt/jenkins/data:/var/jenkins_home -u root --restart always jenkins # 在瀏覽器中訪問容器所在宿主機ip:7780或domainname:7780便可進入Jenkins頁面
大多數工具基本都是這兩種安裝方式。
Gitlab相似於Github,是一個項目管理程序,能夠瀏覽源代碼、管理缺陷和註釋,不一樣的是Github私有項目收費,而Gitlab則是搭建在本身的服務器上的。具體操做請參照Gitlab官方網站。固然你也能夠選擇Github,不少有名的開源項目都是放在Github上的,你也能夠找到更多的幫助和說明文檔。
須要的Jenkins控件(系統管理 - 管理插件):
GIT client plugin:1.18.0
GIT plugin:2.4.0
Gitlab Merge Request Builder:1.2.2
GitLab Plugin:1.1.25
SCM API Plugin
若是須要更多的Jenkins控件請點擊這裏。
接下來須要配置Jenkins的從節點。在從節點主機上安裝Java包:
apt-get -y install default-jre
Jenkins主節點是Jenkins Web Server所在的主機,負責測試任務的調度,不負責測試用例的執行。而從節點接受主節點的調度,負責測試用例的執行。
Docker build step plugin:能夠添加Docker命令到構建步驟中;
CloudBees Docker Build and Publish plugin:提供經過Dockerfile構建工程的能力並將製做好的鏡像發佈到Docker倉庫中;
Docker Plugin:可使用Docker主機動態分配的容器做爲Jenkins的從節點;
Kubernetes Plugin:經過由Kubernetes管理的多個Docker主機系統來動態分配的容器做爲Jenkins的從節點;
Docker Commons Plugin:爲其餘與Docker相關的插件提供API;
參考目錄:
《Docker技術入門與實踐》(楊保華 戴王劍 曹亞侖)