使用jenkins pipeline實現golang專案的持續整合
Jenkins Pipeline是什麼
Jenkins Pipeline(以下稱“管道”)是一套外掛,使jenkins支援建立持續交付工作流,將自由式的構建工作連線起來執行連續性任務。
為什麼要管道?
Jenkins從根本上說是一個支援多種自動化模式的自動化引擎。Pipeline在Jenkins上增加了一套強大的自動化工具,支援從簡單的CI持續整合到全面的CD工作流的用例,使jenkins完成從CI到CD角色的轉變。通過對一系列相關任務建模,可以利用Pipeline的許多功能:
- 程式碼:管道是在程式碼中實現的,可以被檢入到原始碼管理中,使整個團隊能夠編輯、審查和迭代他們的交付流程。
- 耐久性:通過版本管理,保護工作流程式碼不易丟失,。
- 互動性:管道可以前臺進行互動,讓執行者決定是否繼續。
- 多用途:管道支援複雜的實際CD需求,包括分支/連線,迴圈和並行執行工作的能力。
- 可擴充套件性:Pipeline外掛支援對其DSL的定製擴充套件 和jenkins其他外掛整合的選項。
基本概念
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。
新建任務
- 點選— “新建任務”
- 選擇— “流水線”型別,並輸出任務名稱,儲存
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'
}
}
}
構建流程簡述:
初始化GOPATH。
Go專案的編譯及安裝都在GOPATH下進行,而實際開發中不同go專案的依賴版本及依賴包可能會不同,系統中有多版本共存的情況。為了防止版本衝突,最好針對每個專案都提供單獨的GOPATH。因為我採用的方法是,把當前jenkins job的工作目錄設定為GOPATH,隔離每個專案的go執行空間。
從SCM拉取專案程式碼,檢出到GOPATH/src/project_name 目錄。
進入GOPATH/src/project_name 專案目錄,進行單元測試、編譯、安裝等操作。
編譯完成後,將二進位制程式打包入docker映象,推送至docker registry。
使用新的映象部署測試=>預釋出=>生產環境。
構建執行
圖中展示了整個構建流程由多個連續的階段組成,能夠明確的看到每一步的工作完成情況。
當構建到deploy test時,可以看到介面會彈出確認資訊“deploy to test ?”,需要點選OK才可繼續。
總結
Pipeline將程式碼獲取、單元測試、效能測試、靜態檢查、打包部署等研發測試部署環節,通過流水線工作整合,全面做到持續交付,簡單強大。