【Jenkins】Pipeline流水线语法解析全集 -- 声明式流水线

news2024/11/22 16:17:19

在这里插入图片描述

👨‍🎓博主简介

  🏅CSDN博客专家
  🏅云计算领域优质创作者
  🏅华为云开发者社区专家博主
  🏅阿里云开发者社区专家博主
💊交流社区:运维交流社区 欢迎大家的加入!
🐋 希望大家多多支持,我们一起进步!😄
🎉如果文章对你有帮助的话,欢迎 点赞 👍🏻 评论 💬 收藏 ⭐️ 加关注+💗


文章目录

  • 前言
  • 声明式流水线
  • 如何创建一个node节点?
    • agent
    • stages
    • stage
    • steps
    • post
    • environment
    • tools
    • input
    • parameters
    • options
    • parallel
    • tiggers
    • when
    • script
  • 总结
  • 参考文献:
  • 相关专栏
  • 相关文章

前言

Jenkins提供了两种开发Pipeline的方式:脚本式和声明式。

  1. 脚本式流水线(也称为“传统”流水线)基于Groovy作为其特定于域的语言。
  2. 而声明式流水线提供了简化且更友好的语法,并带有用于定义它们的特定语句,而无需学习Groovy。声明式流水线语法错误在脚本开始时报告。这是一个很好的功能,因为您不会浪费时间,直到某个步骤未能意识到拼写错误或拼写错误。如前所述,流水线可以以声明式或脚本式编写。而且,声明式方法建立在脚本式方法的基础之上,通过添加”script”步骤,可以很容易地进行扩展。

声明式流水线 vs 脚本式流水线共同点:

  • 两者都是pipeline代码的持久实现,都能够使用pipeline内置的插件或者插件提供的steps,两者都可以利用共享库扩展。

区别:

  • 两者不同之处在于语法和灵活性。

  • Declarative pipeline对用户来说,语法更严格,有固定的组织结构,更容易生成代码段,使其成为用户更理想的选择。

  • 但是Scripted pipeline更加灵活,因为Groovy本身只能对结构和语法进行限制,对于更复杂的pipeline来说,用户可以根据自己的业务进行灵活的实现和扩展


声明式流水线

声明式流水线
必须使用pipeline语句定义有效的声明式流水线,并包括以下必需的部分:

  • agent

  • stages

  • stage

  • steps

另外,还有这些可用的指令:

  • environment (用于设置环境变量,可定义在stage或pipeline部分。)
  • post(整个pipeline执行完成或者单个stage完成后需要执行的动作。)
  • tools(可定义在pipeline或stage部分。它会自动下载并安装我们指定的工具,并将其加入PATH变量中。)
  • input(定义在stage部分,会暂停pipeline,提示你输入内容。)
  • options(用于配置Jenkins pipeline本身的选项,比如options {retry(3)}指当pipeline失败时再重试2次。options指令可定义在stage或pipeline部分。)
  • parallel(并行执行多个step。在pipeline插件1.2版本后,parallel开始支持对多个阶段进行并行执行。)
  • parameters(与input不同,parameters是执行pipeline前传入的一些参数。)
  • script(用于执行一段 Groovy 脚本代码)
  • triggers(用于定义执行pipeline的触发器。)
  • when(当满足when定义的条件时,阶段才执行。)

在使用指令时,需要注意的是每个指令都有自己的“作用域”。如果指令使用的位置不正确,Jenkins将会报错。

更多的配置案例可参考:流水线语法(jenkins.io)

现在,我们将从所需的指令/部分开始,对列出的每个指令/部分进行描述。

这里我们就拿hello world的pipeline脚本举例,我们来看看pipeline脚本的组成;

hello world脚本就是明显的声明式流水线。

pipeline {
    agent any

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

脚本都是以pipeline的关键字开头,接着看下pipeline内部具体由哪几部分组成。

如何创建一个node节点?

为什么要创建node节点呢?因为下面要用到;简单来说,创建node节点打标签方便对服务器进行分类,在写jenkinsfile的时候便于管理服务器,对指定服务器进行指定操作;

如何创建呢?我们来讲一下;

首先,登录jenkins – > Manage Jenkins --> nodes,在里面配置。

image-20231226113332353

image-20231226113350109

点进来之后,直接new node创建即可。

image-20231226113443840

这里可以自己写节点名称,这里测试我就写test1了。

image-20231226113506143

image-20240125111153073

写完之后点击create创建即可,创建完之后会跳转到里面进行配置node信息。

image-20231226115217676

点击保存即可;

  • 使用ssh登录需要设置两台服务器之间免密登录;否则会报错连接失败;

双方都需要配置免密登录。

免密登录命令:
1.进入.ssh目录: cd ~/.ssh # 如果新机器没有这个命令,可以直接生产密钥,最自动创建这个目录。
2.生成一对密钥: ssh-keygen -t rsa
3.发送公钥: ssh-copy-id 172.16.xx.xxx
4.免密登录测试: ssh 172.16.xx.xxx

配置完之后可以进行连接了。

保存完点击刚刚创建的node节点,点进去,然后点击侧边的日志,可以看到连接情况;

image-20240125111950335

image-20231226130556616

连接成功会显示已同步:

agent

agent 部分指明了pipeline脚本在哪台机器或者容器内执行,因为jenkins的工作模式是master-agent模式,master可以把流水线任务的执行放到其代理节点上执行。

同时jenkins的节点(master节点或者agent代理节点)可以打上标签,如下表示的是pipeline脚本需要在标签为test1的节点上运行。 – > 测试前需要有这个test1节点,如果没有会报错,或根据自己的节点标签来修改一下。

pipeline {  
    agent {  
        label 'test1'  
    }  
  
    stages {  
        stage('Hello') {  
            steps {  
                echo 'Hello World'  
            }  
        }  
    }  
}

agent模块也可以写到stage里,表示特定stage模块都在指定的agent节点上运行,如下所示:

pipeline {
   agent any
    stages {
        stage('Hello') {
             agent {
                 label 'test1'
      }
            steps {
                echo 'Hello World'
            }
        }
    }
}

在文章开头的hello world的脚本中,agent我们指定了any,这表示可以在任意节点上运行pipeline脚本。agent模块不可省略不写。

stages

接着来看下stages模块,stages模块由多个stage组成,一个stage表示一个阶段,比如我们通常将发布的整个流程分为编译,传输,部署等几个阶段。

stage

一个stages可以有多个stage;一个stage表示一个阶段,比如我们通常将发布的整个流程分为编译,传输,部署等几个阶段。

steps

一个阶段由多个步骤组成,在pipeline语法中,步骤通过steps模块表示,steps包含了一个或多个步骤,在上述hello world的pipeline脚本中,echo ‘Hello World’ 就是一个步骤,比如我们想要执行shell命令就要运行sh步骤,如下所示:

  • 一个steps包含一个执行步骤
pipeline {
    agent any

    stages {
        stage('Hello') {
            steps {
                sh 'ping 127.0.0.1 -c 10'
            }
        }
    }
}
  • 一个steps包含多个执行步骤
pipeline {
    agent any

    stages {
        stage('Hello') {
            steps {
                sh 'ping 127.0.0.1 -c 10'
                sh 'hostname -I'
            }
        }
    }
}

pipeline的步骤是可插拔的,可以通过安装某些插件来执行特定的步骤。【Blue Ocean】

post

除了上述模块,还可以在stages或者steps模块后面定义post模块来表示整个pipeline执行完成或者单个stage完成后需要执行的动作。

pipeline {
    agent any

    stages {
        stage('post') {
            steps {
                sh 'ping 127.0.0.1 -c 5 && hostname -I'
            }
            post{
            	
            }
        }
    }
}

此时的post模块是不可以构建的,因为里面是空的什么条件都没有,会报错,所以里面需要加一些条件块(根据自己的情况来定义);

post模块可以定义多个条件块,条件块里写上要执行的步骤,条件块有以下几种,

  • always: 无论当前执行结果是什么状态都执行
  • emailext:邮件服务,执行发送邮件(需要安装mail插件)
  • changed: 只有当前流水线或阶段的完成状态与它之前的运行不同时,才允许在 post 部分运行该步骤。
  • fixed: 上一步为失败或不稳定(unstable) ,当前状态为成功时
  • regression: 上一次完成状态为成功,当前完成状态为失败、不稳定或中止(aborted)时执行。
  • aborted: 当前执行结果是中止状态时(一般为人为中止)执行,通常web UI是灰色。
  • failure:当前完成状态为失败时执行,通常web UI是红色。
  • success:当前完成状态为成功时执行,通常web UI是蓝色或绿色。
  • unstable:当前完成状态为不稳定时执行,通常由于测试失败,代码违规等造成。通常web UI是黄色。
  • cleanup:清理条件块。不论当前完成状态是什么,在其他所有条件块执行完成后都执行。
  • post - always
pipeline {
    agent any

    stages {
        stage('post-->always') {
            steps {
                sh 'ping 127.0.0.1 -c 5 && hostname -I'
            }
            post{
                always{
                    echo "无论当前什么结果,我都会执行!"
                }
            }
        }
    }
}

image-20240126143719547

  • post - failure/success/unstable

这里再着重解释下unstable 状态,通常我们将测试失败的状态设定为unstable,可以把它理解成日志等级的warn状态。如下我们可以主动设置stage和构建结果为unstable状态。

pipeline {
    agent any

    stages {
        stage('Test') {
            steps {
				echo "Test"
            }
        }
        stage('Hello2') {
            steps {
                echo 'hello'
            }
        }
    }
    
    post {
        failure {
            echo "failure"
        }
        success {
            echo "success"
        }
        unstable {
            echo "unstable"
        }
    }
}

image-20240126095209114

  • post - aborted

手动终端运行中的服务;

pipeline {
    agent any

    stages {
        stage('ping') {
            steps {
				sh 'ping 172.16.11.120'
            }
        }
    }
    
    post {
        aborted {
            echo "我被手动中断了!!!"
        }
        failure {
            echo "failure"
        }
        success {
            echo "success"
        }
        unstable {
            echo "unstable"
        }
    }
}

image-20240126143320776

  • post - always - emailext

发送邮件测试。需要提前安装好 mail 邮件的插件。

pipeline {
    agent any

    stages {
        stage('post-->always') {
            steps {
                sh 'ping 127.0.0.1 -c 5 && hostname -I'
            }
            post{
                always{
                    echo "无论当前什么结果,我都会执行!"
                    sh 'hostname -I | awk -F " " \'{print $1}\''
                    emailext(
                        to: "*********@qq.com",
                        subject: "执行成功通知: " + currentBuild.fullDisplayName,
                        body: 
                        """
                        <h2>Build Result: ${currentBuild.result}</h2> 
                        <p>Full Display Name: ${currentBuild.fullDisplayName}</p> 
                        <p>URL: ${currentBuild.absoluteUrl} </p>
                        <p>Change: ${currentBuild.changeSets}</p>
                        <p>user: </p>
                        """
                    )
                }
            }
        }
    }
}

image-20240126150106957

① 按照惯例,post 部分应该放在流水线的底部。

environment

environment 用于设置环境变量,可定义在stage或pipeline部分。

  • 在 pipeline 中定义 environment, 表示 pipeline 全局使用的环境变量
  • 在 stage 中定义 environment, 表示当前 stage 的环境变量

environment 指令指定一系列键值对,这些键值对将被定义为所有step或stage-specific step的环境变量,具体取决于environment指令在Pipeline中的位置。
该指令支持一种特殊的方法credentials(),可以通过其在Jenkins环境中的标识符来访问预定义的凭据。
对于类型为“Secret Text”的凭据,该 credentials()方法将确保指定的环境变量包含Secret Text内容;对于“标准用户名和密码”类型的凭证,指定的环境变量将被设置为username:password。

  • 在“pipeline”级别中:(全局都可以用:全局变量)
pipeline {
    agent any
    
    environment {
    	IP = '127.0.0.1'
    	IP_Port = '8080'
    }
    
    stages {
        stage('environment-->pipeline') {
            steps {
                sh 'ping ${IP} -c 5 && hostname -I'
                sh 'curl ${IP}:${IP_Port}'
            }
        }
    }
}
  • 在“stage”级别中:(只可以在写environmentstage 中使用)

  • stage – > environment 正确示范

pipeline {
    agent any
    
    stages {
        stage('environment-->stage1') {
        	environment {
    			IP = '127.0.0.1'
			}
            steps {
                sh 'ping ${IP} -c 5 && hostname -I'
            }
        }
        stage('environment-->stage2') {
        	environment {
    			IP2 = '127.0.0.1'
    			IP_Port = '8080'
			}
        	steps {
                sh 'curl ${IP2}:${IP_Port}'
        	}
        }
    }
}

image-20240220100551154

代码分析:

image-20240220101045685

  • stage – > environment 错误示范
pipeline {
    agent any
    
    stages {
        stage('environment-->stage1') {
        	environment {
    			IP = '127.0.0.1'
			}
            steps {
                sh 'ping ${IP} -c 5 && hostname -I'
            }
        }
        stage('environment-->stage2') {
        	steps {
        		sh 'ping ${IP} -c 5 && hostname -I'
        	}
        }
    }
}

image-20240220100655699

代码分析:

image-20240220101555304


除了自定义的这几个环境变量之后,我们还有系统自带的全局环境变量,可访问:http://ip:port/job/项目名/pipeline-syntax/globals

注:ip:port 替换为自己的ip和端口;项目名就换成自己的项目名就行;

也可以通过其他方式进入:进入到流水线编辑页面,翻到最下面点击流水线语法,点进去会跳转到一个新的页面,展示的是一个生产流水线语法的脚本,再往下面翻,到最后,可以看到一个全局变量,点击文字中有一段: Global Variables Reference即可进入全局环境变量的页面;这里有使用说明,下面给大家说一些常用的。

  • 系统的环境变量有三种引用方式:

  • ${env.BUILD_NUMBER} 方式一,(推荐使用)

  • $env.BUILD_NUMBER 方式二,

  • ${BUILD_NUMBER} 方式三,(不推荐使用)

  • 内置的环境变量

变量说明
BUILD_ID当前构建的 ID,与 Jenkins 版本 1.597+ 中创建的构建号 UILD_NUMBER 是完全相同的。
BUILD_NUMBER当前构建号,比如 “153”。
BUILD_TAG字符串 jenkins-${JOB_NAME}-${BUILD_NUMBER}。可以放到源代码、jar 等文件中便于识别。
BUILD_URL可以定位此次构建结果的 URL(比如 http://buildserver/jenkins/job/MyJobName/17/ )
EXECUTOR_NUMBER用于识别执行当前构建的执行者的唯一编号(在同一台机器的所有执行者中)。这个就是你在“构建执行状态”中看到的编号,只不过编号从 0 开始,而不是 1。
JAVA_HOME如果你的任务配置了使用特定的一个 JDK,那么这个变量就被设置为此 JDK 的 JAVA_HOME。当设置了此变量时,PATH 也将包括 JAVA_HOME 的 bin 子目录。
JENKINS_URLJenkins 服务器的完整 URL,比如 https://example.com:port/jenkins/ (注意:只有在“系统设置”中设置了 Jenkins URL 才可用)。
JOB_NAME本次构建的项目名称,如 “foo” 或 “foo/bar”。
NODE_NAME运行本次构建的节点名称。对于 master 节点则为 “master”。
WORKSPACEworkspace 的绝对路径。

tools

可以在流水线级别或阶段级别添加“tools”指令。它允许您指定要在脚本上使用的Maven,JDK或Gradle版本。必须在“全局工具配置”Jenkins菜单上配置这些工具中的任何一个,在撰写本文时,这三个工具都受支持。另外,Jenkins将尝试安装列出的工具(如果尚未安装)。通过使用此指令,可以确保安装了项目所需的特定版本。

pipeline {
    agent any
    tools {
        maven 'apache-maven-3.0.1'  工具名称必须在Jenkins 管理Jenkins → 全局工具配置中预配置。
    }
    stages {
    	stage("tools") {
    		steps {
	         echo 'do something'
    		}
    	}
    }
}

这个一般用的好像很少,我基本没用过。

input

“input”指令在阶段级别(stage)定义,提供提示输入的功能。该阶段将被暂停,直到用户手动确认为止。以下为配置选项可用于此指令:

  • message:这是必需的选项,其中指定了要显示给用户的消息。
  • id:可选标识符。默认情况下,使用“阶段”名称。
  • ok:“确定”按钮的可选文本。
  • submitter:参数允许你指定哪些用户或用户组可以提交输入以继续 Pipeline 的执行。这个参数可以是一个以逗号分隔的用户列表或用户组名。如果你不提供 submitter 参数,那么默认情况下,任何用户都可以提交输入来继续 Pipeline。通过设置 submitter 参数,你可以实现权限控制,确保只有特定的用户或用户组能够批准 Pipeline 的继续执行。这对于需要特定人员审批或审核的 Pipeline 流程非常有用。
  • submitterParameter:要使用提交者名称设置的环境变量的可选名称(如果存在)。
  • parameters:允许你指定一个参数列表,这些参数会在 input 表单中显示,并要求用户在提交输入时提供相应的值。这些参数可以是各种类型,如单行文本、布尔值、选项参数等。它们为用户提供了一个界面,以便在继续 Pipeline 执行之前输入必要的信息。

这是包含此指令的示例流水线:

pipeline {
    agent any
    stages {
        stage ('input') {
            input{
                message "请输入用户名密码:"
                submitter "user1,user2"
                parameters {
                   string(name:'username', defaultValue: 'user', description: 'Username of the user pressing Ok')
                   string(name:'passwd', defaultValue: '123123123', description: 'Username of the user pressing Ok')
                }
            }
            steps { 
                echo "User: ${username} said Ok."
                echo "User: ${passwd} said OK."
            }
        }
    }
}
  • 解析:

input:存在于阶段级别(stage)中定义;

message:这个是必须的选项,没有此参数就会运行失败;用于给用户提示输入什么;

submitter:允许提交的用户名,如果不是submitter中的用户名提交则失败;

parameters:提供一个新的界面输入指定参数。

执行构建查看运行台,会卡到这,让你点进去输入执行参数,此input requestedparameters设定的。

image-20240222133008528

点击进入跳转到此,会有一个默认的用户名和密码,是在parameters中设定的默认值。

image-20240222133343179

点击继续即可;

image-20240222133848575

parameters

parameters与input不同,parameters是执行pipeline前传入的一些参数。parameters 指令通常定义在 pipeline 的顶层,也就是不在任何 stage 或 step 内部。这意味着这些参数在 pipeline 开始执行之前就需要被指定,并且可以在整个 pipeline 中访问。parameters指令提供用户在触发Pipeline时的参数列表。这些参数值通过该params对象可用于Pipeline步骤
目前只支持[booleanParam, choice, credentials, file, text, password, run, string]这几种参数类型,其他高级参数化类型还需等待社区支持。

Jenkins 支持多种类型的参数,包括:

  • string:单行文本输入。
  • boolean:布尔值选择(通常是复选框)。
  • choice:从预定义选项列表中选择。
  • password:密码输入,通常用于敏感信息的输入。
  • file:允许用户上传文件。

下面是一个简单的示例,展示了如何在 Jenkins Pipeline 中使用 parameters 指令:

pipeline {  
    agent any  
  
    // 定义参数  
    parameters {  
        string(name: 'PERSON', defaultValue: 'World', description: '输入你的名字')  
        choice(name: 'GREETING', choices: ['Hello', 'Hi', 'Good morning'], description: '选择问候语')  
    }  
  
    stages {  
        stage('Greeting') {  
            steps {  
                // 使用参数  
                echo "Hello, ${PERSON}, nice to meet you."  
                echo "Using greeting: ${GREETING}"  
            }  
        }  
    }  
}

在这个例子中,我们定义了两个参数:PERSONGREETINGPERSON 是一个字符串参数,默认值为 ‘World’,用户可以在执行 pipeline 时输入自己的名字。GREETING 是一个选择参数,提供了三个预定义选项。

Greeting 阶段中,我们使用 echo 步骤来输出这些参数的值。${PERSON}${GREETING} 是参数的引用,它们会被替换为用户在执行 pipeline 时输入的实际值。

通过在 pipeline 中使用 parameters 指令,你可以让用户提供自定义输入,使得 pipeline 更加灵活和可配置。

  • 保存点击构建

image-20240226103614135

  • 第一次会构建失败,然后我们可以看到,构建的标志变了,变成了Build with Parameters,然后再次点击一下即可,就会跳到以下界面;

image-20240226103808763

  • 第一个是输入你的名字,可以随便写一个;第二个是一个选项框,提供了三个选项,可以任意选;

image-20240226103833763

  • 然后在开始点击构建,就会输入echo里的数据及变量信息;

image-20240226104207259

执行成功。

options

用于配置Jenkins pipeline本身的选项,比如options {retry(3)}指当pipeline失败时再重试2次。options指令可定义在stage或pipeline部分。

disableConcurrentBuilds
- 不允许并行执行Pipeline,可用于防止同时访问共享资源等。例如:options { disableConcurrentBuilds() }

skipDefaultCheckout
- 默认跳过来自源代码控制的代码。例如:options { skipDefaultCheckout() }

skipStagesAfterUnstable
一旦构建状态进入了“Unstable”状态,就跳过此stage。例如:options { skipStagesAfterUnstable() }
timeout
- 设置Pipeline运行的超时时间。例如:options { timeout(time: 1, unit: ‘HOURS’) }

retry
- 失败后,重试整个Pipeline的次数。例如:options { retry(3) }

timestamps
- 预定义由Pipeline生成的所有控制台输出时间。例如:options { timestamps() } |

pipeline {
    agent any
    options {
        retry(3)  //将流水线配置为在失败前重试3次:
    }
    stages {
        echo 'do something'
    }
}

parallel

parallel 并行执行多个step。在pipeline插件1.2版本后,parallel开始支持对多个阶段进行并行执行。

Jenkins流水线阶段可以在内部嵌套其他阶段,这些阶段将并行执行。我们来举一个简单的例子:

注意:在Jenkins的Pipeline语法中,parallel 应该被放置在 stages 块内部的一个 stagesteps 块中。所以要非常注意!

pipeline {  
    agent any  
  
    stages {  
        stage('Example Stage') {  
            steps {  
                // 第一个步骤  
                echo 'This is the first step.'  
  
                // 第二个步骤,依赖于第一个步骤成功执行  
                sh 'echo This step runs after the first one.'  
  
                // 第三个步骤,与前两个步骤并行执行(需要使用 parallel)  
                parallel {  
                    stage('Parallel_test 1') {  
                        steps {  
                            echo 'This is parallel test1.'  
                        }  
                    }  
                    stage('Parallel_test 2') {  
                        steps {  
                            sh 'echo "This is parallel test2."'  
                        }  
                    }  
                }  
  
                // 第四个步骤,依赖于所有并行步骤成功执行  
                echo 'All parallel steps have completed.'  
            }  
        }  
    }  
}

tiggers

tiggers主要用于定义执行pipeline的触发器。

触发器允许Jenkins通过使用以下任何一个可用的方式自动触发流水线:

  • cron:通过使用cron语法,它可以定义何时重新触发管道。
  • pollSCM:通过使用cron语法,它允许您定义Jenkins何时检查新的源存储库更新。如果检测到更改,则将重新触发流水线。(从Jenkins 2.22开始可用)。
  • upstream:将Jenkins任务和阈值条件作为输入。当列表中的任何任务符合阈值条件时,将触发流水线。

带有可用触发器的示例流水线如下所示(需要注意的是,第一次执行了之后会在每分钟都执行一遍任务):

  • cron:按照cron给的时间执行;
pipeline {
    agent any
    triggers {
		//每分钟执行一次
        cron('* * * * *')
    }
    stages {
        stage('test tiggers-cron') {
            steps {
                echo 'Tish is test tiggers project -- cron.'
            }
        }
    }
}
  • pollSCM:如果检测到更改,则将重新触发流水线;
pipeline {
    agent any
    triggers {
        //每分钟执行一次
        pollSCM('* * * * *')
    }
    stages {
        stage('test tiggers-pollSCM') {
            steps {
                echo 'Tish is test tiggers project -- pollSCM.'
            }
        }
    }
}
  • upstream:当列表中的任何任务符合阈值条件时,将触发流水线。
pipeline {
    agent any
    triggers {
        //Execute when either job1 or job2 are successful
        upstream(upstreamProjects: 'job1, job2', threshold: hudson.model.Result.SUCCESS)
    }
    stages {
        stage('test tiggers-upstream') {
            steps {
                echo 'Tish is test tiggers project -- upstream.'
            }
        }
    }
}

when

当满足when定义的条件时,阶段才执行(相当于一个判断)。when指令必须至少包含一个条件。如果when指令包含多个条件,则所有子条件必须为stage执行返回true。这与子条件嵌套在一个allOf条件中相同更复杂的条件结构可使用嵌套条件建:not,allOf或anyOf。嵌套条件可以嵌套到任意深度

  • 内置条件

  • branch

    - 当正在构建的分支与给出的分支模式匹配时执行,例如:when { branch ‘master’ }。请注意,这仅适用于多分支Pipeline。

可读方式解析:相当于指定一个分支,如果是这个分支就执行此操作;

  • environment
    - 当指定的环境变量设置为给定值时执行,例如: when { environment name: ‘DEPLOY_TO’, value: ‘production’ }

可读方式解析:相当于,当使用此环境变量时,环境变量的值等于设置的值就会执行;

  • expression
    - 当指定的Groovy表达式求值为true时执行,例如: when { expression { return params.DEBUG_BUILD } }

可读方式解析:表达式返回的值为true(真)时就执行此操作;

  • not
    - 当嵌套条件为false时执行。必须包含一个条件。例如:when { not { branch ‘master’ } }

可读方式解析:当指定的值不是not里的值就可以执行;

  • allOf
    - 当所有嵌套条件都为真时执行。必须至少包含一个条件。例如:when { allOf { branch ‘master’; environment name: ‘DEPLOY_TO’, value: ‘production’ } }

可读方式解析:相当于或者,只要满足某一个条件的值就可以执行此操作;条件最少要写两个。

  • 使用方法:

1.when 仅用于stage内部       2. when 的内置条件

  • when {branch ‘master’} #当是master的时候,才执行某些事情
  • when {envionment name:‘DEPLOY_TO’,value:‘production’} #当环境变量name 的值是production的时候,才执行某些事情
  • when {expression {return params.DEBUG_BUILD}} #表达式的返回值是真的情况下,才执行
  • when {not {branch ‘master’}}#不是master的情况下,执行
  • when {allOf {branch ‘master’; environment name: ‘DEPLOY_TO’,value:‘production’}} #当大括号中所有的项都成立,才去做某些事情
  • when {anyOf {branch ‘master’; branch ‘staging’}} #只要满足大括号里面的某一个条件,才去做某些事情

例如,流水线使您可以在具有多个分支的项目上执行任务。这被称为多分支流水线,其中可以根据分支名称(例如“master”,“ feature*”,“development”等)采取特定的操作。这是一个示例流水线,它将运行master分支的步骤:

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

如果是在master分支上执行,就执行此操作;因为我们没有使用多分支,所以这个执行结果是跳过此执行操作;

在这里插入图片描述

  • not - branch
pipeline {
    agent any
    stages {
        stage('when - not - branch') {
            when {
                not {
                    branch 'master'
                }
            }
            steps {
                echo 'This is not a master node'
            }
        }
    }
}

如果此任务不是在master分支上执行的,就执行steps中的内容;因为我们没有设置分支,所以就会执行输出steps中的内容;

image-20240307100517366

  • allOf
pipeline {
    agent any
    stages {
        stage('when - allOf') {
            when {
                allOf {
                    branch 'master';environment name: 'DEPLOY_TO', value: 'production'
                }
            }
            steps {
                echo '包含以上其中一个条件!'
            }
        }
    }
}

此执行结果为跳过此操作;因为没有分支,所以没有master,此条件为false;环境变量没有用到所以结果也为false;所以最终此条件为跳过;

image-20240307101435744

script

在pipeline 声明式语法中,当需要执行代码块条件判断时可以使用when指令,那么除了when,我们还可以使用groovy语法的脚本,脚本内还可以执行for循环、if判断还有异常处理等操作,配置代码如下,脚本需要被script块包括起来;

那么学习script块,我们就还需要学习groovy语法,所以,首先我们就需要先来了解一下语法,也就是脚本式流水线,可以查看下一章:【Jenkins】Pipeline流水线语法解析全集 – 脚本式流水线、groovy语法

总结

  这一节,基本上对jenkinspipeline声明式流水线语法做了比较完整的介绍,在以后再看pipeline脚本时,可能还会接触到许多插件提供的函数或更多的指令,但是它们都逃不开pipeline脚本的基本结构,掌握了基础语法,后面才能更上一层楼。

参考文献:

文章参考与:

【Jenkins系列】-Pipeline语法全集

jenkins 原理篇——pipeline流水线 声明式语法详解
Jenkins扩展篇-Groovy语法简介

相关专栏

专栏名称专栏地址
《Jenkins》https://blog.csdn.net/liu_chen_yang/category_12493057.html
《自动化运维》https://blog.csdn.net/liu_chen_yang/category_12473478.html
《Linux从入门到精通》https://blog.csdn.net/liu_chen_yang/category_10887074.html

相关文章

文章名称文章链接
【Jenkins】Pipeline流水线语法解析全集 – 声明式流水线https://liucy.blog.csdn.net/article/details/136528857
【Jenkins】Pipeline流水线语法解析全集 – 脚本式流水线、groovy语法https://liucy.blog.csdn.net/article/details/136567517

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1673439.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式学习<2>:EXTI、ADC、NVIC和AFIO

嵌入式学习_part2 本部分笔记用于学习记录&#xff0c;笔记源头 >>b站江科大_STM32入门教程_EXTI EXTI、ADC、NVIC和AFIO 开发环境&#xff1a;keil MDK、STM32F103C8T6 1 &#xff09;EXTI STM32F10xxx参考手册&#xff08;中文&#xff09;-> 中断与事件 ->…

死锁调试技巧:工作线程和用户界面线程

有人碰到了一个死锁问题&#xff0c;找到我们想请我们看看&#xff0c;这个是关于应用程序用户界面相关的死锁问题。 我也不清楚他为什么会找上我们&#xff0c;可能是因为我们经常会和窗口管理器打交道吧。 下面&#xff0c;我们来看看死锁的两个线程。 >> 请移步至 …

【SpringSecurity源码】过滤器链加载流程

theme: smartblue highlight: a11y-dark 一、前言及准备 1.1 SpringSecurity过滤器链简单介绍 在Spring Security中&#xff0c;过滤器链&#xff08;Filter Chain&#xff09;是由多个过滤器&#xff08;Filter&#xff09;组成的&#xff0c;这些过滤器按照一定的顺序对进…

LeetCode算法题:49. 字母异位词分组(Java)

给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate", "nat", …

试试这四个AI论文工具和降重技术,低成本高回报

在科研领域&#xff0c;AI写作工具如同新一代的科研利器&#xff0c;它们能够极大提高文献查阅、思路整理和表达优化的效率&#xff0c;本质上促进了科研工作的进步。AI写作工具不仅快速获取并整理海量信息&#xff0c;还帮助我们精确提炼中心思想&#xff0c;显著提升论文写作…

Windows系统安装MongoDB数据库

MongoDB是一个基于分布式文件存储的NoSQL数据库&#xff0c;由C语言编写的。MongoDB的数据存储基本单元是文档&#xff0c;它是由多个键值对有序组合的数据单元&#xff0c;类似于关系数据库中的数据记录。适合存储JSON形式的数据&#xff0c;数据格式自由&#xff0c;不固定。…

自制无感无刷电机驱动板

自制无感无刷电机驱动板 分别测试了基于C251的STC32G单片机、Arduino AVR的ATmega328PB、以及ARM的ST32F103单片机。 &#x1f9f2;测试转动效果 ✒目前市面上开源的有关无刷电机的项目数不胜数&#xff0c;其控制原理都大同小异&#xff0c;在没有领透其技术要领情况下&#x…

怎么申请一年期免费的https证书

随着互联网的推广和普及&#xff0c;如今HTTPS证书的普及度还是比较高的了&#xff0c;大家对于https证书的需求度也在日益提升。针对于一些个人用户或是企业而言&#xff0c;实现网站的https访问已经成为了一种标配。从去年年底开始&#xff0c;各大SSL证书厂商陆续下架一年期…

用Python和GUI实现Socket多线程通信方案

下面是一个使用 Python 和 Tkinter GUI 库实现 Socket 多线程通信的简单示例。在这个示例中&#xff0c;我是创建了一个简单的聊天应用&#xff0c;其中服务器和客户端可以通过 Socket 进行通信。 1、问题背景 这个问题与在 Python 应用中使用 pyGTK、线程和套接字相关。开发者…

GD32驱动LCD12864

目录 1、引言 1.1、LCD12864基本概念和作用。 1.2、硬件引脚 2、GD32微控制器简介 3、LCD12864显示屏简介 3.1、模块引脚说明 3.2、模块连接方式 4、驱动原理 4.1、指令集 4.2、显示坐标关系 5、软件开发 6、硬件连接 7、效果演示 8、附录 1、引言 1.1、LCD12…

地下车库导航地图怎么做?停车场地图绘制软件哪个好?

上海懒图科技以先进技术和丰富的行业服务经验为用户提供停车场景下的全流程服务平台&#xff0c;用户基于平台可自主快速绘制酷炫的停车场地图&#xff0c;通过提供完善的停车场应用功能集和扩展API服务包&#xff0c;可以方便地实现电子地图服务于您的各类停车场应用中&#x…

【SRC实战】小游戏漏洞修改分数打榜

挖个洞先 https://mp.weixin.qq.com/s/Um0HU2srvZ0UlZRAsbSVug “ 以下漏洞均为实验靶场&#xff0c;如有雷同&#xff0c;纯属巧合 ” 01 — 漏洞证明 “ 如何刷分提高排名&#xff1f;” 1、进入小游戏&#xff0c;类似于跳一跳 2、开始时每次加1分 3、随着游戏进行…

中国GDP空间分布数据集

中国GDP空间分布公里网格数据集是在全国分县GDP统计数据的基础上&#xff0c;考虑人类活动密切相关的土地利用类型、夜间灯光亮度、居民点密度数据与GDP的空间互动规律&#xff0c;通过空间插值生成的空间格网数据。数据包括1995、2000、2005、2010、2015和2019年6期。该数据集…

Vue3实战笔记(20)—封装头部导航组件

文章目录 前言一、封装头部导航栏二、使用步骤总结 前言 Vue 3 封装头部导航栏有助于提高代码复用性、统一风格、降低维护成本、提高可配置性和模块化程度&#xff0c;同时还可以实现动态渲染等功能&#xff0c;有利于项目开发和维护。 一、封装头部导航栏 封装头部导航栏&am…

11个免费的 android数据恢复应用程序功能分析

在手机上丢失数据是一个很大的错误。但是&#xff0c;在这种情况下&#xff0c;除了惊慌失措之外&#xff0c;最好开始使用android数据恢复应用程序搜索以查找将其取回的方法。您可以检查手机的备份存储以在Android上进行数据恢复&#xff0c;但是如果数据仍然无处可寻&#xf…

spring cloud alibaba、spring cloud和springboot三者的版本兼容

官方版本说明地址: 版本说明 alibaba/spring-cloud-alibaba Wiki GitHub 组件版本关系 每个 Spring Cloud Alibaba 版本及其自身所适配的各组件对应版本如下表所示(注意,Spring Cloud Dubbo 从 2021.0.1.0 起已被移除出主干,不再随主干演进): Spring Cloud Alibaba Ve…

如何利用AI生成答辩PPT?笔灵AI答辩PPT,智能识别关键点

很多快要毕业的同学在做答辩PPT的时候总是感觉毫无思路&#xff0c;一窍不通。但这并不是你们的错&#xff0c;对于平时没接触过相关方面&#xff0c;第一次搞答辩PPT的人来说&#xff0c;这是很正常的一件事。一个好的答辩PPT可以根据以下分为以下几部分来写。 1.研究的背景和…

业绩超预期外,海尔智家ESG实践再获认可

求增长&#xff0c;已成各行业面对的共同命题。 在家电赛道上&#xff0c;海尔智家的业绩表现不俗。2024一季度&#xff0c;海尔智家延续了年报稳健增长的趋势&#xff0c;继续在高基数下实现高增长&#xff0c;其利润增幅更是高达20.2&#xff05;&#xff0c;超预期。而今年…

图像质量评价指标:了解图像质量的度量方式

图像质量评价指标&#xff1a;了解图像质量的度量方式 在图像处理和计算机视觉领域&#xff0c;评价图像质量的准确性对于许多应用至关重要。通过合适的评价指标&#xff0c;我们可以量化图像的质量&#xff0c;从而更好地了解图像处理算法的效果和改进空间。本文将介绍图像质…

File类~路径、创建文件对象

路径分为相对路径&#xff08;不带盘符&#xff09;&#xff0c;绝对路径&#xff08;带盘符&#xff09; 路径是可以存在的&#xff0c;也可以是不存在的 创建文件对象的三个方法&#xff1a;