Jenkins初體驗-安裝與部署服務

1、概述

1.簡介

  在工做中接觸到CD/CI,Devops相關的技術,本文記錄Jenkins的基本使用。Jenkins是一款開源的持續集成工具,可以集成一套自動化部署任務。html

  目標

  1. 經過jenkins從github拉取代碼(web應用)
  2. 經過jenkins進行maven編譯打包
  3. jenkins發送打好的jar包,發送到另外一臺須要部署的虛擬機上(已安裝docker)
  4. 經過dockerfile打新鏡像
  5. 停掉已運行的容器,並啓動新的容器

2.環境準備

  兩臺虛擬機 (實現利用Jenkins從github拉取代碼,並經過maven打包,部署到另外一臺服務器的docker容器中)java

    a.一臺安裝了docker (用於部署程序)git

    b.一臺安裝了maven jdk8 git (用於安裝jenkins,並拉取代碼,編譯打包)github

2、安裝、啓動、配置Jenkins

1.下載Jenkins

  本文采用部署war包的方式安裝Jenkins,首先下載jenkins war包。web

  

$ wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war

 

  官方連接:docker

  1.安裝嚮導: https://jenkins.io/zh/doc/book/installing/#setup-wizardshell

  2.war包下載: http://mirrors.jenkins.io/war-stable/express

 

2.啓動Jenkins

  經過war包的方式啓動Jenkins的方式很簡單,直接使用java -jar命令就能夠啓動了,Jenkins默認端口是8080 若是須要指定端口能夠修改啓動參數centos

$ java -jar jenkins.war --httpPort=9090

   啓動成功後會自動生成admin帳號以及密碼,第一次登陸時須要用到bash

 

 3.初次登陸Jenkins

  訪問部署Jenkins那臺服務器的9090端口,輸入初始密碼

 

  進入安裝嚮導,選擇【安裝推薦插件】,固然也能夠自定義須要安裝的插件

 

  推薦的安裝的插件以下圖,等待下載安裝。

  

  插件下載安裝後,建立管理員帳號

 

  接下來配置Jenkins實例絕對地址(本文采用默認URL),這個值會和Jenkins參數BUILD_URL有關

 

 

  保存後,開始使用Jenkins,使用剛配置的管理員帳號登陸便可

 

  補充安裝插件:

  因爲咱們會將jenkins打好的包發送到另一臺服務器進行部署,所以須要再安裝【Publish Over SSH】【Publish Over FTP】插件。

  使用admin帳號登陸jenkins,點擊【系統管理】-【插件管理】-【可選插件】,搜索"publish over",選擇【Publish Over SSH】【Publish Over FTP】插件,並直接安裝。

  

 

 

 

 

   配置ssh,點擊【系統管理】-【系統設置】,新增,輸入遠程服務器ip,以及用戶名和密碼,並填寫遠程服務器的訪問路徑(這裏是根目錄) 點擊test查看是否鏈接成功,成功後保存配置便可

  

 

  

 

 

 

 3、任務建立與執行

1.【方式1】建立自由風格的任務

  下面將建立一個基於上下游自由風格的任務,實現咱們的目標

 

 

  建立好後,在配置界面,能夠看到自由風格的任務包含下面幾點內容

 

  1.在【General】中,選擇參數化構建過程,使用文本參數,定義參數爲branch,即在構建任務前,能夠傳遞的參數。

  

  2.【源碼管理】選擇git,輸入倉庫地址,並添加憑據,類型選擇【Username with password】,用戶名、密碼分別填寫github帳號和密碼。

 

 

 

   3.【構建】,添加兩個構架步驟,1.執行shell,2.Send files or execute commands over SSH

  shell命令步驟用於使用maven打包

  Send files or execute commands over SSH 用戶發送打好的包到部署服務器

 

  這裏補充說一下,jenkins自帶了不少環境變量能夠直接使用,例如工做目錄 WORKSPACE等,訪問jenkins這個路徑能夠查看 http://192.168.152.133:9090/env-vars.html/

 

  shell命令步驟:經過maven打包

cd eureka    # 進入項目工程
mvn clean package -Dmaven.test.skip=true    # maven 打包

   

 

   Send files or execute commands over SSH 步驟

  這個步驟會指定須要被髮送的jar包,以及發送到遠程服務器的指定路徑,並構建一個新的鏡像進行部署。

  補充:基礎鏡像Dockerfile(基礎鏡像安裝openjdk 1.8),基礎鏡像能夠安裝配置一些軟件、環境,以後須要部署的程序均可以FROM這個基礎鏡像

FROM centos:7

RUN yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel
View Code 基礎鏡像Dockerfile
$ docker build -t base_image .
View Code 構建基礎鏡像

 

  具體配置:

 

 

  • Name:選擇以前配置的須要遠程部署的主機
  • Source files:須要發送到遠程主機的文件(注意路徑,這裏使用相對路徑,相對於在jenkins workspace這個任務的路徑 這裏是相對於這個路徑: /root/.jenkins/workspace/Job1 )
  • Remove prefix:刪除路徑前綴(發送的文件名會受【Source files】配置的影響,這裏須要刪除路徑前綴)
  • Remote directory:遠程主機須要接收包的路徑(這個路徑是相對路徑,相對於以前配置遠程服務器信息的Remote Directory,因爲以前配置的是根路徑,所以這裏可使用絕對路徑)
  • Exec command:包發送成功後,執行的命令

    # 在遠程服務器上
    cd /data/deploy
    docker build -t eureka_image:${branch} .
    docker run -dit -p 18080:8761 eureka_image:${branch} /bin/bash #暴露端口 宿主機18080端口與容器8761端口映射

     

   附上須要部署程序的Dockerfile

FROM base_image:latest

ADD eureka-0.0.1-SNAPSHOT.jar /data/eureka.jar

WORKDIR /data

ENTRYPOINT ["java","-jar","eureka.jar"]

EXPOSE 8761

 

  執行

  配置完成後點擊保存,Build with Parameters,輸入參數(須要部署的分支),點擊開始構建

  

  點擊正在進行的任務,【控制檯輸出】能夠看到構建日誌

 

  能夠看到最後是SUCCESS,說明構建成功。若是構建失敗能夠根據日誌提示進行排查。

  訪問服務器18080端口,看到Eureka界面,說明部署成功。

 

2.【方式2(推薦)】建立Pipeline任務

  建立以及配置

    新建一個【流水線】任務,建立好後直接編寫Pipeline script

 

  

 

pipeline{
    agent any    //代理
    options {   // 針對流水線的控制選項
        timeout(time: 10, unit: 'MINUTES') 
    }
    parameters {    //    1.構建構建參數 
            string(name: 'BRANCH', defaultValue: 'dev', description: '分支')    
    }
    stages {    //    2.包含以系列stage
        stage('Pull Code') {        //    3.stage 定義代碼拉取階段
            steps{        //    6.步驟  
                git branch: '$BRANCH', credentialsId: 'your credentials', url: 'https://github.com/SherryXRJ/test.git'     //    9.選擇git倉庫
            }
        }
        
        stage('Build') {            //    4.stage    定義構建階段
            environment {       //    10.環境變量定義
                skipTest = 'true'
            }
            
            input {                //    11.pipeline用戶輸入框
                id "Deploy" // 默認與stage一致
                message "Should we Build now?"
                ok "Yes, we should."
                submitter "admin"  // 能夠提點擊確認的用戶 
                parameters {    //    14.參數定義
                    string(name: 'MSG', defaultValue: 'admin', description: 'Who should I say hello to?')
                }
            }
            steps{        //    7.步驟
                sh 'printenv'
                sh 'echo msg: ${MSG}'
                sh ''' cd eureka  
                mvn clean package -Dmaven.test.skip=$skipTest '''
            }
        }
        
        
        stage('Deploy'){            //    5.stage 定義部署階段
            when {        //    12.pipeline scripe 條件分支
                allOf {  // allOf not anyOf
                    expression { return params.BRANCH == 'dev' }    // 只有dev分支才部署
                    
                    // other conditions ...
                }
                  
            }
            
            steps{        //    8.步驟
                sh ''' echo ${PERSON} '''
                //    15.ssh腳本
                sshPublisher(publishers: [sshPublisherDesc(configName: 'remote_server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''cd /data/deploy
docker build -t eureka_image:${branch} .
docker run -dit -p 18080:8761 eureka_image:${branch} /bin/bash''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/data/deploy', remoteDirectorySDF: false, removePrefix: 'eureka/target/', sourceFiles: 'eureka/target/eureka-0.0.1-SNAPSHOT.jar')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
            }
        }
    }
    post {        //13.post步驟
        success {   //  always changed failure success unstable aborted
            echo "success"
        }
        
    }
}

 

  這裏對上面的pipeline script進行說明:

  • parameters: 註釋1 14
    •   構建參數,定義任務參數。在自由風格的任務中,參數化構建是在界面上進行的新增,這裏經過腳本定義,參數爲須要拉取的分支
  • stages:註釋2
    •    須要在stages中定義一系列的stage
  • stage:註釋3.4.5
    •   能夠定義階段名稱
  • steps: 註釋6.7.8  
    •   具體執行步驟,能夠爲shell腳本、流水線腳本等
  • 流水線腳本:註釋9.15
    •   能夠經過Jenkins界面操做生成流水線腳本
  • environment:註釋10   
    •   環境變量,在本任務中定義環境變量,該環境變量僅在每次執行的任務中生效
  • input:註釋11                 
    •   用戶輸入框,例如這裏配置,當任務執行到‘Build’階段時,須要admin用戶點擊確認,才能繼續執行
  • when:註釋12
    •   條件判斷,知足了這些條件才能執行以後的步驟(上面的腳本中只有當構建的分支爲dev時,才進行Deploy步驟)
  • post:  註釋13
    •   當該任務狀態發生改變時,會觸發post裏對應階段的內容(狀態包括:always, changed,failure,success,unstable,aborted)

  

  補充說明經過Jenkins界面生成流水線腳本,以git腳本爲例(ssh腳本同理)

  

 

  能夠參考官網語法:Jenkins官方語法介紹

 

  啓動

  

 

  能夠看到【階段視圖】

  

 

   

 

  外部訪問成功(因爲虛擬機重啓,ip地址變動,這裏的ip地址與以前的ip地址不一樣,請讀者忽略這個問題)

相關文章
相關標籤/搜索