如何使用表述性Pipeline

本文详细介绍了Jenkins表述性Pipeline的语法和指令,包括agent、stages、stage、steps等必需部分,以及environment、input、options、parallel、parameters、post、script、tools、triggers、when等可选指令。强调了表述性Pipeline的友好性和易于理解,并提供了多个使用示例,阐述了Pipeline在CI/CD环境中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Jenkins提供了两种开发pipeline代码的方法,脚本化的和表述性的。

脚本化pipeline也就是我们传说中的传统pipeline,支持Groovy语法。

表述性pipeline提供了更简单的更友好的语法,提供了更多表述性的语法,用户不一定非要去学习和写Groovy。

Jenkins pipeline plugin version 2.5及以上版本开始支持表述性pipeline。

本文,将介绍在表述性pipeline中所有指令。

表述性pipeline的语法

一个合法的表述性pipeline必须定义一个pipeline语句,并且包含以下所需要的部分:

  • agent

  • stages

  • stage

  • steps

以及如下可选用的指令:

  • environment(stage/pipeline级别)

  • input(stage级)

  • options(stage/pipeline级别)

  • parallel

  • parameters

  • post

  • script

  • tools

  • triggers

  • when

  •  

指令详解

让我们来看一下列举指令使用的例子。

  • agent

    pipeline {
        agent any
        ---
    }
    
  • stages

    pipeline {
        agent any
        stages {
            ...
        }
    }
    
  • stage

    pipeline {
        agent any
        stages {
            stage ('build') {
                ...
            }
            stage ('test: integration-&-quality') {
                ...
            }
            stage ('test: functional') {
                ...
            }
            stage ('test: load-&-security') {
                ...
            }
            stage ('approval') {
                ...
            }
            stage ('deploy:prod') {
                ...
            }
        }
    }
    
  • steps

    steps必须用在stage级别

    steps {     
    sh 'echo "A one line step"'
    sh ''' 
    echo "A multiline step"'
    cd /tests/results
    ls -lrt
    '''
    }
    
  • Environment

    Enviroment必须用在pipeline或者stage级别

    pipeline {
        agent any
        environment {
            OUTPUT_PATH = './outputs/'
        }
        stages {
            stage ('build') {
                ...
            }
        ...
        }
    }
    
    

    或者

    pipeline {
      agent any
      stages {
          stage ('build') {           
      environment {
          OUTPUT_PATH = './outputs/'
      }
      ...
          }
          ...
      }
    }
    
  • input

    input指令定义在stage级别,提供发起输入的功能。这个stage会暂停,直到用户手动输入并确认 The "input" directive is defined at a stage level and provides the functionality to prompt for an input. The stage will be paused until a user manually confirms it.

    pipeline {
       agent any
       stages {
           stage ('build') {         
       input{
           message "Press Ok to continue"
           submitter "user1,user2"
           parameters {
               string(name:'username', defaultValue: 'user', description: 'Username of the user pressing Ok')
           }
       }
       steps { 
           echo "User: ${username} said Ok."
       }
           }
       }
     }
    
  • Options

    定义在pipeline级别,该指令会将某些指令为该pipeline进行分组。 可用的选项有:

    • buildDiscarder
    • disableConcurrentBuilds
    • overrideIndexTriggers
    • skipDefaultCheckout
    • skipStagesAfterUnstable
    • checkoutToSubdirectory
    • newContainerPerStage
    • timeout
    • retry
    • timestamps

    例如,在pipeline失败之前,重新执行三次

    pipeline {
    agent any
    options {
        retry(3)
    }
    stages {
        ---
    }
    }
    
  • Parallel

    以下脚本会在在不同操作系统上,执行不同的测试。我们还可以在同一个Node上同时执行不同的stages。 但是,当我们使用并发stages,我们需要满足以下限制:

    • stage指令可以含有parallel或者steps,但是不能同时两个都有。
    • 在parallel内部定义的stage不能再定义parallel,只能定义steps.
    • stage指令可以含有parallel指令,但不能同时在使用agent或着tools指令-
    pipeline {
         agent none
         stages {
             stage('Run Tests') {
             parallel {
                 stage('Test On Windows') {
                     agent { label "windows" }
                         steps {
                             bat "run-tests.bat"
                         }
                     }
                 stage('Test On Linux') {
                     agent { label "linux" }
                         steps {
                             sh "run-tests.sh"
                         }
                     }
                 }
             }
         }
     }
    
  • Parameters

    Pamaters指令支持我们定义一组在脚本中使用的参数。Parameters应在Pipeline在触发时被提供。其应该在'pipeline'级别定义,且一个pipeline只允许一个paramters指令。 字符串和布尔变量是可用的变量类型。

pipeline {
  agent any
  parameters {
      string(name: 'user', defaultValue: 'John', description: 'A user that triggers the pipeline')
  }
  stages {
      stage('Trigger pipeline') {
          steps {
              echo "Pipeline triggered by ${params.USER}"
          }
      }
  }
}
  • Post

    Post可用在pipeline或者stage级别,当pipeline或者stage完成后,这一部分会根据条件判断是否执行。 这些条件如下:

    • always: 无论成败,都会执行
    • changed: 只有该次和上次执行结果不同时,才会执行
    • fixed: 只有上次失败,这次成功,才会执行
    • regression: 只有上次成功,这次失败,被取消或者不稳定才会执行
    • aborted: 被取消时,才会执行
    • failure: 失败时,才会执行
    • success: 成功时,才会执行
    • unstable: 不稳定,才会执行

    由于在pos块中的句子总会在最后执行,所以,清理工作,通知工作等通常定义在此。

    pipeline {
        agent any
        stages {
            stage('Some steps') {
                steps {
                    ...
                }
            }
        }
        post {
            always {
                echo “Pipeline finished”
                bat ./performCleanUp.bat
            }
        }
    }
    
  • Script

    要用在stage级别。这些语法块允许我们扩展Jenkins功能并作为共享lib分享。

    pipeline {
      agent any
          stages {
              stage('Sample') {
                  steps {
                      echo "Scripted block"
                      script {
    
                      }
                  }
              }
          }
      }
    
  • Tools

    要用在pipeline或者stage级别,用来指定哪个maven, jdk或者gradle版本。

    pipeline {
     agent any
     tools {
         maven 'apache-maven-3.0.1' 
     }
     stages {
     ...
     }
    }
    
  • Triggers

    Triggers允许Jenkins通过以下配置自动触发pipelines:

    • cron: 定义pipeline定时触发
    • pollSCM: 当定义cron时,允许Jenkins检测仓库源的更新。如果有更新,则触发pipeline
    • upstream: 将一组Jenkins jobs的列表作为输入阈值,当列表中任一个任务执行结束后,该pipeline会被触发。
    pipeline {
      agent any
      triggers {
          //Execute weekdays every four hours starting at minute 0
          cron('0 */4 * * 1-5')
      }
      stages {
      ...
      }
    }
    

    或者

    pipeline {
       agent any
       triggers {
           //Query repository weekdays every four hours starting at minute 0
           pollSCM('0 */4 * * 1-5')
       }
       stages {
       ...
       }
    }
    

    或者

    pipeline {
      agent any
      triggers {
      //Execute when either job1 or job2 are successful
      upstream(upstreamProjects: 'job1, job2', threshold: hudson.model.Result.SUCCESS)
      }
      stages {
      ...
      }
    }
    
    • When

    在stage级别使用。如果满足when则steps执行,如果不满足,steps则不执行。例如,pipeline允许在一个project中多个branch,即multibranched pipeline。则根据不同的branch,可执行不同的操作,如下:

    pipeline {
      agent anagent any
      stages {
          stage ('Deploy stage') {
              when {
                  branch 'master'
              }
              steps {
                  echo 'Deploy master to stage'
                  ...
              }
          }
      }
    }
    

注意事项

  • 表述性pipeline如果存在语法错误,一旦触发,就会立即报错。
  • Pipeline支持表述性的指令也支持脚本。表述性指令内部嵌套脚本步骤是种不错的事件。
  • 在CI/CD环境中,Jenkins pipeline有广泛的应用场景

英语原文为:https://www.blazemeter.com/blog/how-to-use-the-jenkins-declarative-pipeline

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值