当前位置:首页 > 技术 > 正文内容

深入浅出DevOps:初识Pipline流水线任务

Lotus2022-10-06 19:05技术


???? 作者: 俗世游子【谢先生】。 8年开发3年架构。专注于Java、云原生、大数据等领域技术。

???? 成就: 从CRUD入行,负责过亿级流量架构的设计和落地,解决了千万级数据治理问题。

???? 同名社区:​​51CTO​​​、 ​​github​​​、掘金​、​​gitee​​​。

???? 清单: ​​​goku-framework​​​、​【更新中】享阅读II

DevOps系列

​深入浅出DevOps:DevOps核心思想​

​深入浅出DevOps:版本控制Git&Gitlab​

​深入浅出DevOps:持续集成工具Jenkins​

​深入浅出DevOps:简易Docker入门​

​深入浅出DevOps:Jenkins实战之CI​

​深入浅出DevOps:SonarQube提升代码质量​

​深入浅出DevOps:SonarQube提升代码质量【下】​

​深入浅出DevOps:Jenkins构建器​

​深入浅出DevOps:私有镜像仓库Harbor​

​深入浅出DevOps:Jenkins基于Harbor部署​


前言

之前我们用来展示的案例都是通过自由风格的项目来构建的任务,通过查看我们会发现这几个问题:

  • 需要通过不同的配置项来完成整个任务的构建操作
  • 每个步骤流程都要通过不同的方式设置,并且构建过程中整体流程是不可见的,无法确认每个流程花费的时间
  • 每一个执行过程的日志都混放在一起,出现问题不方便定位

基于上述问题,接下来就来为大家提供对应的解决方案,那就是采用Jenkins的流水线任务

流水线任务

深入浅出DevOps:初识Pipline流水线任务_Pipeline

什么是流水线任务

Jenkins的Pipeline可以让项目的发布整体流程可视化,明确执行的阶段,可以快速的定位问题。并且整个项目的生命周期可以通过一个Jenkinsfile文件管理,并且Jenkinsfile文件可以放在项目中维护。

在随后如果想要升级K8s,那么可以非常方便的切换到KubeSphere上

这样做的好处:

  • 自动地为所有分支创建流水线构建过程并拉取请求。
  • 在流水线上代码复查/迭代 (以及剩余的源代码)。
  • 对流水线进行审计跟踪。
  • 该流水线的真正的源代码, 可以被项目的多个成员查看和编辑。

所以在Jenkinsfile中定义并检查源代码控制是最佳实践,我们接下来也会采用同样的方式来进行操作

流水线语义

pipeline

流水线是用户定义的一个CD流水线模型 。流水线的代码定义了整个的构建过程, 他通常包括构建, 测试和交付应用程序的阶段。

​pipeline​​块是声明式流水线语法的关键部分

node

节点是一个机器 ,它是Jenkins环境的一部分 and is capable of执行流水线。

​node​​块是脚本化流水线语法的关键部分

stage

​stage​​ 块定义了在整个流水线的执行任务的概念性地不同的的子集(比如 "Build", "Test" 和 "Deploy" 阶段), 它被许多插件用于可视化 或Jenkins流水线目前的 状态/进展

step

本质上 ,一个单一的任务, a step 告诉Jenkins 在特定的时间点要做_what_ (或过程中的 "step")。

举个例子,要执行shell命令 ,请使用 ​​sh​​​ 步骤: ​​sh 'make'​​。当一个插件扩展了流水线DSL, 通常意味着插件已经实现了一个新的 step

流水线语法

接下来我们就来看一下关于流水线任务需要了解的语法:

  • 如果大家曾经开发过Groovy程序,那么这个对大家来说就是小意思

流水线脚本中所有的语法和表达式都遵循Groovy的语法,如果不会也不要着急。下面会为大家简单介绍一下。

深入浅出DevOps:初识Pipline流水线任务_Jenkins流水线任务_02

在流水线任务中也能看到相关的简单案例


pipeline块

还记得​​pipeline​​的作用吧,所有有效的声明式流水线必须包含在一个 ​​pipeline​​ 块中:

pipeline {
/*agent,stages都写在这里*/
}

agent块

Jenkins支持分布式,那么指定任务在某一个节点上就需要在agent中进行定义,比如

pipeline {
agent any
}

any表示在任何可用的节点上执行流水线或阶段。

agent指令应该使用在参数应用在​​pipeline​​块的顶层或 ​​stage​​ 指令内部

关于可执行节点的问题

之前并没有介绍过Jenkins的分布式部署,所以对于这块的内容并没有介绍过。

关于Jenkins在执行任务过程中可执行的节点信息,我们可以通过​​系统管理>节点管理​​中进行相关查看

深入浅出DevOps:初识Pipline流水线任务_Jenkins流水线任务_03

未来需要添加新的可执行节点也是通过当前界面来进行添加的

关于之后所说的有关label的定义,所匹配的也是此处节点,相当于为服务器节点打上了标签

好,那么接下来我们再来看看支持的其他参数

  • none

在​​pipeline​​块的顶层如果定义了​​agent none​​,表示没有定义全局代理,那么agent参数必须定义在​​stage​​部分

pipeline {
agent none
stages {
stage('Test') {
agent any
}
}
}
  • label

在指定的标签节点上指定对应的流水线任务或者阶段,可执行节点的标签在节点管理下设置,此时在流水线任务中只需要进行如下配置

pipeline {
agent {
label 'master'
}
}

深入浅出DevOps:初识Pipline流水线任务_Jenkins流水线任务_04

  • node

直接来看和label的不同之处,但意义是一样的

pipeline {
agent {
node {
/* 这里的配置和上面label的定义是一样的性质 */
label 'master'
/* 自定义工作区 */
customWorkspace '/some/other/path'
}
}
}

本人jenkins:2.332.1-lts,但是根据官网语法并无法配置agent docker等相关信息,会报出如下错误,所以agent的介绍就到这里

深入浅出DevOps:初识Pipline流水线任务_DevOps_05

stages块

深入浅出DevOps:初识Pipline流水线任务_DevOps_06

包含一个或多个 stage 指令, stages 部分是流水线描述的大部分任务工作的位置。 并且建议stages至少包含一个stage指令用于连续交付过程的每个离散部分,比如构建、测试、部署等每个流程。

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

以上代码块就属于一个非常简单的案例, 其中stage属于一个指令,可以通过标识说明当前指令的工作内容

stage('Build') {
steps {
echo 'Build'
}
}

并且在stage中我们也可以定义关于agent、environment等相关的指令集。

steps属于固定写法,记住就好

environment

定一个键-值对序列,该序列将被定义为所有步骤的环境变量,或者是特定于阶段的步骤, 这取决于 ​​environment​​ 指令在流水线内的位置:

  • 如果environment在pipeline位置,属于全局属性值。
  • 如果environment在stage位置,属于局部属性值,只能在当前stage下使用

用来定义属性常量使用

pipeline {
agent any
// 此处定义的environment的属性值可以使用在整个流水线任务中的各个stage中
environment {
harborHost = '192.168.10.201'
}
stages {
stage('Test') {
// 此处定义的environment只能使用在当前stage中
environment {
git = 'root'
}
steps {
echo ${harborHost}
echo ${git}
}
}
}
}

post

可以定义在stage中,也可以定义在整体的最后。post支持通过状态块的方式来定义后续的执行操作,其中包含如下几种状态

比如任务构建通知,异常处理等

  • always

无论流水线或阶段的完成状态如何,都允许在 post 部分运行该步骤。

  • changed

只有当前流水线或阶段的完成状态与它之前的运行不同时,才允许在 post 部分运行该步骤。

  • failure

只有当前流水线或阶段的完成状态为"failure",也就是构建出现了问题才允许在 post 部分运行该步骤。

  • success

只有当前流水线或阶段的完成状态为"success",整个构建成功才允许在 post 部分运行该步骤。

  • unstable

只有当前流水线或阶段的完成状态为"unstable",才允许在 post 部分运行该步骤, 通常由于测试失败,代码违规等造成。

  • aborted

只有当前流水线或阶段的完成状态为"aborted",才允许在 post 部分运行该步骤, 通常由于流水线被手动的aborted。

pipeline {
agent any
stages {
stage('Build') {
steps {
echo 'Build'
}
post {
success {
echo 'Build success'
}
}
}
stage('Test') {
steps {
echo 'Test'
}
}
stage('Deploy') {
steps {
echo 'Deploy'
}
}
}
post {
always {
echo 'stage exec'
}

success {
echo 'stages success '
}
}
}

when

当前指令允许流水线根据给定的条件决定是否应该执行阶段。 when 指令必须包含至少一个条件。 如果 when 指令包含多个条件, 所有的子条件必须返回True,阶段才能执行。 这与子条件在 allOf 条件下嵌套的情况相同。

pipeline {
agent any
stages {
stage('Build') {
steps {
echo 'Build'
}
post {
success {
echo 'Build success'
}
}
}
stage('Deploy') {
when {
branch 'feature'
}
steps {
echo 'Deploy'
}
}
}
}

以下都是关于when所支持的条件选项:

  • branch

当正在构建的分支与模式给定的分支匹配时,执行当前阶段。

when {
branch 'feature'
}
  • 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'
}
}

最后

整个流水线语法我们就先介绍到这里,通常情况下,本章的语法已经足够我们在工作中的使用。

但是如果还有设计到其他的语法需要查找的,可以点击​​进入官网​​,对相关语法进行查阅

后面我们会使用流水线的方式对任务进行改造,并且加入构建通知等。

扫描二维码推送至手机访问。

版权声明:本文来源于网络,仅供学习,如侵权请联系站长删除。

本文链接:https://news.layui.org.cn/post/149.html

分享给朋友:

“深入浅出DevOps:初识Pipline流水线任务” 的相关文章

你看好云原生吗?

我理解的云原生是一种思想。目前为止,再稍具体一点就是一种构建和运行应用程序的方法 ,是一套技术体系和方法论。 目前来看,互联网技术领域没有那么粗放了,可以看成从”一堆砖头“变成了码的整齐的砖头,各种人物资源、空间利用率更高了。 云原生还在不断的发展,一年前我看中了云原生的发展方向并展开了一系列的学习,目前工作中也只是稍有涉及,并不是主要工作,我还是非常期望可以从事云原生工作的,下面罗列一下云原...

[s905l3]性价比神机mgv3000全网首拆,刷armbian实现更多价值!

最近花55淘了一台mgv3000,s905l3,2+16G带蓝牙,真的性价比没得说 S905L3 工艺28nm差于s905l3a 主频1.9Ghz,超频可以达到2Ghz,GPU是Mail450,当服务器跑ha,nas什么都是很不错的。 而且还自带蓝牙,总体性价比比s905l3a系列高多了 按我的方法可以启动,网卡没有问题,但是目前没有显示,没有蓝牙。 等之后我有时间了照着安卓的dtb改一改也许会解...

设计模式之访问者模式

大多数情况下你不需要访问者模式,但当一旦需要访问者模式时,那就是真的需要它了,这是设计模式创始人的原话。可以看出应用场景比较少,但需要它的时候是不可或缺的,这篇文章就开始学习最后一个设计模式——访问者模式。 一、概念理解 访问者模式概念:封装作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 通俗的解释就是,系统中有一些固定结构的对象(元素),在其...

C++浅拷贝深拷贝

1. C++ 浅拷贝 什么是浅拷贝? 一般比较形象的理解,浅拷贝可以理解"值"层面的拷贝,深拷贝可以理解成"内存"上的拷贝,特别是类里面含有指针类型的。 // .h文件class HasPtrMem{public:HasPtrMem();HasPtrMem(const HasPtrMem& h);~HasPtrMem();void print();int *p;};// .cpp 文件H...

Python基础(九) | time random collections itertools标准库详解

⭐本专栏旨在对Python的基础语法进行详解,精炼地总结语法中的重点,详解难点,面向零基础及入门的学习者,通过专栏的学习可以熟练掌握python编程,同时为后续的数据分析,机器学习及深度学习的代码能力打下坚实的基础。 ????本文已收录于Python基础系列专栏: Python基础系列教程 欢迎订阅,持续更新。 Python自身提供了比较丰富的生态,拿来即用,可极大的提高开发效率 9...

条件期望:Conditional Expectation 举例详解之入门之入门之草履虫都说听懂了

我知道有很多人理解不了 “条件期望” (Conditional Expectation) 这个东西,有的时候没看清把随机变量看成事件,把 \(\sigma\)-algebra 看成随机变量从而思路全错的时候,我也会觉得莫名奇妙。所以在这里用一个极其简单的例子解释一下,只要你是一只上过高中的草履虫那就能听懂。 \[\] 我们来丢一枚质地均匀的硬币(意味着得到正面与反面的概率各为 \(\frac{...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。