pipeline 学习

pipeline 分为脚本式和声明式,相比于脚本式声明式更主流更强大一些。pipeline 自身有语法语句外还支持groovy 语法,groovy 是一个类似java 语言,更简洁,有各种数据结构,函数,流程控制语句以供使用。

Jenkins是使用Java实现的,所以在很早的时候就引入了groovy作为DSL,管理员可以使用groovy来实现一些自动化和高级的管理功能。因为groovy引擎已经集成到Jenkins,所以在pipeline一开始很自然就使用groovy来编写Jenkinsfile。但是groovy毕竟是一种语言,对于没有太多编程经验的小白这个学习曲线有点太陡峭。这个时候声明式的pipeline就出现了

声明式pipeline

pipeline {                  //所有的声明式Pipeline都必须包含 pipeline块中
   agent any                 //指定了流水线的执行节点(none 没有指定agent的时候默认。label 在指定标签上的节点上运行Pipeline。node 允许额外的选项)

//其他的一些指令
  environment                //指定一个键值对序列,该序列将被定义为所有步骤的环境变量,或者是特定于阶段的步骤,这取决于environment 指令在流水线的位置
                        //该指令支持一个特殊的方法 credentials() ,该方法可用于在Jenkins环境中通过标识符访问预定义的凭证。对于类型为 "Secret Text"的凭证,
                        // credentials() 将确保指定的环境变量包含秘密文本内容。  
  
  options                  //允许从流水线内部配置特定于流水线的选项。 流水线提供了许多这样的选项, 比如buildDiscarder,但也可以由插件提供, 比如 timestamps。
  triggers                  //触发器,有很多种,比如定时,webhook 等等
  
  tool                    //获取通过自动安装或手动放置工具的环境变量。支持maven/jdk/gradle。工具的名称必须在系统设置->全局工具配置中定义
  
  input                    //用户在执行各个阶段的时候,提供的一个交互方法,例如由人工确认是否继续进行。
  
  when                    //允许流水线根据给定的条件决定是否执行阶段。必须包含至少一个条件。 如果when 指令包含多个条件, 所有的子条件必须返回True,
                         //阶段才能执行。这与子条件在 allOf 条件下嵌套的情况相同。when 的条件可以使environment 或者分支等。
  parameters                   //就是参数化构建功能,有字符串、布尔值、多选等等web 界面存在的都可在此处相应方式实现
  parallel                    //声明式流水线的阶段可以在他们内部声明多隔嵌套阶段, 它们将并行执行。
  stages {                  //stages 里面可以定义多个stage是发版的主要操作区域
        stage('Example Build') {
            steps {              //stage 里面必须有steps{}里面可以通过 sh "xxx"  执行shell语句等操作是实际执行的操作步骤
                echo 'Hello World'
          sh  "service xxx stop"
            }
        }
        stage('Example Deploy') {
            when {
                branch 'production'
                environment name: 'DEPLOY_TO', value: 'production'
            }
            steps {
                echo 'Deploying'
          script {          //声明式不支持一些shell 语法,可以通过script{} 嵌入脚本式里面的一些语法例如for 循环、if 语句等
                      def browsers = ['chrome', 'firefox']
                      for (int i = 0; i < browsers.size(); ++i) {
                          echo "Testing the ${browsers[i]} browser"
                      }
          }
     } 
  post {                      //post是发版后的一些操作,根据发版结果做一些操作,主要条件有always/changed/failure/success
        always { 
            echo 'I will always say Hello again!'
        }
}
View Code

脚本式pipeline

脚本化流水线, 与声明式一样的是, 是建立在底层流水线的子系统上的。与声明式不同的是, 脚本化流水线实际上是由 Groovy构建的通用 DSL 。 Groovy 语言提供的大部分功能都可以用于脚本化流水线的用户。这意味着它是一个非常有表现力和灵活的工具,可以通过它编写持续交付流水线。

流程控制

脚本化流水线从Jenkinsfile的顶部开始向下串行执行, 就像 Groovy 或其他语言中的大多数传统脚本一样。 因此,提供流控制取决于 Groovy 表达式, 比如 if/else 条件, 例如:

node {
    stage('Example') {
        if (env.BRANCH_NAME == 'master') {
            echo 'I only execute on the master branch'
        } else {
            echo 'I execute elsewhere'
        }
    }
}
View Code

另一种方法是使用Groovy的异常处理支持来管理脚本化流水线流控制。当 步骤 失败 ,无论什么原因,它们都会抛出一个异常。处理错误的行为必须使用Groovy中的 try/catch/finally 块 , 例如:

node {
    stage('Example') {
        try {
            sh 'exit 1'
        }
        catch (exc) {
            echo 'Something failed, I should sound the klaxons!'
            throw
        }
    }
}
View Code

语句生成

pipeline 里面有各种功能各种语句,不便于记住,可以在jenkins 页面通过生成器配置生成,如下所示:

声明式中的一些语法使用要点

1、引入变量要用双引号  “${env}”否则不识别变量。

2、如果有些功能在声明式中未出现可以在声明式中调用脚本式使用脚本式中存在的一些语法,例如下面script{}就是通过这个引入脚本式语法的

pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
                script {
                    def browsers = ['chrome', 'firefox']
                    for (int i = 0; i < browsers.size(); ++i) {
                        echo "Testing the ${browsers[i]} browser"
                    }
                }
            }
        }
    }
}
View Code

 3、有的时候语法生成器生成的语法格式存在问题,例如触发器triggers 的固定格式统一为

triggers {
        cron('H */4 * * 1-5')
    }

但是使用generic  webhook trigger 的时候就不带括号,就会导致运行失败

triggers {
  GenericTrigger causeString: 'Generic Cause', genericVariables: [[defaultValue: '', key: 'message', regexpFilter: '', value: '$.message'], [defaultValue: '', key: '$.message', regexpFilter: 'refs/tags/', value: '$.ref']], printPostContent: true, regexpFilterExpression: '^(.*\\{\\{k8s-asdf:.*\\}\\}.*)$', regexpFilterText: '$message', token: 'k8s-asdf'
}

正确格式是在 GenericTrigger 后面加一个括号把后面内容全部包括进来

4、parameter 插件使用

在pipeline 中定义parameter 时,第一次执行任务的时候由于parameter 配置还会生成所以就会在引用里面的参数的代码处报错提示不存在,如果引用此参数的代码位于定义parameter 代码前面那么就会导致任务永远无法执行成功,因为代码到此处就会停止,不会执行后面的parameter 定义的代码也就不会生成parameter 的配置。如果是在后面那么第一次会报错,第二次执行的时候填入parameter 参数就会正常了。

猜你喜欢

转载自www.cnblogs.com/fanggege/p/12894506.html