zoukankan      html  css  js  c++  java
  • Jenkins Pipeline 持续集成

    Jenkins Pipeline 持续集成

    Pipeline Script 执行流程

    在使用Pipeline之前请确保Jenkins是2.x版本以上,并且安装了Pipeline插件。
    Jenkins提供了pipeline对象,作为配置的入口。它接受一个闭包,在闭包内定义配置:

    pipeline {
      // do some thing 
    }
    

    闭包内的方法层级结构(由DSL定义):

    • stages
      • stage
        • steps
          • step

    一个例子:

    pipeline {
        agent any
        stages {
            stage('1. 初始化') {
                steps {
                    script {
    					println("Hello")
                    }
                }
            }
        }
    }
    

    我们创建了一个Jenkins Pipeline Build,在脚本里面写上:

    println(pipeline)
    

    构建之后日志打印:

    org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter@403c4fdc
    

    实际上pipelineModelInterpreter一个实例,相当于可以给一个对象传递闭包!通过搜索找到该类所在的项目 pipeline-model-definition-plugin ,克隆下来,找到类ModelInterpreter 简略如下:

    class ModelInterpreter implements Serializable {
        private CpsScript script
    
        ModelInterpreter(CpsScript script) {
            this.script = script
        }
    
        def call(CpsClosure closure) {
            Root root = (Root) closure.call()
        }
    

    推测给对象传递的闭包会调用call方法,为验证此猜想编写一下代码:

    class Person{
    
        def call(Closure c){
            c.call()
        }
    
        static void main(args){
            def p = new Person()
            p{
                print("Hello")
            }
        }
    }
    

    执行结果:

    Hello
    

    由此确认对象是可以接受闭包,并处理的。在call方法的第一行写着:

    Root root = (Root) closure.call()
    

    也就是说我们传给pipeline实例的闭包也是有要求的,必须是CpsClosure这种格式的闭包,并且它返回一个Root对象:

    class Root implements Serializable {
        Agent agent
        Stages stages
    }
    

    也就是说我们定义的pipeline闭包配置,最终被Jenkins执行后会得到一个配置对象。

    when 条件判断

    多分支
    Jenkins 可以同时监控多个分支。在集成的过程中,有的分支提交代码可能需要测试,通过之后才能合并;有的分支提交代码可能是可以部署了,我们可以根据不同的分支决定持续集成的操作,通过when方法可以设置stage执行的条件:

    pipeline{
      stages{
        stage("init"){
          when {
             branch 'dev'// 当代码的分支为dev 执行当前stage
          }
        }
      }
    }
    

    创建build时需要配合多分支Pipeline使用,这个特性可以通过Pipeline可视化体现出来。

    构建参数
    创建Build时候可以设置构建参数,通过参数化构建过程增加一个选项参数,设置名称为TargetImage,然后就可以设置when条件了:

    when { environment name: 'TargetImage', value: 'Test' }
    

    上面的条件意思为:当对参数TargetImage选择的选项为Test时才执行当前stage。

    支持多个git仓库

    我们可以在一个Build中依赖多个git仓库,并且将其代码克隆到不同的文件夹内。
    正常情况下客隆一个项目的写法:

    checkout([$class: 'GitSCM', branches: [[name: '*/dev']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'xxx', url: 'https://xxx.xxx.git']]])
    

    假如可以指定客隆到本地的目录,那么写多个checkout指令就可以在一个Build中支持多个源码仓库了;可以在checkout中指定一个extension来设置克隆源码到本地目录:

    extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'model-dissector']]
    

    完整的指令如下:

    checkout([$class: 'GitSCM', branches: [[name: '*/dev']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'model-dissector']], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'xxx', url: 'https://xxx.xxx.git']]])
    

    我们也可以使用Jenkins自带的代码模板生成,在流水线语法中选择名称为checkout: Checkout from version control,然后添加一个Additional Behaviours 选择 Checkout to a sub-directory就可以了。

    并行执行

    如果测试阶段有多个单元测试,为了提高速度可以将这些单元测试并行执行。
    通过Jenkins可以在Stage中创建并行执行的子Stage,并且为这些Stage分配不同的运行节点。

    pipeline{
      stages{
        stage("init"){
          parallel{ // 创建并行的子stages
            stage("init 1"){
                // do some thing
            }
            stage("init 2"){
                // do some thing
            }
          }
        }
      }
    }
    

    在上述配置的stagesinit 1 init 2 中可以分别执行不同的单元测试,并同时运行达到节省时间的目的,这个优势在单元测试较多时候表现比较明显。

  • 相关阅读:
    读书笔记:C++ Primer系列(10)—— 数组与指针(2)
    读书笔记:C++ Primer系列(9)—— 数组与指针(1)
    牛人博客
    读书笔记:C++ Primer系列(8)—— 标准库类型之bitset
    读书笔记:C++ Primer系列(7)—— 标准库类型之iterator
    读书笔记:C++ Primer系列(6)—— 标准库类型之vector
    读书笔记:C++ Primer系列(5)—— 标准库类型之string
    读书笔记:C++ Primer系列(4)—— 关于const限定符
    读书笔记:C++ Primer系列(3)—— 关于变量
    黑色半透明镂空遮罩指引效果实现jQuery小插件
  • 原文地址:https://www.cnblogs.com/oaks/p/12203439.html
Copyright © 2011-2022 走看看