Jenkins共享庫最佳實踐
我是一個使用了兩年Jenkins的一個運維人員,從Jenkins Freestyle的方式切換到了Jenkins Pipeline的模式,之后因為機緣巧合接觸到了Share libs 的方法(一個老大哥教的我),之后又了解到了Share libs 分為共享庫與模板庫,在最后在google上看到了官方人員推薦的Share libs最佳實踐,所以整理一下,說一下為何叫做最佳實踐
共享庫簡介
官方的解釋(我沒有使用過resources這個目錄)
(root)
+- src # Groovy source files
| +- org
| +- foo
| +- Bar.groovy # for org.foo.Bar class
+- vars
| +- foo.groovy # for global 'foo' variable
| +- foo.txt # help for 'foo' variable
+- resources # resource files (external libraries only)
| +- org
| +- foo
| +- bar.json # static helper data for org.foo.Bar
在使用共享庫的時候我們會用到兩個目錄
- src
- var
我的理解
src 定義了一些方法
vars 定義了一些變量
當我們使用src把公共代碼編程方式在Jenkinsfile 里調用時,這種方式叫做共享庫
當我們使用把所有的邏輯放在了vars 中使用時,這種方式叫做模板庫
我喜歡用模板庫,因為在我的理解中Devops的職責就是標准化開發流程與規定,而模板庫的使用必須要做到標准才有效果,所以我一直工作中使用模板庫的方法進行工作
模板庫
模板庫寫法
在vars 下創建一個 TEST.groovy 文件
+- vars
| +- TEST.groovy
模板庫代碼
#!groovy
def call(String type,Map map) {
if (type == "test") {
pipeline {
agent {
node {
label "${map.node}"
}
}
//步驟設置
stages {
stage('測試') {
steps {
println "test"
}
}
}
}
}
}
}
模板庫使用方法
在代碼庫中放入Jenkinsfile文件
#!groovy
library 'fotoable-libs'
def map = [:]
map.put('node',"master")
TEST("test",map)
以上是最近本的模板庫的使用方法,這是一種標准格式的寫法,並且我最開始使用的時候也是使用這種方法,但是這種方法會有一些弊端
- 使用方法不利於讀寫
- 當項目越來越多的時候模板庫會產生很多的重復代碼
為了解決這幾種問題,我進階了,去google上亂找了一圈,然后就找了一個可擴產,可重復,並且讓Jenkinsfile易讀的方法
模板庫最佳實踐
這種方法其實是基於模板庫的使用方法做了一些擴展,首先我們讓Jenkinsfile 通過一個入口文件去進入到模板庫,之后定義個yaml格式的配置文件,在模板庫中使用Read Yaml 的方式把它轉化成 map后傳給模板庫,這樣我們會得到這種目錄結構
代碼端
+- vars
| +- runPipeline.groovy # 入口文件
| +- pipelineCfg.groovy # 把yaml 文件轉成 map
| +- pythonPipeline.grooy # 按照語言去分類的模板庫
使用端
代碼庫根目錄上放兩個文件
Jenkinsfile
pipelineCfg.yaml
講一下這五個文件
runPipeline.groovy
#!groovy
def call() {
node{
stage('Checkout') {
checkout scm
}
def cfg = pipelineCfg()
switch(cfg.type) {
case "python":
pythonPipeline(cfg)
break
case "nodejs":
nodejsPipeline(cfg)
break
}
}
}
pipelineCfg.groovy
def call() {
Map pipelineCfg = readYaml file: "pipelineCfg.yaml"
return pipelineCfg
}
pythonPipeline.grooy
def call(String type,Map map) {
if (type == "test") {
pipeline {
agent {
node {
label "${map.node}"
}
}
//步驟設置
stages {
stage('測試') {
steps {
println "test"
}
}
}
}
}
}
}
Jenkinsfile
#!groovy
library 'shared-libs'
runPipeline()
pipelineCfg.yaml
type: test
node: master
以上文件就是模板庫最佳實踐方式,這種方式又顯著的優點
- 代碼復用率低
- 配置文件與入口文件分離
- 配置文件為Yaml格式,易讀性強
- 擴展性強,使用“if when switch”函數可以無限擴展邏輯代碼,最終變成一種語言調用一種pipeline
說一下我的實踐
我在wiki軟件中定義了一個ci/cd 的使用方法,研發通過觀看文檔去編寫自己的pipelineCfg.yaml 文件,編寫成功后在通過hubot機器人去創建Jenkins job(Hubot用法之前有寫過在Chatops文章中),這樣運維只要專注與模板庫的邏輯代碼編寫就好了