Jenkins 共享庫最佳實踐


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文章中),這樣運維只要專注與模板庫的邏輯代碼編寫就好了

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM