Jenkins實踐——創建Pipeline的兩種方式
點擊藍字關注我們
近期使用Jenkins幫業務團隊搭建過一次Pipline,並將測試流程加入到了Pipline中,將搭建過程的做了簡單記錄。考慮到項目的保密性,該文章僅演示搭建步驟和工具使用,文中的代碼均爲僞代碼
JenkinsPipeline簡介與安裝
1
瞭解Jenkins的人相信對pipeline都有所耳聞,pipeline是Jenkins2.0推出的一套Groovy DSL語法,將原本獨立運行於多個Job或者多個節點的任務統一使用代碼的形式進行管理和維護。
2
推薦使用docker鏡像的方式安裝Jenkinspipeline,因爲Jenkins是用java編寫的,需要安裝java環境,配置環境變量等這些操作,有時候可能還會遇到jdk版本不兼容的問題。爲了不讓繁瑣的安裝過程澆滅我們的學習熱忱,還是推薦用docker鏡像的方式部署,安裝步驟非常簡單:
1
拉取JenkinsOcean鏡像
docker pull jenkinsci/blueocean
2
創建掛載目錄
mkdir /var/jenkins_home
3
啓動Jenkins
docker run -d -p 8888:8080 -p 50000:50000 -v jenkins:/var/jenkins_home –v /etc/localtime:/etc/localtime --name jenkinsci-blueocean -d jenkinsci/blueocean
如果你是使用以上步驟安裝Jenkins,登錄之後在頁面的左側導航欄就能看到如下所示的圖標:
如果你已經安裝了Jenkins普通版本,可以在 【Manage Jenkins】 —— 【ManagePlugins】 中搜索BlueOcean安裝,安裝完之後同樣在主界面做側導航欄可以看到上圖中的圖標。
安裝完成,我們就開始進入主題,使用兩種不同的方式創建Pipeline。
經典模式下創建Pipeline
創建pipeline一共兩種方式,第一種方式我們稱之爲傳統方式,是使用Jenkins經典界面,通過自己編寫PipelineScript來組織流水步驟的。下面用圖示的方式簡單介紹一下這種方式。
1.登錄Jenkins,點擊左側的新建,創建新的構建任務。
2.跳轉到如下界面,輸入自己的任務名稱和描述信息之後,選擇“流水線”選項並點擊下方的確定按鈕即創建了一個Pipeline任務。
3.跳轉到Pipeline的設置頁面,我們可以看到有四個tab,我們會針對每一個tab做詳細介紹。
General
General是Pipeline的一些基本配置。名稱,描述和一些基本設置。
以下簡單介紹幾個常用設置。其餘沒有介紹的設置項,大家可以參考Jenkins的官方文檔或者幫助文檔。
①.GitHub 項目
該pipeline的源代碼託管在Github中,選中此選項,可以添加github中的項目地址
②.Preserve stashes from completed builds
想保留最近幾次歷史構建就可以勾選此項並填入想要保留的構建次數。每次構建都需要佔不少的空間,因此不建議大量保存構建歷史。
③.丟棄舊的構建
我這裏設置了丟棄構建,僅保留最近一週的構建歷史,不限定構建次數。
構建觸發器
構建觸發器很好理解,就是pipeline構建的觸發條件。以下簡單介紹一下各個觸發條件。這些觸發條件可以根據項目需要選擇多個,組合使用。
我的代碼託管在gitlab中,我希望在代碼有更新時自動觸發構建,所以選擇了“輪詢SCM”。
高級項目選項
這個是給項目設置一個展示名稱,沒有特殊作用,不需要過多關注。
流水線
這一部分是Pipeline的主要部分,在這一步我們將開始定義流水線
定義流水線使用的是Groovy腳本,保存腳本有兩種方式,第一種是直接寫在Jenkins工程中,另一種是存放在代碼倉庫項目目錄下的Jenkinsfile中,實際項目中大多選擇將腳本存放在項目目錄中,但這僅限於項目數量不多的情況下使用。如果項目過多,Jenkinsfile散落在各個項目中,也會不便維護,這時候可以創建目錄集中保存Jenkinsfile,便於查找和維護。
選擇定義流水線的方式
我使用的是【PipelinescriptfromSCM】,只添加了代碼倉庫地址和令牌信息,其餘保持默認。
當然,在你考慮用這種方式創建流水線之前,你必須已經設計好的流水線的步驟,並且寫好了可靠的Jenkinsfile。
Pipeline支持兩種語法,一種是Declarative Pipeline(在Pipeline 2.5中引入)和Scripted Pipeline。Declarative Pipeline對用戶來說,語法更嚴格,有固定的組織結構,更容易生成代碼段,使其成爲用戶更理想的選擇。Scripted pipeline更加靈活,因爲Groovy本身只能對結構和語法進行限制,對於更復雜的pipeline來說,用戶可以根據自己的業務進行靈活的實現和擴展。由於篇幅有限所以在此只介紹使用最爲廣泛的Declarative Pipeline。
在寫Jenkinsfile之前我們先來熟悉一些名詞。
● Agent: 在Jenkins集羣中,一個agent相當於一個slave機器,接收並執行master機器分派的任務。
● Stage: Pipeline中的不同階段,例如:“構建”,“測試”和“部署”。
● Step: 步驟,Step是最基本的操作單元,小到創建一個目錄,大到構建一個Docker鏡像,由各類Jenkins Plugin提供。
下面是我編寫的一個由 【編譯】 —— 【編譯Docker鏡像】 —— 【部署】 —— 【測試】 這幾個階段組成的一條流水線。不熟悉PipelineScript的同學,可以先熟悉一下語法,語法不是文章關注的重點。
pipeline {
agent any //agent 必須放在pipeline的頂層定義或stage中可選定義,放在stage中就是不同階段使用
stages { //Pipeline 的主體部分,聲明不同階段,比如 構建,部署,測試
stage('Build') { //編譯階段
steps {
sh 'pwd'
git(url: 'https://xxx.xxx.xxx.xxx/xxxxxxxx/xxxxxxx', poll: true, credentialsId: '0000000-0000-0000-0000-000000000000') //拉取代碼
echo '使用你的編譯工具進行編譯' //編譯
archiveArtifacts(artifacts: 'testProject', onlyIfSuccessful: true) //編譯製品歸檔
}
}
stage('Docker Build') //編譯docker 鏡像文件
agent any
steps {
unstash 'test'
sh "docker login"
sh "docker build"
sh "docker push "
sh "docker rmi"
}
}
stage('Deploy') { //部署階段
agent { //在stage中特別聲明agent,該stage就在聲明的agent中去執行
docker {
image 'image_name'
}
}
steps { //執行步驟
sh "mkdir -p ~/.kube"
echo '添加部署步驟完成部署 '
echo '啓動服務'
}
stage('Test') { //測試階段
steps {
echo '測試階段'
git(url: 'https://xxx.xxx.xxx.xxx/xxxxxxxx/xxxxxxx', poll: true, credentialsId: '0000000-0000-0000-0000-000000000000')
echo '執行測試用例'
}
}
}
environment { //環境變量,在satge中使用${variable name}來調用
image_name = 'testProject'
project_path = '../testProject'
K8S_CONFIG = credentials('jenkins-k8s-config')
GIT_TAG = sh(returnStdout: true,script: 'git describe --tags --always').trim()
}
}
值得注意的是,執行Pipeline的過程中會有一些中間產物,如apk包、docker鏡像文件,這些統一叫做製品。 製品會被保存在JenkinsWorkplace中,如果要使用製品,需要添加【製品歸檔】的步驟,這樣就可以通過頁面下載製品。
如此便可定義一條Pipeline,經典模式下創建Pipeline是使用最爲廣泛的一種方式。但是這種方式使用起來有一定門檻,那就是你必須熟悉PipelineScript的語法規則。那如果你說我是一個新手,並沒有語言基礎,是不是就不能自己創建Pipeline了?當然不是,下面要介紹的第二種方式,就不需要你手寫代碼了,Jenkins會自動幫你生成。
使用BlueOcean插件,創建pIpeline
還記得文章開頭安裝的BlueOcean插件嗎?這個插件提供了一個可視化的界面,可以通過交互式的方式創建Pipeline,大大降低了使用門檻。下面我們就來體驗一下吧!
在Jenkins主頁,點擊“打開BlueOcean”就可以進入如下界面
點擊‘創建新的流水線’就跳轉到了創建頁面
選擇代碼倉庫,填入地址和令牌,創建一條流水線。
創建完之後,添加階段,並根據你的需要添加不同的步驟。
可視化創建Pipeline比較“傻瓜式”,操作起來非常簡單,這裏就不再詳細介紹,有興趣的小夥伴可以自己實操一下練一練。
需要注意的是,使用BlueOcean創建Pipeline會自動生成一個Jenkinsfile文件,最後會保存在代碼倉庫的項目目錄下面。裏面生成的步驟跟我們上面手寫的Jenkinsfile一樣。每次修改流水線工作流程並提交修改會修改一次Jenkinsfile,並在代碼倉庫中生成一條修改記錄。
以上就是創建Pipeline的兩種方式,各位小夥伴可根據自己項目的需要選擇不同發方式。在項目數量比較少的情況下,可以使用BlueOcean來創建。如果項目很多或者Pipeline結構比較複雜,使用這種方法就會非常慢,而且Jenkinsfile散落在各個項目目錄中,維護起來不方便,這時候更推薦使用經典模式自己寫Jenkinsfile的方式創建和維護。