zoukankan      html  css  js  c++  java
  • 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文章中),这样运维只要专注与模板库的逻辑代码编写就好了

     

  • 相关阅读:
    Codeforces Round #239(Div. 2) 做后扯淡玩
    hdu 3507 Print Article
    prufer序列
    POJ 2778 DNA Sequence
    Codeforces Round #237 (Div. 2)
    poj3352
    图论知识
    POJ 2186
    Codeforces Round #236 (Div. 2)
    POJ 2823 Sliding Window
  • 原文地址:https://www.cnblogs.com/yehewudi/p/12699971.html
Copyright © 2011-2022 走看看