Jenkins pipeline语法笔记

news2024/11/24 13:46:35

Jenkins pipeline

  • 简介
    • Jenkins Pipeline 优势
    • DSL 是什么
  • pipeline支持两种语法:
    • 声明式pipeline语法:
      • Pipeline
      • agent
    • Pipeline 声明式语法Declarative
      • environment
      • options
      • parameters
      • triggers
      • tools
      • input
      • when
      • Parallel
    • Pipeline Scripted语法
      • 流程控制
      • Declarative pipeline和Scripted pipeline的比较

简介

  • Jenkins pipeline (流水线)是一套运行于jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化。它把持续提交流水线(Continuous Delivery Pipeline)的任务集成到Jenkins中。
  • pipeline 是jenkins2.X 最核心的特性, 帮助jenkins 实现从CI到CD与DevOps的转变。
  • 持续提交流水线(Continuous Delivery Pipeline)会经历一个复杂的过程: 从版本控制、向用户和客户提交软件,软件的每次变更(提交代码到仓库)到软件发布(Release)。这个过程包括以一种可靠并可重复的方式构建软件,以及通过多个测试和部署阶段来开发构建好的软件(称为Build)。

总结:
1.Jenkins Pipeline是一组插件,让Jenkins可以实现持续交付管道的落地和实施。
2.持续交付管道(CD Pipeline)是将软件从版本控制阶段到交付给用户或客户的完
整过程的自动化表现。
3.软件的每一次更改(提交到源代码管理系统)都要经过一个复杂的过程才能被发布。

Jenkins Pipeline 优势

本质上,Jenkins 是一个自动化引擎,它支持许多自动模式。 Pipeline向Jenkins中添加了一组强大的工具, 支持简单的CI到全面的CD pipeline。通过对一系列的相关任务进行建模, 用户可以利用pipeline的很多特性:
1、代码:Pipeline以代码的形式实现,使团队能够编辑,审查和迭代其CD流程。
2、可持续性:Jenkins重启或者中断后都不会影响Pipeline Job。
3、停顿:Pipeline可以选择停止并等待人工输入或批准,然后再继续Pipeline运行。
4、多功能:Pipeline支持现实复杂的CD要求,包括循环和并行执行工作的能力。
5、可扩展:Pipeline插件支持其DSL的自定义扩展以及与其他插件集成的多个选项。

DSL 是什么

DSL 其实是 Domain Specific Language 的缩写,中文翻译为领域特定语言(下简称 DSL);
而与 DSL相对的就是GPL,这里的GPL并不是我们知道的开源许可证,而是 General Purpose Language的简称,即通用编程语言,也就是我们非常熟悉的 Objective-C、Java、Python 以及 C 语言等等。

pipeline脚本是由groovy 语言实现的
但无需专门学习 groovy

pipeline支持两种语法:

  • Declarative:声明式
  • Scripted pipeline :脚本式

声明式pipeline语法:

官网:
https://www.jenkins.io/doc/book/pipeline/syntax/

声明式语法包括以下核心流程:
1.pipeline : 声明其内容为一个声明式的pipeline脚本
2.agent: 执行节点(job运行的slave或者master节点)
3.stages: 阶段集合,包裹所有的阶段(例如:打包,部署等各个阶段)
4.stage: 阶段,被stages包裹,一个stages可以有多个stage
5.steps: 步骤,为每个阶段的最小执行单元,被stage包裹
6.post: 执行构建后的操作,根据构建结果来执行对应的操作

根据上面流程创建一个简单的pipeline

pipeline{
    agent any
    stages{
        stage("This is first stage"){
            steps("This is first step"){
                echo "I am test"
            }
        }
    }
    post{
        always{
            echo "The process is ending"
        }
    }
}

Pipeline

Pipeline: 作用域:应用于全局最外层,表明该脚本为声明式pipeline   必写

agent

agent:作用域:可用在全局与stage内, agent表明此pipeline在哪个节点上执行 必写
agent参数:any,none, label, node,docker,dockerfile。

  • agent any 运行在任意的可用节点上
  • agent none 全局不指定运行节点,由各自stage来决定
  • agent { label ‘master’ } 运行在指定标签的机器上,具体标签名称由agent配置决定
  • node{ label ‘master’} 和agent { label ‘master’ }一样,但是node可以扩展节点信息,允许额外的选项 (比如 customWorkspace )。
agent { 
     node {
         label  'my-defined-label'
         customWorkspace 'xxxxxxx'
    } 
}

agent { docker ‘python’ } 使用指定的容器运行流水线
定义此参数时,执行Pipeline或stage时会动态的在具有label 'my-defined-label’标签的node提供docker节点去执行Pipelines。 docker还可以接受一个args,直接传递给docker run调用。

agent {
    docker {
        image 'maven:3-alpine'
        label 'my-defined-label'
        args  '-v /tmp:/tmp'
    }
}
agent {
    // Equivalent to "docker build -f Dockerfile.build --build-arg version=1.0.2 ./build/
    dockerfile {
        filename 'Dockerfile.build'
        dir 'build'
        label 'my-defined-label'
        additionalBuildArgs  '--build-arg version=1.0.2'
    }
}

Pipeline 声明式语法Declarative

environment

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

在这里插入图片描述

pipeline {
    agent any
    environment {  
        CC = 'clang' 
    }
    stages {
        stage('Example') {
            steps {
                sh 'printenv'
            }
        }
    }
}

options

options指令允许在Pipeline本身内配置Pipeline专用选项。Pipeline本身提供了许多选项,例如buildDiscarder,但它们也可能由插件提供,例如 timestamps。
在这里插入图片描述
可用选项

  • buildDiscarder: pipeline保持构建的最大个数。用于保存Pipeline最近几次运行的数据,例如:options { buildDiscarder(logRotator(numToKeepStr: ‘1’)) }
  • disableConcurrentBuilds: 不允许并行执行Pipeline,可用于防止同时访问共享资源等。例如:options { disableConcurrentBuilds() }
  • skipDefaultCheckout:跳过默认设置的代码check out。例如:options { skipDefaultCheckout() }
  • skipStagesAfterUnstable: 一旦构建状态进入了“Unstable”状态,就跳过此stage。例如:options { skipStagesAfterUnstable() }
  • timeout: 设置Pipeline运行的超时时间,超过超时时间,job会自动被终止,例如:options { timeout(time: 1, unit: ‘HOURS’) }
  • retry: 失败后,重试整个Pipeline的次数。例如:options { retry(3) }
  • timestamps: 预定义由Pipeline生成的所有控制台输出时间。例如:options { timestamps() }
pipeline {
    agent any
    options {
        timeout(time: 1, unit: 'HOURS') 
    }
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
} 

parameters

parameters指令提供用户在触发Pipeline时的参数列表。这些参数值通过该params对象可用于Pipeline stage中,具体用法如下:
在这里插入图片描述

作用域:被最外层pipeline所包裹,并且只能出现一次,参数可被全局使用
好处:使用parameters的好处是能够使参数也变成code,达到pipeline as code,pipeline中设置的参数会自动在job构建的时候生成,形成参数化构建

可用参数

  • string :A parameter of a string type, for example: parameters { string(name: ‘DEPLOY_ENV’, defaultValue: ‘staging’, description: ‘’) }
  • booleanParam :A boolean parameter, for example: parameters { booleanParam(name: ‘DEBUG_BUILD’, defaultValue: true, description: ‘’) }
  • 目前只支持[booleanParam, choice, credentials, file, text, password, run, string]这几种参数类型,其他高级参数化类型还需等待社区支持。
pipeline{
    agent any
    parameters {
        string(name: 'xianchao', defaultValue: 'my name is xianchao', description: 'My name is xiancaho')
        booleanParam(name: 'luckylucky421302', defaultValue: true, description: 'This is my wechat')
    }
    stages{
        stage("stage1"){
            steps{
                echo "$xianchao"
                echo "$luckylucky421302"
            }
        }
    }
}

在这里插入图片描述

在这里插入图片描述

triggers

triggers指令定义了Pipeline自动化触发的方式。目前有三个可用的触发器:cron和pollSCM和upstream。
在这里插入图片描述
用域:被pipeline包裹,在符合条件下自动触发pipeline

  • cron:接受一个cron风格的字符串来定义Pipeline触发的时间间隔,例如: triggers { cron(‘H 4/* 0 0 1-5’) }
  • pollSCM:接受一个cron风格的字符串来定义Jenkins检查SCM源更改的常规间隔。如果存在新的更改,则Pipeline将被重新触发。例如:triggers { pollSCM(‘H 4/* 0 0 1-5’) }
pipeline {
    agent any
    triggers {
        cron('H 4/* 0 0 1-5')
    }
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
}

tools

通过tools可自动安装工具,并放置环境变量到PATH。如果agent none,这将被忽略。
在这里插入图片描述
Supported Tools(Global Tool Configuration)

  • maven
  • jdk
  • gradle
pipeline {
    agent any
    tools {
       #工具名称必须在Jenkins 管理Jenkins → 全局工具配置中预配置。
        maven 'apache-maven-3.0.1'
    }
    stages {
        stage('Example') {
            steps {
                sh 'mvn --version'
            }
        }
    }
}

工具名称必须在Jenkins中的Manage Jenkins→Global tool Configuration下预先配置

input

stage 的 input 指令允许你使用 input step提示输入。 在应用了 options 后,进入 stage 的 agent 或评估 when 条件前,stage 将暂停。 如果 input 被批准, stage 将会继续。 作为 input 提交的一部分的任何参数都将在环境中用于其他 stage

配置项:

  • message:必需的。 这将在用户提交 input 时呈现给用户。
  • id:input 的可选标识符, 默认为 stage 名称。
  • ok:input表单上的"ok" 按钮的可选文本。
  • submitter:可选的以逗号分隔的用户列表或允许提交 input 的外部组名。默认允许任何用户。
  • submitterParameter:环境变量的可选名称。如果存在,用 submitter 名称设置。
  • parameters:提示提交者提供的一个可选的参数列表。
pipeline {
    agent any
    stages {
        stage('Example') {
            input {
                message "Should we continue?"
                ok "Yes, we should."
                submitter "xianchao,lucky"
                parameters {
                    string(name: 'PERSON', defaultValue: 'xianchao', description: 'Who should I say hello to?')
                }
            }
            steps {
                echo "Hello, ${PERSON}, nice to meet you."
            }
        }
    }
}

在这里插入图片描述
在这里插入图片描述

when

when指令允许Pipeline根据给定的条件确定是否执行该阶段。该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 } }
  • not:当嵌套条件为false时执行。必须包含一个条件。例如:when { not { branch ‘master’ } }
  • allOf:当所有嵌套条件都为真时执行。必须至少包含一个条件。例如:when { allOf { branch ‘master’; environment name: ‘DEPLOY_TO’, value: ‘production’ } }
  • anyOf:当至少一个嵌套条件为真时执行。必须至少包含一个条件。例如:when { anyOf { branch ‘master’; branch ‘staging’ } }
pipeline {
    agent any
    stages {
        stage('Example Build') {
            steps {
                echo 'Hello World'
            }
        }
        stage('Example Deploy') {
            when {
                allOf {
                    branch 'production'
                    environment name: 'DEPLOY_TO', value: 'production'
                }
            }
            steps {
                echo 'Deploying'
            }
        }
    }
}

Parallel

Declarative Pipeline近期新增了对并行嵌套stage的支持,对耗时长,相互不存在依赖的stage可以使用此方式提升运行效率。除了parallel stage,单个parallel里的多个step也可以使用并行的方式运行。

pipeline {
    agent any
    stages {
        stage('Non-Parallel Stage') {
            steps {
                echo 'This stage will be executed first.'
            }
        }
        stage('Parallel Stage') {
            when {
                branch 'master'
            }
            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"
                    }
                }
            }
        }
    }
}

Pipeline Scripted语法

Groovy脚本不一定适合所有使用者,因此jenkins创建了Declarative pipeline,为编写Jenkins管道提供了一种更简单、更有主见的语法。
但是由于脚本化的pipeline是基于groovy的一种DSL语言,所以与Declarative pipeline相比为jenkins用户提供了更巨大的灵活性和可扩展性。

流程控制

pipeline脚本同其它脚本语言一样,从上至下顺序执行,它的流程控制取决于Groovy表达式,如if/else条件语句,举例如下:

node {
    stage('Example') {
        if (env.BRANCH_NAME == 'master') {
            echo 'I only execute on the master branch'
        } else {
            echo 'I execute elsewhere'
        }
    }
}

Declarative pipeline和Scripted pipeline的比较

  • 共同点:两者都是pipeline代码的持久实现,都能够使用pipeline内置的插件或者插件提供的stage,两者都可以利用共享库扩展。
  • 区别:两者不同之处在于语法和灵活性。Declarative pipeline对用户来说,语法更严格,有固定的组织结构,更容易生成代码段,使其成为用户更理想的选择。但是Scripted pipeline更加灵活,因为Groovy本身只能对结构和语法进行限制,对于更复杂的pipeline来说,用户可以根据自己的业务进行灵活的实现和扩展。

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

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

相关文章

【HarmonyOS】HMRouter使用详解(三)生命周期

生命周期(Lifecycle) 使用HMRouter的页面跳转时,想实现和Navigation一样的生命周期时,需要通过新建生命周期类来实现对页面对某一个生命周期的监控。 新建Lifecycle类 通过继承IHMLifecycle接口实现生命周期接口的方法重写。 通过…

20240904 华为笔试 二叉树消消乐

文章目录 题目解题思路代码BUG 代码最终代码题目 题目描述 给定原始二叉树和参照二叉树(输入的二叉树均为满二叉树,二叉树节点的值范围为[1,1000],二叉树的深度不超过1000),现对原始二叉树和参照二又树中相同层级目值相同的节点进行消除,消除规则为原始二叉树和参照二又树中…

进程概念三

1,运行状态R 1,理论: 在cpu中,有一个结构体:runqueue组成的一个双向链表,里面记录着对应的进程的代码和数据,存在内存中随时准备被调度,这种时候就叫做运行状态 2,why&a…

25西安电子科技大学考研预报名人数信息—公布

01报名信息直播 西安电子科技大学之前考研收集信息表现在公布,本次收集涉及到833、834、893(原953)专业,即计算机科学与技术学院、人工智能学院、网络与信息安全学院、卓越工程师学院 对于大家想提问的问题,学长学姐将…

AI智能聊天问答系统源码+AI绘画系统+图文搭建部署教程,文生图图生图,TTS语音识别输入,AI智能体,文档分析

一、前言 人工智能的快速进步吸引了全球的瞩目,各式AI应用如绘图、语言模型和视频处理等已在多个领域获得应用。这些技术不仅加速了科技的创新,也在艺术创作、内容生产和商业实践等方面显示了其巨大潜力。例如,AI语言模型极大提升了内容自动…

Cursor 与 DeepSeek API 的完美融合

在当今的编程领域中,选择合适的工具对于提高编程效率和质量至关重要。今天,我们将深入探讨如何将强大的 AI 辅助编程工具 Cursor 与优秀的 DeepSeek API 进行配置,以实现更加高效的编程体验。 一、Cursor:强大的 AI 辅助编程工具…

前端实现-搜索关键字标红处理

1、实现效果 2、代码实现 searchNotes(data, value) {const searchTerms = value.split( );const aData = [];for (let i = 0; i < data.length; i++) {const item = data[i];let titleMatches = true;let gaishuMatches = true;for (const term of searchTerms) {if (!ite…

Docker 的使用-01

一、Docker 设置和镜像源 1.1、设置 #查看 Docker 信息 docker version docker info#守护线程启动&#xff1a; systemctl daemon-reload 重启Docker服务&#xff1a; systemctl restart docker#关闭Docker服务 sudo systemctl stop docker#启动Docker服务 systemctl start d…

finereport制作带刷新和滚动的明细表

1、数据库查询 SELECT * FROM S订单 limit 602、配置页面内容 里面配置 订单明细 right(now(), 8) FORMAT(today(), "EEEE", "Locale.UK") today()3、时间按秒刷新 # 全页面刷新&#xff0c;则可用以下js: setInterval(“self.location.reload();”,1000…

AI 仅有大模型吗?AI Agent 究竟有多牛?

今天来和大家聊一个当下科技领域特别火爆的概念——AI Agent&#xff01; 前世界首富在其个人博客上写道&#xff1a; AI Agent&#xff08;AI智能体/助理/助手&#xff09;“将彻底改变计算机使用方式&#xff0c;并颠覆软件行业”。 他还预言“Android、iOS和Windows都是平…

喜讯!迈威通信TSN产品通过“时间敏感网络(TSN)产业链名录计划”评测,各项指标名列前茅

TSN技术&#xff0c;作为推动企业网络化与智能化转型的关键力量&#xff0c;已成为工业网络迈向下一代演进的共识方向&#xff0c;正加速重构工业网络的技术架构与产业生态。为响应这一趋势&#xff0c;工业互联网产业联盟携手中国信息通信研究院及50余家产学研用单位&#xff…

leetcode---素数,最小质因子,最大公约数

1 判断一个数是不是质数(素数) 方法1&#xff1a;依次判断能否被n整除即可&#xff0c;能够整除则不是质数&#xff0c;否则是质数 方法2&#xff1a;假如n是合数&#xff0c;必然存在非1的两个约数p1和p2&#xff0c;其中p1<sqrt(n)&#xff0c;p2>sqrt(n)。 方法3&…

【Unity学习笔记】解决疑似升级Win11或使用Unity6导致Unity旧版本无法打开的问题

【Unity学习笔记】解决疑似升级Win11或使用Unity6导致Unity旧版本无法打开的问题 一句话省流&#xff1a; 确保项目地址没有任何中文&#xff0c;重新申请个许可证&#xff0c;然后该咋就咋&#xff0c;完事。 ——————————————————————————————…

攻防世界(CTF)~Reverse-easyRE1

题目介绍 下载附件后一个32位一个64位 64位的放到ExeinfoPE查看一下有无壳子&#xff08;无壳&#xff09; 放IDA看一下伪代码&#xff0c;习惯性看一下main函数&#xff0c;直接发现了flag flag{db2f62a36a018bce28e46d976e3f9864}

解锁智慧之门:十大知识管理工具深度剖析

在当今信息爆炸的时代&#xff0c;如何高效地管理和利用知识已成为企业和个人发展的重要挑战。为了帮助大家更好地应对这一挑战&#xff0c;本文将深度剖析十大知识管理工具&#xff0c;这些工具不仅能够帮助我们更好地组织、存储和分享知识&#xff0c;还能提升我们的工作效率…

华为OD机试 - 芯片资源占用(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

Linux_进程概念详解

本篇文章为作者学习Linux时所作总结&#xff0c;可能会有总结不足或疏漏之处&#xff0c;如有发现请各路大神批评指正 什么是进程&#xff1f; 课本上说&#xff0c;进程是程序的一个执行实例&#xff0c;正在执行的程序。对&#xff0c;也不对&#xff0c;我称之为正确的废话…

嵌入式面试——FreeRTOS篇(七) 软件定时器

本篇为&#xff1a;FreeRTOS 软件定时器篇 一、软件定时器的简介 1、定时器介绍 答&#xff1a; 定时器&#xff1a;从指定的时刻开始&#xff0c;经过一个指定时间&#xff0c;然后触发一个超时事件&#xff0c;用户可以自定义定时器周期。 硬件定时器&#xff1a;芯片本…

python项目实战-xPath下载人生格言

事先声明一下&#xff0c;仅分享爬虫经验&#xff0c;不会对网站有影响的&#xff0c;也请想要实操的小伙伴不要对网站频繁访问&#xff0c;如有侵权请联系我删除文章 文章目录 代码展示步骤解析思路整理节点树xPath语法分析网页结构 实战思路获取源代码源代码转化成节点树提取…

新手必备!百度思维导图在内四款必备工具分享

作为一名资料员&#xff0c;每天都要处理大量的信息和数据&#xff0c;思维导图对我来说简直就是救星。它帮我理清思路&#xff0c;把复杂的信息条理化&#xff0c;让我能更高效地完成工作。今天&#xff0c;我就来跟大家分享一下我用过的几款思维导图工具&#xff1a;福昕思维…