玩转Jenkins Pipeline

玩转Jenkins PipelineJenkinsPipel 的总体介绍 1 JenkinsPipel 的核心概念 Pipeline 简而言之 就是一套运行于 Jenkins 上的工作流框架 将原本独立运行于单个或者多个节点的任务连接起来 实现单个任务难以完成的复杂流程编排与可视化 Pipeline 是 Jenkins2 X 的最核心的特性 帮助 Jenkins 实现从 CI 到 CD 与 DevOps 的转变 Pipeline 是一组

Jenkins Pipeline的总体介绍

1.Jenkins Pipeline 的核心概念

Pipeline,简而言之,就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化。

Pipeline是Jenkins2.X的最核心的特性,帮助Jenkins实现从CI到CD与DevOps的转变

Pipeline是一组插件,让Jenkins可以实现持续交付管道的落地和实施。

持续交付管道(CD Pipeline)是将软件从版本控制阶段到交付给用户或客户的完整过程的自动化表现。软件的每一次更改(提交到源代码管理系统)都要经过一个复杂的过程才能被发布。

Pipeline提供了一组可扩展的工具,通过Pipeline Domain Specific Language(DSL)syntax可以达到Pipeline as Code(Jenkinsfile存储在项目的源代码库)的目的。

Stage:阶段,一个Pipeline可以划分成若干个Stage,每个Stage代表一组操作,例如:“Build”,“Test”,“Deploy”。

注意,Stage是一个逻辑分组的概念,可以跨多个Node

Node:节点,一个Node就是一个Jenkins节点,或者是Master,或者是Agent,是执行Step的具体运行环境。

Step:步骤,Step是最基本的操作单元,小到创建一个目录,大到构建一个Docker镜像,由各类Jenklins Plugin提供,例如:sh ‘make’

Pipeline五大特性

  1. 代码:Pipeline以代码的形式实现,通常被检入源代码控制,使团队能够编辑、审查和迭代其CD流程。
  2. 可持续性:Jenklins重启或者中断后都不会影响Pipeline Job。
  3. 停顿:Pipeline可以选择停止并等待任工输入或批准,然后再继续Pipeline运行。
  4. 多功能:Pipeline支持现实世界的复杂CD要求,包括fork/join子进程,循环和并行执行工作的能力
  5. 可扩展:Pipeline插件支持其DSL的自定义扩展以及与其他插件集成的多个选项。

Pipeline和Freestyle的区别

这里写图片描述

这里写图片描述

Multibranch Pipeline根据你的代码中Jenlinsfile自动创建Job

通常推荐在Jenkins中直接从源代码控制(SCM)中载入Jenklinsfile Pipeline

这里写图片描述

声明式Pipeline

声明式Pipeline的基本语法和表达式遵循与Groovy语法相同的规则,但有以下例外:

  1. 声明式pipeline必须包含在固定格式pipeline{}快内
  2. 每个声明语句必须独立一行,行尾无需使用分号
  3. 块(blocks{})只能包含章节(Sections),指令(Directives),步骤(Steps)或赋值语句
  4. 属性引用语句被视为无参数方法调用。例:输入被视为 input()

示例

agent { label 'my-label' } agent { node { label 'my-label' customWorkspace '/some/other/path' } } agent { docker { image 'nginx:1.12.2' label 'my-label' args '-v /tmp:/tmp' } }

post 不是必须的,用于pipeline的最外层或者stage{}中

pipeline { agent any stages { stage('Example'){ steps { echo 'Hello world' } } } post { always { echo 'say goodbay' } } }

stages 必须,包括顺序执行的一个或多个stage命令,在pipeline内仅能使用一次,通常位于agent/options后面,例子如上

steps 必须,steps位于stage指令块内部,包括一个或多个step。仅有一个step的情况下可以忽略关键字step及其{},例子如上

environment 不是必须的,environment定义了一组全局的环境变量键值对,存在于pipeline{}或者stage指令内。执行特殊方法credentials()可以获取jenkins中预定义的凭证明文内容

environment {CC='clang'} environment {AN_ACCESS_KEY = credentials('my-prefined-secret-text')} steps {sh 'printenv'}

options 不是必须的 预定义pipeline专有的配置信息,仅可定义一次

pipeline { agent any options{ timeout(time:1,unit: 'HOURS') } ... }

parameters 不是必须的 定义参数化构建的参数可选参数 booleanParam,choice,file,text,password,run,string

paramenters { choice(name:'PerformMavenRelease',choices:'False\nTrue',description:'desc') password(name:'CredsToUse',description:'Apassword to build with',defaultValue:'') } environment { BUILD_USR_CHOICE="${params.PerformMavenRelease}" BUILD_USR_CREDS="${params.CredsToUse}" }

triggers 不是必须的 定义pipeline被自动触发的方式选项 cron、pollSCM、upstream

triggers { 
  cron('H 4/* 0 0 1-5')} triggers { 
  pollSCM('H 4/* 0 0 1-5')} triggers { 
  upstream(upstreamProjects:'job1,job2',threshold:hudson.model.Result.SUCCESS)}
pipeline{ agent any stages { stage('Build') { steps{ echo 'This is a build step' } } stage('Test') { steps{ echo 'This is a test step' } } stage('Deploy') { steps{ echo 'This is a deploy step' } } } }

这里写图片描述

保存之后,立即构建

这里写图片描述

常用的辅助工具

  • Snipper Generator(代码片段生成器,语法检查器)
  • Replay Pipeline(重放pipeline,可以修改script,修改后的不存入config.xml)
  • DSL Reference 语法参考手册
  • 全局变量引用
  • Stage View
  • BlueOcean(可视化)
  • Pipeline神器:可视化编辑器
  • 命令行Pipeline调试工具

变量的传递

  1. 自定义变量(局部)
def username = 'Jenkins' echo "Hello Mr.${username}" #注意一定要用双引号,单引号识别为字符串
  1. 环境变量(局部)
withEnv(['MYTOOL_HOME=/usr/local/mytool']){ sh '$MYTOOL_HOME/bin/start' }
  1. 环境变量(全局)
environment {CC='clang'} echo "Compiler is ${env.CC}"
  1. 参数化构建(全局)
parameters {string(name:'Jenkins',defaultValue:'Hello',description:'How should I greet the world')} ehco "${params.Greeting} World!"
 - when {branch 'master'}  - when {environment name:'DEPLOY_TO',value:'production'} #当有环境变量 name 为 DEPLOY_TO 值是 production 条件成立 - when {expression { 
   return params.DEBUG_BUILD}} #表达式返回值为真时 - when { 
   not {branch 'master'}}  - when {allOf {branch 'master'; environment name:'DEBUG_TO',value:'production'}} #allOf 所有条件都满足时 - when {anyOf {branch 'master' ; branch 'staging'}} #anyOf有一个条件满足时即可
node { stage('Example'){ if(env.BRANCH_NAME == 'master'){ echo 'I only execute on the master branch' }else { echo 'Iexecute elsewhere' } } }

异常处理try/catch/finally

node{ stage('Example'){ try{ sh 'exit 1' } catch (exc) { echo 'something failed,I should sound the klaxons!' throw } } }
pipeline { agent any stages { stage('Example'){ steps{ echo 'Hello world!' script { def browsers = ['chrome','firefox'] for (int i = 0;i < browers.size();++i){ echo "Testing the ${browsers[i]} browser" } } } } } }

并发

人工确认

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/216085.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午12:35
下一篇 2026年3月18日 下午12:35


相关推荐

  • 自监督学习和无监督学习的区别

    自监督学习和无监督学习的区别无监督学习无监督学习不依赖任何标签值,通过对数据内在特征的挖掘,找到样本间的关系,比如聚类相关的任务自监督学习和无监督学习不同,自监督学习主要是利用辅助任务(pretext)从大规模的无监督数据中挖掘自身的监督信息,通过这种构造的监督信息对网络进行训练,从而可以学习到对下游任务有价值的表征。换句话说:自监督学习的监督信息不是人工标注的,而是是通过辅助任务(pretext)在大规模无监督数据中自动构造监督信息,通过得到的标签,就可以类似有监督学习一样进行训练。区别自监督学习是从数据本身找标签来进行

    2025年11月16日
    7
  • 怎样才能成为java高级程序员?应该具备的技能有哪些?(一)

    怎样才能成为java高级程序员?应该具备的技能有哪些?(一)众所周知我国的软件编程行业是非常捞金的一个行业 在当下社会成为一名高级程序员是所有人都羡慕的 那怎么才能成为一名高级程序员呢 一名高级程序员应该具备哪些技能呢 一 JAVA nbsp nbsp nbsp nbsp 要想成为 JAVA 高级 工程师肯定要学习 JAVA 一般的程序员或许只需知道一些 JAVA 的语法结构就可以应付了 但要成为 JAVA 高级 工程师 你要对 JAVA 做比较深入的研究 你应该多研究一下 JDBC I

    2026年3月16日
    2
  • LLDP简介

    LLDP简介1.1.1LLDP产生背景目前,网络设备的种类日益繁多且各自的配置错综复杂,为了使不同厂商的设备能够在网络中相互发现并交互各自的系统及配置信息,需要有一个标准的信息交流平台。LLDP(LinkLayerDiscoveryProtocol,链路层发现协议)就是在这样的背景下产生的,它提供了一种标准的链路层发现方式,可以将本端设备的信息(包括主要能力、管理地址、设备标识、接口标识等)组织成不同的TLV(Type/Length/Value,类型/长度/值),并封装在LLDPDU(Lin…

    2022年5月28日
    94
  • IntelliJ IDEA安装及jsp开发环境搭建

    IntelliJ IDEA安装及jsp开发环境搭建一、前言  现在.net国内市场不怎么好,公司整个.net组技术转型,就个人来说还是更喜欢.net,毕竟不是什么公司都像微软一样财大气粗开发出VS这样的宇宙级IDE供开发者使用,双击sln即可打开项目,一直想吐槽为嘛java项目只能import。昨天一路踩坑,花了一整天的时间搭建好jsp的开发环境,特此记录下安装过程中一些注意的问题以及解决方案。整个过程槽点满满…二、IntelliJIDEA…

    2022年10月21日
    4
  • python去重列表,并获取重复值索引

    python去重列表,并获取重复值索引这里写自定义目录标题 python 去重列表 并获取重复值索引先上代码 a 1 2 12 1 2 1 3 4 5 4 3 2 b list set a print b fortargetinb forindex numsinenumer a ifnums target print target index 在这里插入代码片列表 b 是去重后的列表执行后结果 1 2 3 4

    2026年3月17日
    2
  • Claude Code 实用教程——使用方法详解

    Claude Code 实用教程——使用方法详解

    2026年3月16日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号