Jenkins声明式Pipeline流水线语法示例

系列文章目录

docker搭建Jenkins2.346.3版本及常用工具集成配置(ldap、maven、ansible、npm等)
docker安装低版本的jenkins-2.346.3,在线安装对应版本插件失败的解决方法


文章目录

  • 系列文章目录
  • jenkins流水线基础
      • 1、pipeline
        • 1.1、什么是pipeline?
        • 1.2、为什么使用pipeline?
        • 1.3、pipeline定义
        • 1.4、jenkinsfile
        • 1.5、声明式pipeline示例
        • 1.6、参数解读
      • 2、声明式流水线语法
        • 2.1、pipeline语法-agent(代理)
        • 2.2、post
        • 2.3、stages(阶段)
        • 2.4、steps(步骤)
          • 2.4.1、script
        • 2.5、指令
          • 2.5.1、environment
          • 2.5.2、options
          • 2.5.3、参数
            • 参数构建化过程配置参数如下示例:
            • jenkinsfile中定义参数示例:
        • 2.6、触发器(trigger)
        • 2.7、tool
        • 2.8、input
        • 2.9、when
          • 内置条件
          • when使用示例
        • 2.10、parallel并行
  • 总结

jenkins流水线基础

首先,创建一个简单的流水线项目,体验并完成一条流水线项目的构建过程。如下图示
切记: 流水线的运行方式取决于定义的jenkinsfile

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

1、pipeline

提前安装插件 Pipeline:Declarative
1.1、什么是pipeline?
1、pipeline是jenkins的核心功能,提供一组可扩展的工具
2、通过pipeline的DSL语法完成从简到难的交付流水线实现
3、jenkins的pipeline是通过jenkinsfile来实现的
4、这个文件可以定义jenkins的执行步骤,例如:代码拉取、代码检查等
1.2、为什么使用pipeline?
本质上,jenkins是一个自动化引擎,它支持许多自动模式。流水线向Jenkins添加了一组强大的工具,支持用例、简单的持续集成到全面的持续交付流水线。 
通过对一系列的发布任务建立标准的模板,用户可以利用更多流水线的特性,比如:代码化: 流水线是在代码中实现的,通常会存放到源代码控制,使团队具有编辑、审查和更新他们项目的交付流水线的能力。耐用性: 流水线可以从Jenkins的master节点重启后继续运行。可暂停的: 流水线可以由人功输入或批准继续执行流水线。解决复杂发布: 支持复杂的交付流程。例如循环、并行执行。可扩展性: 支持扩展DSL和其他插件集成

在这里插入图片描述

1.3、pipeline定义
一条流水线通过Jenkinsfile描述
安装声明式插件Pipeline: Declarative
Jenkinsfile组成指定node节点/workspace指定指定运行选项指定stages阶段指定构建后操作
1.4、jenkinsfile
Jenkinsfile使用两种语法进行编写,分别是声明式和脚本式。
声明式和脚本式的流水线从根本上是不同的。
声明式是jenkins流水线更友好的特性。
脚本式的流水线语法,提供更丰富的语法特性。
声明式流水线使编写和读取流水线代码更容易设计。
声明式Pipeline: 使用agent指定运行的slave节点可以是label。
pipeline{agent anystages{//    }
}
脚本式Pipleine: 使用node指定运行slave可以是label
node("slave"){stage("GetCode"){//}
}
1.5、声明式pipeline示例
String workspace = "/home/vagrant/workspace" //Pipeline 
pipeline {agent { node { label "master"   //指定运行节点的标签或者名称customWorkspace "${workspace}" //指定运行工作目录(可选)}}options { timestamps()    //日志会有时间skipDefaultCheckout()  //删除隐式checkout scm 语句disableConcurrentBuilds()  //静止并行timeout(time: 1, unit: 'HOURS')  //流水线超时设置1h}stages { //下载代码stage("GetCode"){   //阶段名称steps{   //名称timeout(time:5, unit:"MINUTES"){   //步骤超时时间script{   //填写运行代码println('获取代码') } } } }//构建stage("Build"){ steps{timeout(time:20, unit:"MINUTES"){ script{ println('应用打包')}} }}//代码扫描stage("CodeScan"){steps{ timeout(time:30, unit:"MINUTES"){ script{ print('代码扫描')} }}}} //构建后操作post {always { script{ println("always") } } success {script{currentBuild.description += "\n 构建成功!" } }failure {script{ currentBuild.description += "\n 构建失败!" } }aborted { script{ currentBuild.description += "\n 构建取消!" } } } 
}
1.6、参数解读

Agent-Options

  • 指定node节点/workspace
  • 指定运行选项
  • 声明式Pipeline: 使用agent指定运行的slave节点可以是label
pipeline{agent { node { label "master"   //指定运行节点的标签或者名称customWorkspace "${workspace}" //指定运行工作目录(可选)}}options { timestamps()    //日志会有时间skipDefaultCheckout()  //删除隐式checkout scm 语句disableConcurrentBuilds()  //静止并行timeout(time: 1, unit: 'HOURS')  //流水线超时设置1h}}

脚本式Pipleine: 使用node指定运行slave可以是label

node("slave"){options { timestamps()    //日志会有时间skipDefaultCheckout()  //删除隐式checkout scm 语句disableConcurrentBuilds()  //静止并行timeout(time: 1, unit: 'HOURS')  //流水线超时设置1h}
}

Stages

  • stage定义了在整个流水线的执行任务的概念性的不同的阶段。例如: GetCodeBuildTestDeployCodeScan每个阶段。

  • 解释:上述示例添加了三个阶段

    • GetCode
    • Build
    • CodeScan
  • 声明式pipeline: 定义stages->stage

pipeline{agent anystages{stage("GetCode"){//steps  }stage("build"){//step}}
}
  • 脚本式Pipeline: 直接使用stage
node("slave"){stage("GetCode"){//}stage("build"){//}
}

step(步骤)

  • step是每个阶段中要执行的每个步骤。
  • 例如: 在执行GetCode的时候需要判断用户提供的参数srcType的值是Git还是svn
pipeline{
agent any
stages{stage("GetCode"){steps{ sh "ls "    //step} }    }
}
  • 脚本式Pipeline: 不需要step关键字。
node("slave"){
stage("GetCode"){//stepif("${srcType}" == "Git"){//用git方式代码检出} else if ("${srcType}" == "SVN"){//用svn方式代码检出} else {error "srcType is not in [Git|SVN]"}
}
}

Post

  • 指定构建后操作
  • 解释:
    • always{}:总是执行脚本片段
    • success{}:成功后执行
    • failure{}:失败后执行
    • aborted{}:取消后执行
  • currendBuild是jenkins内部的全局变量
    • description:构建描述

2、声明式流水线语法

2.1、pipeline语法-agent(代理)
agent指定了流水线的执行节点
参数:any  在任何可以节点上执行pipelinenone  没有指定agent的时候默认label 在指定标签的节点上执行pipelinenode  允许额外的选项
语法示例一:agent {node {label 'labelname'}}
语法示例二:agent {label 'labelname'}
2.2、post
	定义一个或多个steps,这些阶段根据流水线或阶段的完成情况而运行(取决于流水线中post部分的位置),post支持以下post-condition块其中之一:always、changed、failure、success、unstable、aborted,这些条件块允许在post部分的步骤的执行取决于流水线阶段的完成状态。always: 无论流水线或者阶段的完成状态。
changed: 只有当流水线或者阶段完成状态与之前不同时。
failure: 只有当流水线或者阶段状态为”failure”运行。
success: 只有当流水线或者阶段状态为”success”运行。
unstable: 只有当流水线或者阶段状态为”unstable”运行。例如:测试失败。
aborted: 只有当流水线或者阶段状态为”aborted “运行。例如:手动取消。
如下示例
pipeline {
agent any
stages {stage('Example') {steps {echo 'Hello World'}}
}
post { always { echo 'I will always say Hello again!'}
}
}
2.3、stages(阶段)
	包含一系列一个或多个stage指令,建议stages至少包含一个stage指令用于连续交付过程的每个离散部分,比如:构建、测试、部署等
pipeline {agent anystages { stage('Example') {steps {echo 'Hello World'}}}
}
2.4、steps(步骤)
每个阶段要执行的步骤pipeline {agent anystages {stage('Example') {steps { echo 'Hello World'}}}
}
2.4.1、script
	script 步骤需要 [scripted-pipeline]块并在声明式流水线中执行。对于大多数用例来说,应该声明式流水线中的“脚本”步骤是不必要的,但是它可以提供一个有用的”逃生出口”。非平凡的规模和/或复杂性的script块应该被转移到 共享库 。
pipeline {agent anystages {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"}}}}}
}
2.5、指令
2.5.1、environment
	environment 指令指定一个键值对序列,也称为环境变量,该序列将被定义为所有步骤的环境变量,或者是特定于阶段的步骤,这取决于 environment 指令在流水线内的位置。该指令支持一个特殊的方法 credentials() ,该方法可用于在Jenkins环境中通过标识符访问预定义的凭证。对于类型为 “Secret Text”的凭证, credentials() 将确保指定的环境变量包含秘密文本内容。对于类型为 “SStandard username and password”的凭证, 指定的环境变量指定为 username:password ,并且两个额外的环境变量将被自动定义 :分别为 MYVARNAME_USR 和 MYVARNAME_PSW 。
pipeline {agent anyenvironment { CC = 'clang'}stages {stage('Example') {environment { AN_ACCESS_KEY = credentials('my-prefined-secret-text') }steps {sh 'printenv'}}}
}
2.5.2、options
	options 指令允许从流水线内部配置特定于流水线的选项。 流水线提供了许多这样的选项, 比如buildDiscarder,但也可以由插件提供, 比如 timestamps。buildDiscarder: 为最近的流水线运行的特定数量保存组件和控制台输出。disableConcurrentBuilds: 不允许同时执行流水线。 可被用来防止同时访问共享资源等。overrideIndexTriggers: 允许覆盖分支索引触发器的默认处理。skipDefaultCheckout: 在agent 指令中,跳过从源代码控制中检出代码的默认情况。skipStagesAfterUnstable: 一旦构建状态变得UNSTABLE,跳过该阶段。checkoutToSubdirectory: 在工作空间的子目录中自动地执行源代码控制检出。timeout: 设置流水线运行的超时时间, 在此之后,Jenkins将中止流水线。retry: 在失败时, 重新尝试整个流水线的指定次数。timestamps: 预测所有由流水线生成的控制台输出,与该流水线发出的时间一致。
//指定一个小时的全局执行超时, 在此之后,Jenkins将中止流水线运行。
pipeline {
agent any
options {timeout(time: 1, unit: 'HOURS') 
}
stages {stage('Example') {steps {echo 'Hello World'}}
}
}
2.5.3、参数

在这里插入图片描述

如上图所示,再上述位置配置的参数其实都可以再Jenkinsfile中定义实现
为流水线运行时设置项目相关的参数,参数定义的两种方法1、参数可以在这个参数化构建过程中定义,然后再Jenkinsfile中调用2、参数也可以再jenkinsfile中定义并使用参数
参数构建化过程配置参数如下示例:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

jenkinsfile中定义参数示例:

在这里插入图片描述

在这里插入图片描述

值得注意的是,当保存后再构建页面中是看不到新添加的参数,只有执行一次构建过程后,该页面才会有新添加的参数,如下所示

在这里插入图片描述

2.6、触发器(trigger)
定时去做某件事情时可以考虑使用,如下示例
  • cron 计划任务定期执行构建。

    triggers { cron('H */4 * * 1-5') }
    
  • pollSCM 与cron定义类似,但是由jenkins定期检测源码变化。

    triggers { pollSCM('H */4 * * 1-5') }
    
  • upstream 接受逗号分隔的工作字符串和阈值。 当字符串中的任何作业以最小阈值结束时,流水线被重新触发。

    triggers { upstream(upstreamProjects: 'job1,job2', threshold: hudson.model.Result.SUCCESS) }
    
pipeline {
agent any
triggers {cron('H */4 * * 1-5')
}
2.7、tool
	获取通过自动安装或手动放置工具的环境变量。支持maven/jdk/gradle。工具的名称必须在系统设置->全局工具配置中定义。使用示例如下: 在jenkinsfile中使用全局工具maven

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.8、input
input用户在执行各个阶段的时候,由人工确认是否继续进行。比较常用message 呈现给用户的提示信息。id 可选,默认为stage名称。ok 默认表单上的ok文本。submitter 可选的,以逗号分隔的用户列表或允许提交的外部组名。默认允许任何用户。submitterParameter 环境变量的可选名称。如果存在,用submitter 名称设置。parameters 提示提交者提供的一个可选的参数列表。
如下示例:1、使用流水线语法生成一个示例input2、将生成的input粘贴至pipeline3、执行构建,查看是否有提示

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.9、when
	when 指令允许流水线根据给定的条件决定是否应该执行阶段。 when 指令必须包含至少一个条件。 如果when 指令包含多个条件, 所有的子条件必须返回True,阶段才能执行。 这与子条件在 allOf 条件下嵌套的情况相同。
内置条件
  • 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' } }
    
when使用示例
当参数test的值是123456时执行下载代码操作,即GetCode动作

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.10、parallel并行
	声明式流水线的阶段可以在他们内部声明多个嵌套阶段, 它们将并行执行。 注意,一个阶段必须只有一个 steps 或 parallel的阶段。 嵌套阶段本身不能包含 进一步的 parallel 阶段, 但是其他的阶段的行为与任何其他 stageparallel的阶段不能包含 agent 或 tools阶段, 因为他们没有相关 steps。另外, 通过添加 failFast true 到包含parallel的 stage中, 当其中一个进程失败时,你可以强制所有的 parallel 阶段都被终止如下示例:因为打包和扫描时间较长,将这两个操作添加到并行操作

在这里插入图片描述

总结

本篇文章主要针对常用的声明式Jenkinsfile流水线脚本的参数和框架做出了一个示例及简单的解释,因为平常接触和编写最多的就是声明式的流水线脚本。加油,开始练习写声明式流水线脚本吧,光看不练假把式~~~

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode 找出字符串中第一个匹配项的下标

算法思想&#xff1a; 检查特殊情况&#xff1a;首先判断needle是否为空字符串。如果是空字符串&#xff0c;根据题意直接返回0&#xff0c;因为空子串默认在任何字符串的起始位置。 获取字符串长度&#xff1a;定义m为haystack的长度&#xff0c;n为needle的长度&#xff0c;…

股市下跌时,期权市场的应对策略有哪些?

在股票交易中&#xff0c;投资者对市场的下跌无能为力&#xff0c;只能眼睁睁地看着自己亏损。在期权交易中&#xff0c;交易方向灵活&#xff0c;也有应对市场下跌的交易策略。下面&#xff0c;我们整理了一些股市下跌时&#xff0c;期权市场的应对策略有哪些&#xff1f;希望…

【C++】 C++游戏设计---五子棋小游戏

1. 游戏介绍 一个简单的 C 五子棋小游戏 1.1 游戏规则&#xff1a; 双人轮流输入下入点坐标横竖撇捺先成五子连线者胜同一坐标点不允许重复输入 1.2 初始化与游戏界面 初始化界面 X 输入坐标后 O 输入坐标后 X 先达到胜出条件 2. 源代码 #include <iostream> #i…

Spring——容器:IoC

容器&#xff1a;IoC IoC 是 Inversion of Control 的简写&#xff0c;译为“控制反转”&#xff0c;它不是一门技术&#xff0c;而是一种设计思想&#xff0c;是一个重要的面向对象编程法则&#xff0c;能够指导我们如何设计出松耦合、更优良的程序。 Spring 通过 IoC 容器来…

微服务容器化部署实践(FontConfiguration.getVersion)

文章目录 前言一、整体步骤简介二、开始实战1.准备好微服务2.将各个微服务打包为镜像第一种第二种3. 将各个打包好的镜像,通过docker-compose容器编排,运行即可总结前言 docker容器化部署微服务: 将微服务容器化部署到 Docker 容器中是一个常见的做法,可以提高应用的可移…

提升法律文书处理效率的秘密武器:开源文档比对工具解析

本篇文章介绍了一款针对律师行业的免费开源文档比对工具&#xff0c;旨在解决法律文档的多版本比对难题。通过逐字、逐句精确比对、语义分析、批量处理等核心功能&#xff0c;该工具可高效识别文本差异&#xff0c;提升文书审查效率并降低错误风险。它支持多种文件格式&#xf…

把握鸿蒙生态崛起的机遇:开发者视角的探讨

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; 近年来&#xff0c;鸿蒙系统&#xff08;HarmonyOS&#xff09;的发展备受瞩目。随着其在智能手机、智能穿戴、车载系统和智能家居等领域的广泛应用&#xff0c;鸿蒙系统正逐渐形成与安卓、iOS并列的三足鼎立…

Linux权限和开发工具(3)

文章目录 1. 简单理解版本控制器Git1. 如何理解版本控制 2. Git的操作2.1 Git安装2.2 Git提交身份2.3 Git提交命令2.4 Git版本管理2.5 Git下的同步 3. gdb命令3.1解决gdb的难用问题3.2 gdb/cgdb的使用 1. 简单理解版本控制器Git 1. 如何理解版本控制 我们在做项目的时候可能会…

多线程和线程同步复习

多线程和线程同步复习 进程线程区别创建线程线程退出线程回收全局写法传参写法 线程分离线程同步同步方式 互斥锁互斥锁进行线程同步 死锁读写锁api细说读写锁进行线程同步 条件变量生产者消费者案例问题解答加强版生产者消费者 总结信号量信号量实现生产者消费者同步-->一个…

WSL 2 中 FastReport 与 FastCube 的设置方法与优化策略

软件开发人员长期以来一直在思考这个问题&#xff1a;“我们如何才能直接在 Windows 中运行 Linux 应用程序&#xff0c;而无需使用单独的虚拟机&#xff1f;” WSL 技术为这个问题提供了一个可能的答案。WSL 的历史始于 2016 年。当时&#xff0c;其实现涉及使用 Windows 内核…

【前端】HTML标签汇总

目录 展示用户信息的标签 1.文本标签 span 2.标题标签 h1~h6 3.竖着布局的标签 div 4.段落标签 p 5.超链接标签 a 5.1跳转至网上的资源 5.2锚点 6.列表标签 6.1有序列表 ol 6.2无序列表 ul 7.图片标签 img 7.1相对路径 7.1.1兄弟关系 7.1.2叔侄关系 7.1.3表兄弟…

海外云手机在出海业务中的优势有哪些?

随着互联网技术的快速发展&#xff0c;海外云手机已在出海电商、海外媒体推广和游戏行业都拥有广泛的应用。对于国内的出海电商企业来说&#xff0c;短视频引流和社交平台推广是带来有效流量的重要手段。借助云手机&#xff0c;企业能够更高效地在新兴社交平台上推广产品和品牌…

电脑提示xinput1_3.dll丢失怎么办?游戏DLL修复方法详解

xinput1_3.dll 是一个动态链接库&#xff08;DLL&#xff09;文件&#xff0c;它在Windows操作系统中扮演着重要的角色&#xff0c;特别是在处理游戏控制器和其他输入设备的交互方面。这个文件是Microsoft DirectX软件包的一部分&#xff0c;DirectX是微软公司开发的一个多媒体…

Spring资源加载模块,原来XML就这,活该被注解踩在脚下 手写Spring第六篇了

这一篇让我想起来学习 Spring 的时&#xff0c;被 XML 支配的恐惧。明明是写Java&#xff0c;为啥要搞个XML呢&#xff1f;大佬们永远不知道&#xff0c;我认为最难的是 XML 头&#xff0c;但凡 Spring 用 JSON来做配置文件&#xff0c;Java 界都有可能再诞生一个扛把子。 <…

讲讲关于SNMP与智能PDU插座

什么是SNMP 简单网络管理协议 (SNMP) 是一种应用层协议&#xff0c;主要用于网络管理中的设备监控和控制。通过 SNMP&#xff0c;网络管理员可以从管理站远程访问网络中的设备&#xff0c;获取设备的状态信息、配置参数&#xff0c;甚至控制设备的行为。SNMP 被广泛应用于 TCP/…

丹摩征文活动 | Kolors入门:从安装到全面活用的对比指南

文章目录 1 图像生成模型 Kolors2 部署流程3 部署服务3.1 安装 Anaconda3.2 Kolors 库下载3.3 创建虚拟环境 4 生成图片 1 图像生成模型 Kolors Kolors是由快手团队开发的大规模文本到图像生成模型&#xff0c;以其独特的潜在扩散技术而闻名。 Kolors通过在数十亿对文本和图像…

【go从零单排】通道select、通道timeout、Non-Blocking Channel Operations非阻塞通道操作

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 select 语句是 Go 的一种控制结构&#xff0c;用于等待多个通道操作。它类似于 s…

信息安全工程师(83)Windows操作系统安全分析与防护

一、Windows操作系统安全分析 系统漏洞&#xff1a; Windows操作系统由于其复杂性和广泛使用&#xff0c;可能存在一些已知或未知的漏洞。这些漏洞可能会被黑客利用&#xff0c;进行恶意攻击。微软会定期发布系统更新和补丁&#xff0c;以修复这些漏洞&#xff0c;提高系统的安…

计算机网络常见面试题(一):TCP/IP五层模型、TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议

文章目录 一、TCP/IP五层模型&#xff08;重要&#xff09;二、应用层常见的协议三、TCP与UDP3.1 TCP、UDP的区别&#xff08;重要&#xff09;3.2 运行于TCP、UDP上的协议3.3 TCP的三次握手、四次挥手3.3.1 TCP的三次握手3.3.2 TCP的四次挥手3.3.3 随机生成序列号的原因 四、T…

BFD8122防爆轻便移动工作灯

BFD8122防爆轻便移动工作灯 适用范围&#xff1a; 适用于炼油、化工、油田等易燃易爆场所小范围施工、检修、抢险应急照明。 结构特性 高亮度&#xff0c;灯具光通量&#xff1e;4000lm&#xff0c;6米中心照度&#xff08;聚光&#xff09;&#xff1e;1000lx&#xff0c;…