【自动化持续集成必备基础】pipeline常用功能

news2025/7/5 12:00:36

简介

​pipeline是一套运行在jenkins上的工作流框架,可以实现复杂流程的编排和可视化运行

pipeline支持两种语法:Declarative Pipeline(声明式流水线)和Scripted Pipeline (脚本式流水线)

本文重点介绍主流的声明式流水线

创建流水线项目

在Jenkins中如果要使用pipeline流水线的话,必须安装pipeline插件

创建一个流水线项目

pipeline结构(声明式)

基础结构

pipeline {
    agent any
    stages {
        stage("stage") {
            steps {
                echo "hello pipeline"
            }
        }
    }
}

持续集成结构(部分)

pipeline {
  agent any
  stages {
    stage('pull project code') {
      steps {
        sh 'echox pull project code'
      }
    }
 
    stage('mvn package') {
      steps {
        sh 'echo mvn package'
      }
    }
 
    stage('build and push image') {
      steps {
        sh 'echo build and push image'
      }
    }
 
    stage('deploy to k8s') {
      steps {
        sh 'echo deploy to k8s'
      }
    }
 
    stage('pull autotest code') {
      steps {
        sh 'echo pull autotest code'
      }
    }
 
    stage('run autotest') {
      steps {
        sh 'echo run autotest'
      }
    }
 
    stage('allure report') {
      steps {
        sh 'echo allure report'
      }
    } 
  }
}

pipeline结构解析:pipeline

声明式流水线根节点,也是声明式流水线的开始

pipeline {}

pipeline结构解析:agent

agent指定流水线运行在哪个环境之中,有如下选项: 

any:在任何环境中执行流水线

pipeline {
    agent any
}

none:表示没有全局的agent配置,每个stage需要指定自己的agent

pipeline {
    agent none 
    stages {
        stage('allure report'){
           agent any
         }
     }
}


node:指定在某个标签的节点上运行

pipeline {
    agent none 
    stages {
        stage('allure report'){
            agent { label 'allureReport-slave-label' }
        }	    
    }
}

Dockerfile:通过dockerfile创建镜像并运行容器,在这个容器中运行,用的不多

docker:在docker中运行


k8s:运行在某一个k8s集群中,可以实现动态slave,示例:https://www.cnblogs.com/uncleyong/p/16721826.html

pipeline结构解析:stages、stage

stages:所有阶段的集合

stage:某一个阶段,stage的名称要唯一

pipeline结构解析:steps

steps:某个阶段要运行的具体步骤,包含一个或多个步骤

示例:

pipeline {
  agent any
  stages {
    stage('pull project code') {
      steps {
        sh """
          echo "pull project code"
          pwd
        """
      }
    }
  }
}

pipeline结构解析:post

可以定义在pipeline或stage中,根据运行状态来匹配做一些操作,主要状态:

always:无论状态如何,都会运行该post中的指令
success:只有成功时才运行
failure:只有失败才运行
aborted:只有取消运行时才运行
unstable:只有运行不稳定时才运行

post和stages平级

示例:

pipeline {
  agent any
  stages {
    stage('pull project code') {
      steps {
        sh 'echox pull project code'
      }
    }
 
    stage('mvn package') {
      steps {
        sh 'echo mvn package'
      }
    }
 
    stage('build and push image') {
      steps {
        sh 'echo build and push image'
      }
    }
 
    stage('deploy to k8s') {
      steps {
        sh 'echo deploy to k8s'
      }
    }
 
    stage('pull autotest code') {
      steps {
        sh 'echo pull autotest code'
      }
    }
 
    stage('run autotest') {
      steps {
        sh 'echo run autotest'
      }
    }
 
    stage('allure report') {
      steps {
        sh 'echo allure report'
      }
    } 
  }
  post {
    always {
      echo "发送邮件"
    }
  }
}

虽然前面都失败了,但是最后post是运行了的

 

post也可以和steps平级,参考stage("allure report"):https://www.cnblogs.com/uncleyong/p/16721826.html

pipeline结构解析:environment

设置流水线的环境变量,可以定义在pipeline中作为全局变量,也可以配置在stage中作为该stage的环境变量。

示例:

pipeline {
  agent any
  environment {
    HARBOR_ADDRESS = "192.168.117.160"
    IMAGE_NAME = "gift"
    NAMESPACE = "gift"
  }
  stages {
    stage('pull project code') {
      steps {
        sh """
          echo "${HARBOR_ADDRESS}"
          echo "${IMAGE_NAME}"
          echo "${NAMESPACE}"
        """
      }
    }
  }
}

结果

pipeline结构解析:options

jenkins流水线支持很多内置指令,可以写在pipeline顶层,也可以写在stage中

常用指令:

retry:流水线失败后重试次数,options { retry(2) }

timeout:设置流水线的超时时间,超时后job会自动终止,options{ timeout(time: 10, unit: 'SECONDS') }

timestamps:jenkins控制台输出时间戳,options { timestamps() }

示例:

pipeline {
  agent any
  environment {
    HARBOR_ADDRESS = "192.168.117.160"
    IMAGE_NAME = "gift"
    NAMESPACE = "gift"
  }
  stages {
    stage('pull project code') {
      options {
        timeout(time: 10, unit: 'SECONDS') 
        timestamps()
      }
      steps {
        sh """
          echo "${HARBOR_ADDRESS}"
          sleep 11
          echo "${IMAGE_NAME}"
          echo "${NAMESPACE}"
        """
      }
    }
  }
}

结果

pipeline结构解析:parameters

参数化构建,常用参数类型:

string:字符串类型的参数

text:文本型参数,用于定义多行文本内容的变量

booleanParam:布尔型参数

choice:选择型参数

示例

pipeline {
  agent any

  environment {
    HARBOR_ADDRESS = "192.168.117.160"
    IMAGE_NAME = "gift"
    NAMESPACE = "gift"
  }


  parameters {
    string(name: 'StringName', defaultValue: 'jack', description: 'string')
    text(name: 'TextName', defaultValue: '', description: 'text')
    booleanParam(name: 'booleanParamName', defaultValue: true, description: 'booleanParam') 
    choice(name: 'ChoiceName', choices: ['test', 'dev', 'product'], description: 'choice')
  }

  stages {
    stage('pull project code') {
      options {
        timestamps()
      }
      steps {
        sh """
          echo "${params.StringName}"
          echo "${params.TextName}"
          echo "${params.booleanParamName}"
          echo "${params.ChoiceName}"
        """
      }
    }
  }
}

构建一次后,才会出现下面的按钮

默认值

修改默认值

结果

pipeline结构解析:when

when允许pipeline根据给定的条件确定是否执行该stage,when必须至少包含一个条件

常用的内置条件:

environment:当指定的环境变量和给定的变量匹配时执行这个stage

equals:当期望值和实际值相同时执行这个stage

expression:当指定的表达式为True时执行这个stage

not:当嵌套条件出现错误时执行这个stage

allOf:当所有的嵌套条件都为True时执行这个stage

anyOf:当至少有一个嵌套条件为True时执行这个stage

environment

pipeline {
  agent any

  environment {
    RunTag = "v1"
  }

  stages {
    stage('pull project code') {
      steps {
        sh 'echo pull project code'
      }
    }
 
    stage('mvn package') {
      steps {
        sh 'echo mvn package'
      }
    }
 
    stage('build and push image') {
      steps {
        sh 'echo build and push image'
      }
    }
 
    stage('deploy to k8s') {
      steps {
        sh 'echo deploy to k8s'
      }
    }
 
    stage('pull autotest code') {
      when {
        environment name: 'RunTag', value: 'v2'
      }
      steps {
        sh 'echo pull autotest code'
      }
    }
 
    stage('run autotest') {
      steps {
        sh 'echo run autotest'
      }
    }
 
    stage('allure report') {
      steps {
        sh 'echo allure report'
      }
    } 
  }
}

修改,RunTag = "v2",则下面pull autotest code会执行  

expression

参考:https://www.cnblogs.com/uncleyong/p/16721826.html

pipeline结构解析:parallel

在声明式流水线中可以使用parallel字段实现并行构建

示例

pipeline {
  agent any
  stages {
    stage('s1') {
      steps {
        sh 'echo s1'
      }
    }
 
    stage('s2') {
      parallel {
        stage('parallel-1'){
          steps{
            echo "parallel-1"
          }
        }
        stage('parallel-2'){
          steps{
            echo "parallel-2"
          }
        }
      }
    }
 
    stage('s3') {
      steps {
        sh 'echo s3'
      }
    } 
  }
}

结果:

修改脚本,让其中一个并行操作失败

pipeline {
  agent any
  stages {
    stage('s1') {
      steps {
        sh 'echo s1'
      }
    }
 
    stage('s2') {
      parallel {
        stage('parallel-1'){
          steps{
            echo "parallel-1"
          }
        }
        stage('parallel-2'){
          steps{
            echox "parallel-2"
          }
        }
      }
    }
 
    stage('s3') {
      steps {
        sh 'echo s3'
      }
    } 
  }
}

结果:

其中一个并行操作失败,其它并行操作不受影响,但是并行操作所属stage后面的stage会失败

由于两个并行操作很快,为了验证其它并行操作不受影响,我们在正确的并行操作中加个休眠,这样保证失败的并行操作先执行

pipeline {
  agent any
  stages {
    stage('s1') {
      steps {
        sh 'echo s1'
      }
    }
 
    stage('s2') {
      parallel {
        stage('parallel-1'){
          steps{
            sleep 10
            echo "parallel-1"
          }
        }
        stage('parallel-2'){
          steps{
            echox "parallel-2"
          }
        }
      }
    }
 
    stage('s3') {
      steps {
        sh 'echo s3'
      }
    } 
  }
}

可以看到,失败的并行操作先执行完了

最后结果:

之所以会是上面的结果(其中一个并行操作出问题,其它并行操作不受影响,但是后面非并行的stage会失败),是因为failFast默认为false

我们将failFast的值改为true,此时,其它并行操作就会是aborted状态(中止,取消运行)

pipeline {
  agent any
  stages {
    stage('s1') {
      steps {
        sh 'echo s1'
      }
    }
 
    stage('s2') {
      failFast true
      parallel {
        stage('parallel-1'){
          steps{
            sleep 10
            echo "parallel-1"
          }
        }
        stage('parallel-2'){
          steps{
            echox "parallel-2"
          }
        }
      }
    }
 
    stage('s3') {
      steps {
        sh 'echo s3'
      }
    } 
  }
}

结果:

再添加一个并行操作

pipeline {
  agent any
  stages {
    stage('s1') {
      steps {
        sh 'echo s1'
      }
    }
 
    stage('s2') {
      failFast true
      parallel {
        stage('parallel-1'){
          steps{
            sleep 10
            echo "parallel-1"
          }
        }
        stage('parallel-2'){
          steps{
            echox "parallel-2"
          }
        }
        stage('parallel-3'){
          steps{
            echo "parallel-3"
          }
        }
      }
    }
 
    stage('s3') {
      steps {
        sh 'echo s3'
      }
    } 
  }
}

结果:下面并行任务3仍然执行了,是因为执行太快导致的

 

流水线语法生成器:工具生成

jenkins为我们提供了一个流水线步骤自动生成器,打开创建的pipeline任务,点击流水线语法

使用下面两个菜单帮我们生成部分脚本

片段生成器:各种插件的pipeline脚本生成

Declarative Directive Generator:声明式指令生成器

示例1(插件):git

结果:

git branch: 'test', changelog: false, credentialsId: 'qzcsbj_gitlab', poll: false, url: 'git@192.168.117.180:qzcsbj/gift.git'

branch默认为master,changelog和poll默认为true

示例2(指令):环境变量

结果:

environment {
  HARBOR_ADDRESS = "192.168.117.160"
  IMAGE_NAME = "gift"
  NAMESPACE = "gift"
}

★★★★★【推荐】企业级自动化持续集成:pipeline综合应用

可以整合python、java等自动化框架

git + gitlab + jenkins + pipeline + maven + harbor + docker + k8s

详见:https://www.cnblogs.com/uncleyong/p/16721826.html

【热门测试技术,自学提升推荐】项目实战(自动化、性能)、简历、笔试面试、职业规划

https://www.cnblogs.com/uncleyong/p/15777706.html

【bak】

原文会持续更新,原文地址:https://www.cnblogs.com/uncleyong/p/16705620.html

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

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

相关文章

SpringBoot SpringBoot 原理篇 2 自定义starter 2.4 使用属性配置设置功能参数【1】

SpringBoot 【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇2 自定义starter2.4 使用属性配置设置功能参数【1】2.4.1 直接开干2.4.2 小结…

linux驱动之调试技巧--- 应用程序远程gdb+vscode调试应用程序, 串口kgdboc调试.ko驱动程序

环境: Ubuntu: Ubuntu 22.04.1 开发板: imx6ull linux内核版本: Linux4.9.88 虚拟机: vmware15 交叉编译工具gcc版本: 4.9.4 (Linaro GCC 4.9-2017.01) arm-linux-gdb版本: gdb (Linaro_GDB-2017.01) 7.10.1.20160210 先决条件 开发板 虚拟机 PC 可互通网络 交叉编译环境已经搭…

哈希(Hash)

文章目录一、哈希是什么?二、哈希冲突三、开放定址法1.线性探测2.二次探测四、拉链法/哈希桶五、哈希的应用1.位图1.1 面试题1.2 位图概念1.3 位图的应用2.布隆过滤器2.1概念2.2布隆过滤器的查找2.3布隆过滤器的删除一、哈希是什么? Hash,一般…

语音识别系列︱利用达摩院ModelScope进行语音识别+标点修复(四)

终于有时间更新语音识别系列了,之前的几篇: 语音识别系列︱用python进行音频解析(一) 语音识别系列︱paddlehub的开源语音识别模型测试(二) 语音识别系列︱paddlespeech的开源语音识别模型测试(…

1. JVM类加载机制

1. JVM类加载机制图解 下面我们来详细分析一下这个图解 1.1 其中loadClass()方法的调用的类加载的过程有如下几步 加载->验证->准备->解析->初始化->使用->卸载 加载:在硬盘上查找并通过IO读入字节码文件,当使用到这类的时候才会加…

[GYCTF2020]Ezsqli

先试一下万能密码 1 or 11# 发现有过滤,fuzz看一下过滤了什么 if,|,|| 没过滤,过滤了information_schema MySQL5.7新特性: 由于performance_schema过于复杂,所以mysql在5.7版本中新增了sys schemma&#x…

Docker实战之Redis主从集群搭建实战

实战 本实验将练习三主三从的Redis的docker集群快速搭建,实现集群的动态扩容和缩容,主从切换等常见实践项目。 拉取镜像 docker pull redis:6.0.8搭建主从 docker run -d --name redis-node-1 --net host --privilegedtrue -v /data/redis/share/red…

Allegro输出DXF文件操作指导

Allegro输出DXF文件操作指导 Allegro支持输出DXF文件,用于检查PCB的结构,具体操作如下 首先在PCB上打开需要的输出的层面,需要哪层开哪层,如下图所示 点击file-export 弹出一个对话框,输入文件名,格式选择Reversion14 ,单位选择mm,精度选择4 然后点击Edit 会出现一…

视频播放

QMediaPlayer不仅可以播放音频,还可以播放视频,不过要在屏幕上显示的话需要使用QVideoWidget和QGraphicsVideoItrm或自定义的类。QMovie 播放GIF文件QVideoWidget和QGraphicsVideoItrm都属于QMulimedia Widgets模块QVideoWidget 继承自QWiaget&#xff0…

Android Studio下载安装

一、下载 二、安装步骤 点击下载的安装包,选择地址的时候可以自定义,其他按照默认配置即可。 启动应用,开始配置 选择安装类型为标准安装: 选择主题 确认配置 同意协议 开始下载相关组件: 下载完成

SpringCloud - GateWay服务网关

文章目录一. Gateway概述1.Gateway是什么2. Gateway作用3. 微服务架构中网关的位置4. SpringCloud Gateway概念5. SpringCloud Gateway IO 模型二.Gateway的三大核心概念1. Route 路由2. Predicate 断言3. Filter 过滤4. 总结三.Spring Cloud Gateway工作流程四.服务搭建1. 创建…

Android 基础知识3-3(九妹)图怎么用呢?

1.本节引用: 可能有的一些疑问: 1.什么是.9图片? 答:图片后缀名前有.9的图片,如pic1.9.png这样的图片 2. .9图片能干嘛? 答: 在图片拉伸的时候特定的区域不会发生图片失真,而不失真的区域可以…

知识库指南4.0|AIGC Web3 元宇宙发展趋势的学习与实践指引

如何突破信息层面的认知,在 AIGC、Web3 与 元宇宙领域从 “围观” “看热闹” 到真正入门理解,并跟紧行业发展趋势,探索实践落地?(阅读原文领取限量优惠券)Mixlab小杜满足上述学习需求的知识库需要包含四要…

大数据(9f)Flink双流JOIN

文章目录概述开发环境使用状态列表实现 INNER JOIN(双流connect后CoProcessFunction)基于间隔的JOIN(Interval Join)基于窗口的JOIN(Window Join)概述 Flink双流JOIN可用算子或SQL实现,FlinkSQ…

图论基础学习笔记

图论1.简单图2.简单图的补图3.图的同构4.完全图5.偶图6.完全偶图1.简单图 简单图:无环无平行边的图。下图:左环右平行边 平凡图:G(1,0)G(1,0)G(1,0) 零图:G(p,0)G(p,0)G(p,0) 2.简单图的补图 补图:对于 G(V,E)G(V,…

继电器电路分析-继电器放电时间、反向冲击电压

继电器的应用,相信大家都知道,在电路中只要给它供电、断电也就可以工作了。 然而,它的应用细节,不知道大家有没注意 。下面谈谈我的观点。 01 现在流行的接法 如下图: 图中,继电器的线圈经过Q1作为开关…

《丞相好梦中杀人,我喜梦中听课》(1)密码学入门

前言 🍀作者简介:被吉师散养、喜欢前端、学过后端、练过CTF、玩过DOS、不喜欢java的不知名学生。 🍁个人主页:红中 🫒每日emo:等我把脸皮磨厚 🍂专栏地址:网安专栏 今天周日&#xf…

金融开放度指数-世界银行三位数字编码、ISO Alpha-3 Code等多指标数据

1、数据来源:http://web.pdx.edu/~ito/Chinn-Ito_website.htm 2、时间跨度:1970-2019 3、区域范围:全国 4、指标说明: Chinn-Ito指数(KAOPEN)是衡量一个国家资本账户开放程度的指标。 该指数最初是在Chinn和Ito (Journal of D…

并发基础(四):线程池

尺有所短,寸有所长;不忘初心,方得始终。 请关注公众号:星河之码 线程池技术是一种多线程处理形式,将任务添加到队列中,通过线程池中创建出来的现成执行这些任务,省去了创建线程和销毁线程的消耗…

let const var区别

文章目录写在前面1.var关键字1.1 没有块级作用域的概念,有全局作用域、函数作用域的概念1.2 存在变量提升1.3 全局作用域用var声明的变量会挂载到window对象上1.4 同一作用域中允许重复声明1.5 不初始化值默认为undefined2.let关键字2.1 有块级作用域的概念2.2 不存…