您好,登錄后才能下訂單哦!
怎么在Docker中使用jenkins和docker實現持續交付?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
傳統交付的發布周期可以表示為下圖:
傳統交付的缺點:
慢交付:在這里,客戶在指定需求之后很長時間才收到產品。這導致了不滿意的上市時間和客戶反饋的延遲。
反饋周期長:反饋周期不僅與客戶有關,還與開發人員有關。假設您意外地創建了一個bug,并在UAT階段了解了它。修理你兩個月前修過的東西需要多長時間?即使是很小的錯誤也會耗費數周的時間。
危險的熱修復程序:熱修復程序通常不能等待完整的UAT階段,因此它們的測試方式往往不同(UAT階段縮短了),或者根本沒有測試。
壓力:對運營團隊來說,無法預測的發布是有壓力的。更重要的是,發布周期通常被安排得很緊,這給開發人員和測試人員帶來了額外的壓力。
為了能夠持續地交付產品,而不是將大筆資金花在全天候工作的運營團隊上,我們需要自動化。這就是為什么,連續交付就是將傳統交付過程的每個階段都更改為一系列腳本,稱為自動部署管道或連續交付管道。
然后,如果不需要手動步驟,我們可以在每次代碼更改之后運行該流程,從而不斷地將產品交付給用戶。
持續交付的優點:
快速交付:開發完成后,客戶就可以使用產品,大大縮短了產品上市的時間。請記住,軟件只有在用戶手中才會帶來收入。
快速反饋周期:假設您在代碼中創建了一個bug,該bug在同一天投入生產。要花多少時間才能修好你當天工作的東西?可能沒有那么多。這與快速回滾策略一起,是保持生產穩定的最佳方法。
低風險的發布:如果您每天都發布,那么這個過程就會變得可重復,因此更加安全。
靈活的發布選項:如果您需要立即發布,那么一切都已經準備好了,因此沒有與發布決策相關的額外時間/成本。
不用說,我們可以通過消除所有交付階段并直接在生產上進行開發來實現所有的好處。然而,這將導致質量下降。實際上,引入連續交付的全部困難在于擔心質量會隨著取消手工步驟而降低。我們將展示如何以一種安全的方式處理它,交付的產品不斷地有更少的bug,并更好地適應客戶的需求。
三.怎么實現持續交付
自動化部署管道,它包括如下圖所示的三個階段:
每一步都對應著傳統交付過程中的一個階段,具體如下:
持續集成:檢查以確保不同開發人員編寫的代碼集成在一起
自動化驗收測試:這將取代手工QA階段,并檢查開發人員實現的特性是否滿足客戶的需 求
配置管理:這將取代手工操作階段——配置環境和部署軟件
1.持續集成
持續集成階段向開發人員提供第一個反饋。它從存儲庫(git,svn)中檢出代碼,編譯代碼,運行單元測試,并驗證代碼質量。如果任何步驟失敗,則停止管道執行,開發人員應該做的第一件事是修復持續集成構建。
2.自動化驗收測試
自動化驗收測試階段是和QAs一起編寫的一組測試,這些測試應該替代手動UAT階段。它作為一個質量檢驗關來決定一個產品是否準備好發布。如果任何驗收測試失敗,則停止管道執行,不再運行進一步的步驟。它阻止移動到配置管理階段,從而阻止發布。
3.配置管理
配置管理階段負責跟蹤和控制軟件及其環境中的更改。它涉及準備和安裝必要的工具、擴展服務實例的數量及其分布、基礎設施清單以及與應用程序部署相關的所有任務。
配置管理是針對在生產環境中手動部署和配置應用程序所帶來的問題的解決方案。配置管理工具(如Ansible、Chef或Puppet)支持在版本控制系統中存儲配置文件,并跟蹤在生產服務器上所做的每個更改。
替代操作(運維)團隊手工任務的另一項工作是負責應用程序監視。這通常是通過將運行系統的日志和指標流到一個公共儀表板來完成的,該儀表板由開發人員(或DevOps團隊,如下一節所述)監視。
四.工具
1.docker生態鏈
Docker作為集裝箱化的領導者,近年來在軟件行業占據了主導地位。它允許在與環境無關的映像中打包應用程序,因此將服務器視為一個資源場,而不是必須為每個應用程序配置的機器。
Docker是一個明確選擇,因為它非常適合(微)服務世界和持續交付過程。
2.jenkins
Jenkins是目前市場上最流行的自動化服務器。它有助于創建連續集成和連續交付管道,通常還有助于創建任何其他自動化的腳本。高度面向插件,它有一個偉大的社區,不斷擴展它的新功能。
更重要的是,它允許將管道編寫為代碼并支持分布式構建環境。
3. Ansible
Ansible是一個自動化工具,可以幫助進行軟件配置、配置管理和應用程序部署。它采用無代理的體系結構,并與Docker進行了良好的集成。
4.gitHub
GitHub絕對是所有托管版本控制系統中排名第一的。它提供了一個非常穩定的系統,一個基于web的UI,以及一個公共存儲庫的免費服務。
盡管如此,任何源代碼控制管理服務或工具都可以使用連續交付,無論它是在云中還是自托管的,也無論它是基于Git、SVN、Mercurial或任何其他工具。
五.docker實戰
1.docker概述
Docker是一個開源項目,旨在幫助使用軟件容器進行應用程序部署。以下引用自Docker官方頁面:
Docker容器將一段軟件封裝在一個完整的文件系統中,該文件系統包含運行所需的一切:代碼、運行時、系統工具、系統庫——任何可以安裝在服務器上的東西。這保證了軟件將始終運行相同的,不管它的環境如何。
因此,Docker以類似于虛擬化的方式,允許將應用程序打包成可以在任何地方運行的映像。
2.虛擬化和容器化
沒有Docker,使用硬件虛擬化(通常稱為虛擬機)可以實現隔離和其他好處。最流行的解決方案是VirtualBox、VMware和Parallels。
虛擬機模擬計算機體系結構并提供物理計算機的功能。如果每個應用程序都作為單獨的虛擬機映像交付并運行,我們就可以實現應用程序的完全隔離。下圖展示了虛擬化的概念:
每個應用程序都作為獨立的映像啟動,其中包含所有依賴項和客戶操作系統。映像由虛擬機監控程序運行,虛擬機監控程序模擬物理計算機體系結構。
許多工具(如Vagrant)都廣泛支持這種部署方法,并致力于開發和測試環境。然而,虛擬化有三個顯著的缺點:
低性能:虛擬機模擬整個計算機體系結構來運行客戶操作系統,因此每個操作都有很大的開銷。
高資源消耗:模擬需要大量的資源,并且必須為每個應用程序分別執行。這就是為什么在標準的臺式機上,只有幾個應用程序可以同時運行。
大型映像:每個應用程序都使用完整的操作系統交付,因此在服務器上的部署意味著發送和存儲大量數據。
下面的圖是docker帶來的不同:
3.docker的安裝
Docker的安裝過程快速簡單。目前,大多數Linux操作系統都支持它,其中很多都提供了專用的二進制文件。Mac和Windows也得到了本地應用程序的良好支持。
但是,重要的是要理解Docker內部是基于Linux內核及其細節的,這就是為什么在Mac和Windows中,它使用虛擬機(Mac使用xhyve, Windows使用hyv)來運行Docker引擎環境。
這里只說在linux上的Ubuntu 16.04操作(官方的命令):
$ sudo apt-get update $ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 9DC858229FC7DD38854AE2D88D81803C0EBFCD88 $ sudo apt-add-repository 'deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial main stable' $ sudo apt-get update $ sudo apt-get install -y docker-ce
如果提示報錯:
,
可以再次執行下面的命令:
$ cd /etc/apt/sources.list.d $ sudo vi docker.list deb https://download.docker.com/linux/ubuntu zesty edge $sudo apt update $sudo apt install docker-ce
這一次沒有報錯,但是發現太慢了,因為下載docker-ce比較大,并且是國外網站,這里可以改成國內源,指令如下:
sudo apt-get update sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ software-properties-common curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu $(lsb_release -cs) stable" sudo apt-get update sudo apt-get install docker-ce
測試是否安裝完成:docker -v或者docker info可以看到docker一些基本信息表示安裝成功了:
4.運行docker
docker的環境已經安裝完成,我們可以先運行一個非常經典的例子:hello world:
$ docker run hello-world
當你看到如下信息表示你運行正確了:
讓我們一步一步來看看引擎蓋下面發生了什么:
1.使用run命令運行Docker客戶機。
2.Docker客戶機聯系Docker守護進程,要求從名為hello-world的映像創建一個容器。
3.Docker守護進程檢查它是否在本地包含hello-world映像,因為它沒有,所以從遠程Docker Hub注冊中心請求hello-world映像。
4.Docker Hub注冊表包含hello-world映像,因此將其拖放到Docker守護進程中。
5.Docker守護進程從hello-world映像創建了一個新容器,該映像啟動了生成輸出的可執行文件。
6.Docker守護進程將此輸出流到Docker客戶機。
7.Docker客戶機將其發送到您的終端。
5.構建鏡像
構建鏡像有2種方式:
Docker commit命令和Dockerfile自動構建。我們來探討下docker怎么構建鏡像的。
我再這只說Dockerfile方式:
使用commit命令手動創建每個Docker映像可能很費力,特別是在構建自動化和連續交 付過程的情況下。幸運的是,有一種內置語言可以指定構建Docker映像所需執行的所有指令。
1.創建DockerFile文件,并輸入以下內容:
FROM ubuntu:16.04 RUN apt-get update && \ apt-get install -y python
2.執行構建鏡像命令:
docker build -t ubuntu_with_python .
3. 我們可以通過命令:
docker images看到我們創建了的鏡像:
6.docker容器
我們可以通過命令:docker ps查看正在運行的容器,docker ps -a查看所有容器。容器是有狀態的。
通過鏡像來啟動容器,并且查看容器的狀態:
停止docker容器是命令:docker stop 容器id
7.運行tomcat,使用外部訪問
1.運行tomcat鏡像:
docker run -d tomcat
但是我們外部瀏覽器是訪問不到tomcat 8080端口的,中間有虛擬機阻斷了網絡連接。
所以我們啟動容器的時候,就要用-p指令來連接虛擬主機和docker容器的網絡端口映射
2.-p啟動
docker run -d -p 8080:8080 tomcat
在網頁輸入虛擬機ip+端口訪問如下:
六.jenkins實戰
1.介紹jenkins
Jenkins是一個用Java編寫的開源自動化服務器。由于非常活躍的基于社區的支持和大量的插件,它是實現持續集成和持續交付過程的最流行的工具。
Jenkins優于其他持續集成工具,是同類軟件中使用最廣泛的。由于它的特性和功能,這一切都是可能的。
2.安裝jenkins
Jenkins的安裝過程快速而簡單。有許多不同的方法可以做到這一點,但是由于我們已經熟悉Docker工具及其帶來的好處,我們將從基于Docker的解決方案開始。這也是最簡單、最可預測和最聰明的方法。
jenkins的安裝有一些環境要求:
Java 8 256MB free memory 1 GB+ free disk space
然而,必須理解需求嚴格依賴于您計劃使用Jenkins做什么。如果Jenkins用作整個團隊的持續集成服務器,那么即使是小團隊,也建議使用1gb +空閑內存和50gb +空閑磁盤空間。不用說,Jenkins還執行一些計算并在網絡上傳輸大量數據,因此CPU和帶寬是至關重要的。
安裝jenkins有兩種方式:
1.使用docker鏡像
2.不使用docker鏡像
1.使用docker鏡像安裝jenkins
使用命令:
docker run -p <host_port>:8080 -v <host_volume>:/var/jenkins_home jenkins:2.60.1
在網頁上輸入網址,如圖代表安裝成功:
輸入密碼,是在日志中可以看到一個初始密碼:
2.不使用docker鏡像安裝jenkins
安裝也非常簡單,只需要執行以下命令:
$ wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add - $ sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list' $ sudo apt-get update $ sudo apt-get install jenkins
3.jenkins簡單應用(hello world)
讓我們遵循這條規則,看看創建第一個Jenkins管道的步驟:
單擊New Item。
輸入hello world作為項目名稱,選擇Pipeline,然后單擊OK。
有很多選擇。現在我們將跳過它們,直接進入管道部分。
在腳本文本框中,我們可以輸入流水線腳本:
pipeline { agent any stages { stage("Hello") { steps { echo 'Hello World' } } } }
點擊保存,并且立即構建,我們可以在輸出日志里面看到如下圖:
七.持續集成管道
1.介紹管道
管道可以理解為一系列的自動化操作,可以看成是一個簡單的腳本鏈:
操作分組:將操作分組到各個階段(也稱為門或質量門),這些階段向流程引入一 個結構,并明確定義了規則:如果一個階段失敗,則不再執行其他階段
可見性:流程的所有方面都是可視化的,這有助于快速進行故障分析并促進團隊協作
反饋:團隊成員在任何問題發生時都能及時了解,這樣他們就能快速做出反應
2.管道結構
Jenkins管道由兩種元素組成:階段和步驟。下圖顯示了如何使用它們:
3.管道的hello world
pipeline { agent any stages { stage('First Stage') { steps { echo 'Step 1. Hello World' } } stage('Second Stage') { steps { echo 'Step 2. Second time Hello' echo 'Step 3. Third time Hello' } } } }
立即構建成功后可以看到以下圖:
4.管道規則
Agent:它指定執行發生的位置,并可以定義標簽來匹配標記相同的代理或docker,以指定動態準備的容器,以便為管道執行提供環境
Triggers:這定義了自動觸發管道的方法,并可以使用cron設置基于時間的調度或pollScm來檢查存儲庫中的更改(我們將在觸發器和通知部分詳細介紹)
Options:這指定了特定管道的選項,例如超時(管道運行的最大時間)或重試(失敗后應該重新運行管道的次數)
Environment:這定義了一組關鍵值,在構建過程中用作環境變量
Parameters:這定義了一個用戶輸入參數列表
Stage:這允許對步驟進行邏輯分組
When:這決定是否應該根據給定的條件執行階段
看完上述內容,你們掌握怎么在Docker中使用jenkins和docker實現持續交付的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。