1. 程式人生 > >利用jenkins和docker實現持續交付

利用jenkins和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:這決定是否應該根據給定的條件執行階段

 

  這個就是最基礎的一些知識,後續會發一些高階一點的特性。

&n