zoukankan      html  css  js  c++  java
  • 流水线基础-Pipeline

    1. 认识Pipleine

    1.1 Pipeline是什么?

    • Pipeline是Jenkins的核心功能,提供一组可扩展的工具。
    • 通过Pipeline 的DSL语法可以完成从简单到复杂的交付流水线实现。
    • jenkins的Pipeline是通过Jenkinsfile(文本文件)来实现的。
    • 这个文件可以定义Jenkins的执行步骤,例如检出代码。

    1.2 Jenkinsfile

    • Jenkinsfile使用两种语法进行编写,分别是声明式和脚本式。
    • 声明式和脚本式的流水线从根本上是不同的。
    • 声明式是jenkins流水线更友好的特性。
    • 脚本式的流水线语法,提供更丰富的语法特性。
    • 声明式流水线使编写和读取流水线代码更容易设计。

    1.3 为什么使用Pipeline?

    本质上,jenkins是一个自动化引擎,它支持许多自动模式。流水线向Jenkins添加了一组强大的工具,支持用例、简单的持续集成到全面的持续交付流水线。 通过对一系列的发布任务建立标准的模板,用户可以利用更多流水线的特性,比如:

    • 代码化: 流水线是在代码中实现的,通常会存放到源代码控制,使团队具有编辑、审查和更新他们项目的交付流水线的能力。
    • 耐用性:流水线可以从Jenkins的master节点重启后继续运行。
    • 可暂停的:流水线可以由人功输入或批准继续执行流水线。
    • 解决复杂发布: 支持复杂的交付流程。例如循环、并行执行。
    • 可扩展性: 支持扩展DSL和其他插件集成。

    构建一个可扩展是Jenkins的核心价值,流水线可以通过ShareLibrary的方式来扩展。 下面是一个CD的场景实例 

    2.Pipeline概念

    pipeline演示

    来我们一起看下这里的配置,看下Jenkinsfile的组成及每个部分的功能含义。

    • 使用agent{},指定node节点/workspace(定义好此流水线在某节点运行)
    • 指定options{}运行选项(定义好此流水线运行时的一些选项,例如输出日志的时间)
    • 指定stages{}(stages包含多个stage,stage包含steps。是流水线的每个步骤)
    • 指定post{}(定义好此流水线运行成功或者失败后,根据状态做一些任务)

      pipeline{
      //指定运行此流水线的节点
      agent any
          
      
      //流水线的阶段
      stages{
      
          //阶段1 获取代码
          stage("CheckOut"){
              steps{
                  script{
                      println("获取代码")
                  }
              }
          }
          stage("Build"){
              steps{
                  script{
                      println("运行构建")
                  }
              }
          }
      }
      post {
          always{
              script{
                  println("流水线结束后,经常做的事情")
              }
          }
              
          success{
              script{
                  println("流水线成功后,要做的事情")
              }
              
          }
          failure{
              script{
                  println("流水线失败后,要做的事情")
              }
          }
              
          aborted{
              script{
                  println("流水线取消后,要做的事情")
              }
              
          }
      }
      }
      

        

    参考文档:http://www.idevops.site/jenkins/pipelinesyntax/chapter01/

     

    声明式流水线

     

    声明式Pipleine是官方推荐的语法,声明式语法更加简洁。所有的声明式Pipeline都必须包含一个 pipeline块中,比如:

     

    pipeline {
        //run
    }
    

     

    在声明式Pipeline中的基本语句和表达式遵循Groovy的语法。但是有以下例外:

     

    • 流水线顶层必须是一个块,特别是pipeline{}。
    • 不需要分号作为分割符,是按照行分割的。
    • 语句块只能由阶段、指令、步骤、赋值语句组成。例如: input被视为input()。

     

    agent代理

     

    agent指定了流水线的执行节点。

     

    agent { node { label 'labelname' }}
    
    aget { label ' labelname '}
    

     

    参数:

     

    • any 在任何可用的节点上执行pipeline。none 没有指定agent的时候默认。
    • label 在指定标签上的节点上运行Pipeline。 node 允许额外的选项(自定义workspace)。

     

    post运行后处理

     

    当流水线完成后根据完成的状态做一些任务。例如:构建失败后邮件通知

     

    post { 
        always { 
            echo 'I will always say Hello again!'
        }
    
        failure{
            email : xxxx@dxx.com
        }
    }
    

     

    常用的状态:

     

    • always 无论流水线或者阶段的完成状态。
    • changed 只有当流水线或者阶段完成状态与之前不同时。
    • failure 只有当流水线或者阶段状态为”failure”运行。
    • success 只有当流水线或者阶段状态为”success”运行。
    • unstable 只有当流水线或者阶段状态为”unstable”运行。例如:测试失败。
    • aborted 只有当流水线或者阶段状态为”aborted “运行。例如:手动取消。

     

    stages阶段

     

    stages是流水线的整个运行阶段,包含一个或多个 stage , 建议 stages 至少包含一个 stage

     

    stages { 
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
    

     

    environment环境变量

     

    定义流水线环境变量,可以定义在全局变量或者步骤中的局部变量。这取决于 environment 指令在流水线内的位置。

     

    agent any
    
    //全局变量
    environment { 
        activeEnv = 'dev'
    }
    stages {
        stage('Example') {
    
            //局部变量
            environment { 
                AN_ACCESS_KEY = credentials('my-prefined-secret-text') 
            }
            steps {
                sh 'printenv'
            }
        }
    }
    

     

    options运行选项

     

    定义流水线运行时的配置选项,流水线提供了许多选项, 比如buildDiscarder,但也可以由插件提供, 比如 timestamps。

     

    agent any
    options {
        timeout(time: 1, unit: 'HOURS') 
    }
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
    
    

     

    其他部分参数:

     

    • buildDiscarder: 为最近的流水线运行的特定数量保存组件和控制台输出。
    • disableConcurrentBuilds: 不允许同时执行流水线。 可被用来防止同时访问共享资源等。
    • overrideIndexTriggers: 允许覆盖分支索引触发器的默认处理。
    • skipDefaultCheckout: 在agent 指令中,跳过从源代码控制中检出代码的默认情况。
    • skipStagesAfterUnstable: 一旦构建状态变得UNSTABLE,跳过该阶段。
    • checkoutToSubdirectory: 在工作空间的子目录中自动地执行源代码控制检出。
    • timeout: 设置流水线运行的超时时间, 在此之后,Jenkins将中止流水线。
    • retry: 在失败时, 重新尝试整个流水线的指定次数。
    • timestamps 预测所有由流水线生成的控制台输出,与该流水线发出的时间一致。

     

    parameters参数

     

    为流水线运行时设置项目相关的参数,就不用在UI界面上定义了,比较方便。

     

    //string 字符串类型的参数, 例如:
    parameters { string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: '') }
    
    //booleanParam 布尔参数, 例如:
    parameters { booleanParam(name: 'DEBUG_BUILD', defaultValue: true, description: '') }
    
    

     

    agent any
    parameters {
        string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?')
    }
    stages {
        stage('Example') {
            steps {
                echo "Hello ${params.PERSON}"
            }
        }
    }
    

     

    trigger触发器

     

    构建触发器

     

    //cron 计划任务定期执行构建。
    triggers { cron('H */4 * * 1-5') }
    
    
    //pollSCM 与cron定义类似,但是由jenkins定期检测源码变化。
    triggers { pollSCM('H */4 * * 1-5') }
    
    
    
    
    agent any
    triggers {
        cron('H */4 * * 1-5')
    }
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
    

     

    tool构建工具

     

    构建工具maven、ant、gradle,获取通过自动安装或手动放置工具的环境变量。支持maven/jdk/gradle。工具的名称必须在系统设置->全局工具配置中定义。

     

    agent any
    tools {
        maven 'apache-maven-3.0.1' 
    }
    stages {
        stage('Example') {
            steps {
                sh 'mvn --version'
            }
        }
    }
    

     

    input交互输入

     

    input用户在执行各个阶段的时候,由人工确认是否继续进行。

     

    agent any
    stages {
        stage('Example') {
            input {
                message "Should we continue?"
                ok "Yes, we should."
                submitter "alice,bob"
                parameters {
                    string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?')
                }
            }
            steps {
                echo "Hello, ${PERSON}, nice to meet you."
            }
        }
    }
    

     

    参数解释:

     

    • message 呈现给用户的提示信息。
    • id 可选,默认为stage名称。
    • ok 默认表单上的ok文本。
    • submitter 可选的,以逗号分隔的用户列表或允许提交的外部组名。默认允许任何用户。
    • submitterParameter 环境变量的可选名称。如果存在,用submitter 名称设置。
    • parameters 提示提交者提供的一个可选的参数列表。

     

    when条件判断

     

    when 指令允许流水线根据给定的条件决定是否应该执行阶段。 when 指令必须包含至少一个条件。

     

    //branch: 当正在构建的分支与模式给定的分支匹配时,执行这个阶段,这只适用于多分支流水线例如:
    when { branch 'master' }
    
    
    //environment: 当指定的环境变量是给定的值时,执行这个步骤,例如:
    when { environment name: 'DEPLOY_TO', value: 'production' }
    
    //expression 当指定的Groovy表达式评估为true时,执行这个阶段, 例如:
    when { expression { return params.DEBUG_BUILD } }
    
    //not 当嵌套条件是错误时,执行这个阶段,必须包含一个条件,例如:
    when { not { branch 'master' } }
    
    //allOf 当所有的嵌套条件都正确时,执行这个阶段,必须包含至少一个条件,例如:
    when { allOf { branch 'master'; environment name: 'DEPLOY_TO', value: 'production' } }
    
    //anyOf 当至少有一个嵌套条件为真时,执行这个阶段,必须包含至少一个条件,例如:
    when { anyOf { branch 'master'; branch 'staging' } }
    
    
    stage('Example Deploy') {
        when {
            branch 'production'
            environment name: 'DEPLOY_TO', value: 'production'
        }
        steps {
            echo 'Deploying'
        }
    }
    

     

    parallel并行

     

    声明式流水线的阶段可以在他们内部声明多隔嵌套阶段, 它们将并行执行。 注意,一个阶段必须只有一个 steps 或 parallel的阶段。 嵌套阶段本身不能包含 进一步的 parallel 阶段, 但是其他的阶段的行为与任何其他 stageparallel 的阶段不能包含 agent 或 tools阶段, 因为他们没有相关 steps。

     

     stage('Parallel Stage') {
        when {
            branch 'master'
        }
        failFast true
        parallel {
            stage('Branch A') {
                agent {
                    label "for-branch-a"
                }
                steps {
                    echo "On Branch A"
                }
            }
            stage('Branch B') {
                agent {
                    label "for-branch-b"
                }
                steps {
                    echo "On Branch B"
                }
            }
        }
    }
    

     

    failFast true 当其中一个进程失败时,强制所有的 parallel 阶段都被终止。

     

    script脚本标签

     

    可以通过此标签嵌入脚本式语法。

     

    stage("Build"){
        steps{
            script{
                println("运行构建")
            }
        }
    }

     

  • 相关阅读:
    Locust 场景执行:Web UI 中执行
    第1章 计算机网络和因特网
    目录
    计算机网络--自定向下的方法
    mysql索引总结
    7_异常处理
    6_面向对象-下之类的结构:内部类
    6_面向对象-下之关键字:interface
    6_面向对象-下之关键字:abstract
    6_面向对象-下之关键字:final
  • 原文地址:https://www.cnblogs.com/lxc123/p/14466307.html
Copyright © 2011-2022 走看看