1. 程式人生 > >使用jenkins pipeline實現golang專案的持續整合

使用jenkins pipeline實現golang專案的持續整合

Jenkins Pipeline是什麼

Jenkins Pipeline(以下稱“管道”)是一套外掛,使jenkins支援建立持續交付工作流,將自由式的構建工作連線起來執行連續性任務。

為什麼要管道?

Jenkins從根本上說是一個支援多種自動化模式的自動化引擎。Pipeline在Jenkins上增加了一套強大的自動化工具,支援從簡單的CI持續整合到全面的CD工作流的用例,使jenkins完成從CI到CD角色的轉變。通過對一系列相關任務建模,可以利用Pipeline的許多功能:

  • 程式碼:管道是在程式碼中實現的,可以被檢入到原始碼管理中,使整個團隊能夠編輯、審查和迭代他們的交付流程。
  • 耐久性:通過版本管理,保護工作流程式碼不易丟失,。
  • 互動性:管道可以前臺進行互動,讓執行者決定是否繼續。
  • 多用途:管道支援複雜的實際CD需求,包括分支/連線,迴圈和並行執行工作的能力。
  • 可擴充套件性:Pipeline外掛支援對其DSL的定製擴充套件 和jenkins其他外掛整合的選項。

pipelineflow

基本概念

Node

節點是Jenkins執行工作空間,即jenkins分配的執行工作的機器。

stage

管道工作流執行的階段,如拉取程式碼,單元測試,效能測試,編譯,部署等。

step

一項任務,一個步驟。在stage階段中,要執行的步驟。

語法簡介

jenkins pipeline支援兩種語法:

  • Declarative Pipeline 宣告式管道
    Scripted Pipeline 指令碼式管道

Declarative Pipeline

pipeline塊定義了整個流水線所做的所有工作。

pipeline {
    agent any  //在任何jenkins節點上都可執行
    stages {
        stage('Build') {    // buid 階段
            steps {        //build 步驟          

            }
        }
        stage('Test') {     // test 階段
steps { // } } stage('Deploy') { // 部署 階段 steps { // } } } }

Scripted Pipeline

在指令碼管道語法中,一個或多個node塊在整個管道中執行核心工作。基於groovy語法,使用scripted更靈活。

node {  
    stage('Build') { 
        input
        sh
        git
        checkout
    }
    stage('Test') { 
        // 
    }
    stage('Deploy') { 
        // 
    }
}

input

互動命令,可暫停工作流執行,等待執行者的輸入資訊,由人為去決定何時繼續下一步工作

sh

執行shell命令

git

從gitSCM倉庫檢出

chekout

支援多種SCM檢出,git,svn等

更多詳細語法查詢: http://本地jenkins:埠/pipeline-syntax/

開始第一個Pipeline應用

建立pipeline有兩種方式:

  • Blue Ocean 介面非常常亮
  • 經典介面 可直接在介面編寫jenkinsfile

以下使用經典介面建立pipeline。

新建任務

  1. 點選— “新建任務”

newjob

  1. 選擇— “流水線”型別,並輸出任務名稱,儲存

newpipeline

  1. 進入了job配置介面,現在可以在下圖位置進行pipeline編寫了。

    pipelineinput

pipeline編寫:Golang Docker

env.PROJ_DIR='src/learningGo'

node {
    withEnv(["GOPATH=$WORKSPACE"]) {     // 設定stage執行時的環境變數
        stage('Init gopath') {
            sh 'mkdir -p $GOPATH/{bin,pkg,src}'  // go執行環境目錄
        }
        stage('Get code') {
            checkout([                      // git repo
                $class: 'GitSCM', 
                branches: [[name: '*/master']], 
                doGenerateSubmoduleConfigurations: false, 
                extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'src/learningGo']], 
                submoduleCfg: [], 
                userRemoteConfigs: [[
                    credentialsId: '3d33494a-ee1a-4540-a5e9-27f068a2b859', 
                    url: '[email protected]:peng0208/learningGo.git'
                ]]
            ])
        }
        stage('Build go proejct') {      
            sh 'cd ${PROJ_DIR}/daemon/example; go test && go build && go install'
        }
        stage('Deploy to test') {           // 部署測試環境
            input message: 'deploy to test ?', ok: 'De'
            echo 'docker run'
        }
        stage('Deploy to qa') {             // 部署預釋出環境
            input message: 'deploy to qa ?', ok: 'OK!'
            echo 'docker run'
        }
        stage('Deploy to production') {     // 部署生產環境
            input message: 'deploy to production ?', ok: 'OK!'
            echo 'docker run'
        }
    }
}

構建流程簡述:

  1. 初始化GOPATH。

    Go專案的編譯及安裝都在GOPATH下進行,而實際開發中不同go專案的依賴版本及依賴包可能會不同,系統中有多版本共存的情況。為了防止版本衝突,最好針對每個專案都提供單獨的GOPATH。因為我採用的方法是,把當前jenkins job的工作目錄設定為GOPATH,隔離每個專案的go執行空間。

  2. 從SCM拉取專案程式碼,檢出到GOPATH/src/project_name 目錄。

  3. 進入GOPATH/src/project_name 專案目錄,進行單元測試、編譯、安裝等操作。

  4. 編譯完成後,將二進位制程式打包入docker映象,推送至docker registry。

  5. 使用新的映象部署測試=>預釋出=>生產環境。

構建執行

piperunning

圖中展示了整個構建流程由多個連續的階段組成,能夠明確的看到每一步的工作完成情況。

當構建到deploy test時,可以看到介面會彈出確認資訊“deploy to test ?”,需要點選OK才可繼續。

總結

Pipeline將程式碼獲取、單元測試、效能測試、靜態檢查、打包部署等研發測試部署環節,通過流水線工作整合,全面做到持續交付,簡單強大。