Jenkins的Pipeline概念

文章目录

  • Pipeline
    • 什么是Jenkins Pipeline
    • 声明式和脚本式Pipeline语法
    • 为何使用Pipeline
    • Pipeline概念
      • Pipeline
      • Node
      • Stage
      • Step
    • Pipeline语法概述
      • 声明式Pipeline
      • 脚本式Pipeline
    • Pipeline示例
  • 参考

Pipeline

什么是Jenkins Pipeline

Jenkins Pipeline是一套插件,它支持实现和集成“continuous delivery (CD) pipeline”到Jenkins。

CD pipeline是流程的自动化表达,用于从版本控制向用户和客户获取软件。 软件的每个变化(在源码控制中提交),在其被发布的过程中,都经历了一个复杂的过程。该过程包括了以一种可靠并可重复的方式来构建软件, 以及通过测试和部署的多阶段来处理构建软件(称为一个build)。

Pipeline提供了一组可扩展的工具,通过“Pipeline domain-specific language (DSL) syntax”对从简单到复杂的交付pipeline“作为代码”来建模。

Jenkins Pipeline的定义写在一个文本文件中(称为 Jenkinsfile ),该文件可以被提交到项目的源码控制仓库。这是“Pipeline-as-code”的基础;将CD pipeline作为应用的一部分,像其它代码一样,可以版本化和审查。

创建 Jenkinsfile 并提交到源码控制,提供了很多立竿见影的好处:

  • 自动为所有branch和PR(Pull Request)创建Pipeline构建流程。
  • 在Pipeline上代码审查/迭代 (以及剩余的源码)。
  • 对Pipeline进行审计追踪。
  • Pipeline只有单一源,可被项目里的多个成员查看和编辑。

定义Pipeline的语法,无论是在web UI还是在 Jenkinsfile 文件中,都是相同的,不过通常认为,在 Jenkinsfile 中定义Pipeline,并纳入源码控制,是最佳实践。

声明式和脚本式Pipeline语法

Jenkinsfile 可用两种语法进行编写:声明式和脚本式。

声明式和脚本式的Pipeline,从根本上是不同的。声明式Pipeline是Jenkins Pipeline新一些的特性:

  • 相比脚本式Pipeline语法,它提供更加丰富的语法特性
  • 是为了使读写Pipeline代码更容易而设计的。

不过, Jenkinsfile 里很多单个的语法组件(或称“步骤”),对于声明式和脚本式Pipeline是通用的。

为何使用Pipeline

Jenkins本质上是一个自动化引擎,它支持许多自动化模式。Pipeline添加了一组强大的工具到Jenkins,支持从简单的CI到复杂的CD Pipeline的用例。通过对一系列的相关任务进行建模,用户可以利用Pipeline的很多特性:

  • 代码:Pipeline是在代码中实现的,通常会纳入源码控制,团队有编辑、审查和迭代其交付Pipeline的能力。
  • 持久:Pipeline可以从Jenkins控制器的计划和非计划的重启中存活下来。
  • 可暂停:Pipeline可以停止并等待人工输入或批准,然后继续运行Pipeline。
  • 多功能:Pipeline支持复杂的现实世界的CD需求,包括fork/join,循环, 并行工作。
  • 可扩展:Pipeline插件支持指定扩展到它的DSL,以及与其它插件集成的多个选项。

尽管Jenkins一直允许将自由式job链接到一起的初级形式来执行串行任务,Pipeline使这个概念成为了Jenkins的头等公民。

构建在可扩展性这个核心Jenkins价值之上,Pipeline也可以扩展,用户可使用Pipeline Shared Libraries,开发人员可使用插件来扩展。

下面的流程图是一个CD场景的示例,在Jenkins Pipeline中很容易建模:

在这里插入图片描述

Pipeline概念

Pipeline

Pipeline是CD pipeline的用户自定义模型。Pipeline代码定义了整个构建流程,通常包含了构建应用、测试和发布阶段。

同时, pipeline 块是声明式Pipeline语法的重要部分。

Node

Node是一个机器,它是Jenkins环境的一部分,能够执行Pipeline。

同时, node 块是脚本式Pipeline语法的重要部分。

Stage

stage 块定义了任务的概念上的不同子集,这些任务在整个Pipeline上被执行(比如:Build、Test和Deploy stage),很多插件用它来可视化或者展示Jenkins Pipeline状态/进度。

Step

单个任务。本质上,step告诉Jenkins在一个特定的时间点上做什么(或者叫流程里的一步)。比如,要执行shell命令 make ,使用 sh step: sh 'make' 。当插件扩展Pipeline DSL,通常意味着检查实现了一个新的step。

Pipeline语法概述

声明式Pipeline

在声明式Pipeline语法中, pipeline 块定义了整个Pipeline要做的工作。

Jenkinsfile(声明式Pipeline):

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                //
            }
        }
        stage('Test') {
            steps {
                //
            }
        }
        stage('Deploy') {
            steps {
                //
            }
        }
    }
}

脚本式Pipeline

在脚本式Pipeline语法中,一个或多个 node 块在整个Pipeline中做核心工作。尽管这不是脚本式Pipeline语法的强制需求,把Pipeline的工作限制在 node 块中,做了两件事:

  1. 通过向Jenkins队列中添加一项,安排块中包含的step运行。一旦node上的执行器空闲,该step就会运行。
  2. 创建workspace(某个Pipeline所特有的目录),在此处工作在从源码控制检出的文件上。
    注意:取决于Jenkins配置,一些workspace在一段时间静止(inactivity)后,可能不会自动清理。

Jenkinsfile(脚本式Pipeline):

node {
    stage('Build') {
        //
    }
    stage('Test') {
        //
    }
    stage('Deploy') {
        //
    }
}

Pipeline示例

Jenkinsfile(声明式Pipeline):

pipeline {
    agent any
    options {
        skipStagesAfterUnstable()
    }
    stages {
        stage('Build') {
            steps {
                sh 'make'
            }
        }
        stage('Test'){
            steps {
                sh 'make check'
                junit 'reports/**/*.xml'
            }
        }
        stage('Deploy') {
            steps {
                sh 'make publish'
            }
        }
    }
}

Jenkinsfile(脚本式Pipeline):

node {
    stage('Build') {
        sh 'make'
    }
    stage('Test') {
        sh 'make check'
        junit 'reports/**/*.xml'
    }
    if (currentBuild.currentResult == 'SUCCESS') {
        stage('Deploy') {
            sh 'make publish'
        }
    }
}

参考

  • https://www.jenkins.io/doc/book/pipeline
  • https://www.jenkins.io/zh/doc/book/pipeline (中文文档)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【精华】麻省理工学院MIT技术双月刊(Bimonthly MIT Technology Review)2024年3/4月刊荐书 Book reviews

本期内容概览见博客:2024年3/4月刊内容概览 Book Reviews 1. Read Write Own: Building the Next Era of the Internet By Chris Dixon (Random House, 2024) With the demise of Twitter, many have advocated for a decentralized alternative for social medi…

浅析this指针

浅析this指针 文章目录 浅析this指针前言this指针作用this指针使用注意事项总结 前言 ​ 在面向对象的编程语言中,this指针是一个自引用指针,通常用于指向对象自身。通过这篇文章,我们将探讨this指针的核心特性、应用场景和相关案例。 this指…

高维中介数据:基于交替方向乘子法(ADMM)的高维度单模态中介模型的参数估计(入门+实操)

全文摘要 用于高维度单模态中介模型的参数估计,采用交替方向乘子法(ADMM)进行计算。该包提供了确切独立筛选(SIS)功能来提高中介效应的敏感性和特异性,并支持Lasso、弹性网络、路径Lasso和网络约束惩罚等不…

flynn发布服务小结

背景 flynn是一个基于容器的paas平台,可以快速的发布运行新的应用,用户只需要提交代码到git上,flynn就会基于提交的代码进行发布和部署,本文就简单看下flynn发布部署的流程 flynn发布服务 1.首先flynn会基于用户的web代码构建一…

远程服务器Ubuntu 18.04安装VNC远程桌面

一、安装vnc 1.安装图形化界面工具 # 安装过程中会弹窗让选择配置,选lightdm sudo apt install ubuntu-desktop sudo apt-get install gnome-panel gnome-settings-daemon metacity nautilus gnome-terminal 2.安装vnc sudo apt-get install x11vnc3.安装LightD…

(面试题)数据结构:链表相交

问题:有两个链表,如何判断是否相交,若相交,找出相交的起始节点 一、介绍 链表相交: 若两个链表相交,则两个链表有共同的节点,那从这个节点之后,后面的节点都会重叠,知道…

推荐五本程序员必看书籍!

昨天推送的是视频,今天给大家推荐基本入门渗透测试的好书,以结合昨天文章一起学习,忘记了的可以回复“学习之路”会自动跳出文章的,好的话不多说,直接上主菜了! 第一本当然是我们网络基础的书,…

SpringMVC了解

1.springMVC概述 Spring MVC(Model-View-Controller)是基于 Java 的 Web 应用程序框架,用于开发 Web 应用程序。它通过将应用程序分为模型(Model)、视图(View)和控制器(Controller&a…

快递平台独立版小程序源码|带cps推广营销流量主+前端

源码介绍: 快递代发快递代寄寄件小程序可以对接易达云洋一级总代 快递小程序,接入云洋/易达物流接口,支持选择快递公司,三通一达,极兔,德邦等,功能成熟 如何收益: 1.对接第三方平台成本大约4元…

备战蓝桥杯---状态压缩DP进阶题1

我们来看一看一道比较难的问题(十分十分的巧妙): 显然我们应该一行一行放,又竖的会对下一行产生影响,我们令横着放为0,竖着放的上方为1. 对于下一行,前一行放1的下面为0,但是会出现…

C++指针(三)

个人主页:PingdiGuo_guo 收录专栏:C干货专栏 文章目录 前言 1.字符指针 1.1字符指针的概念 1.2字符指针的用处 1.3字符指针的操作 1.3.1定义 1.3.2初始化 1.4字符指针使用注意事项 2.数组参数,指针参数 2.1数组参数 2.1.1数组参数的概念 2.1…

论文阅读_代码生成模型_CodeLlama

英文名称: Code Llama: Open Foundation Models for Code 中文名称: Code Llama:开放基础代码模型 链接: https://arxiv.org/abs/2308.12950 代码: https://github.com/facebookresearch/codellama 作者: Baptiste Rozire, Jonas Gehring, Fabian Gloeckle, Sten So…

微信小程序云开发教程——墨刀原型工具入门(文件设置+编辑组件)

引言 作为一个小白,小北要怎么在短时间内快速学会微信小程序原型设计? “时间紧,任务重”,这意味着学习时必须把握微信小程序原型设计中的重点、难点,而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…

C++STL之vector

vector 1. vector介绍 vector文档vector其实就是一个顺序表,它表示可变大小数组的序列容器。像数组一样,可以使用下标[] 来访问vector的元素,和数组一样高效;甚至,它的大小是可以动态改变的,其大小由容器自…

广和通5G智能模组SC171支持Android、Linux和Windows系统,拓宽智能物联网应用

世界移动通信大会2024期间,广和通宣布:5G智能模组SC171除支持Android操作系统外,还兼容Linux和Windows系统,帮助更多智能终端客户快速迭代产品,拓宽智能化应用覆盖范围。 广和通SC171系列基于高通QCM6490物联网解决方案…

Redis安全加固策略:服务账号管理 开启redis密码认证 开启防护模式

Redis安全加固策略:服务账号管理 & 开启redis密码认证 & 开启防护模式 1.1 服务账号管理1.1.1 检测方法1.1.2 加固参考配置操作 1.2 开启redis密码认证1.2.1 检测方法1.2.2 加固参考配置操作 1.3 开启防护模式1.3.1 检测方法1.3.2 加固参考配置操作 &#x…

图神经网络实战——基于DeepWalk创建节点表示

图神经网络实战——基于DeepWalk创建节点表示 0. 前言1. Word2Vec1.1 CBOW 与 skip-gram1.2 构建 skip-gram 模型1.3 skip-gram 模型1.4 实现 Word2Vec 模型 2. DeepWalk 和随机行走3. 实现 DeepWalk小结系列链接 0. 前言 DeepWalk 是机器学习 (machine learning, ML) 技术在图…

【NR 定位】3GPP NR Positioning 5G定位标准解读(三)

目录 前言 5 NG-RAN UE定位架构 5.1 架构 5.2 UE定位操作 5.3 NG-RAN定位操作 5.3.1 通用NG-RAN定位操作 5.3.2 OTDOA定位支持 5.3.3 广播辅助信息支持 5.3.4 NR RAT相关定位支持 5.4 NG-RAN中与UE定位相关的元素功能描述 5.4.1 用户设备(UE) …

寻址错题本

指令寻址 顺序寻址 通过程序计数器PC自动加1,形成下一条指令的指令地址。 跳跃寻址 通过转移类指令实现跳转到指定的代码段或者子程序。 数据寻址 直接寻址 形式地址A就是操作数的地址EA,执行阶段访问一次存储器。 所以当我们需要取得实际的值(操作数)的时候: 第一步:…

项目实战 MySQL读写分离【构建主从结构数据库(查从库)(增删改主库)】【ShardingJDBC实现读写分离】

项目实战 MySQL读写分离 1. MySQL主从复制1.1 介绍1.2 搭建1.2.1 准备工作1.2.3 从库配置 2. 读写分离案例2.2 ShardingJDBC介绍 转自-黑马 在前面基础功能实现的过程中,我们后台管理系统及移动端的用户,在进行数据访问时,都是直接操作数据库…