【Linux】Jenkins Pipeline流水线详解及基于Jenkins流水线实现自动更新项目(实战)

news2024/11/25 7:11:28

在这里插入图片描述

👨‍🎓博主简介

  🏅CSDN博客专家
  🏅云计算领域优质创作者
  🏅华为云开发者社区专家博主
  🏅阿里云开发者社区专家博主
💊交流社区:运维交流社区 欢迎大家的加入!
🐋 希望大家多多支持,我们一起进步!😄
🎉如果文章对你有帮助的话,欢迎 点赞 👍🏻 评论 💬 收藏 ⭐️ 加关注+💗


文章目录

  • 一、Pipeline 流水线的简介
    • 1.1 什么是Jenkins的流水线?
    • 1.2 Pipeline中几个重要概念:
    • 1.3 Pipeline优势
  • 二、Pipeline流水线 简单的构建
    • 2.1 jenkinsfile 必备的五个组成部分
    • 2.2 Jenkins 上创建一个 Pipeline 流水线任务
      • 2.2.1 Jenkins 上安装Blue Ocean插件
      • 2.2.2 新建一个 Pipeline 任务
      • 2.2.3 编辑流水线
      • 2.2.4 保存并构建流水线
  • 三、Pipeline流水线 声明式语法解析
  • 四、【进阶】基于Pipeline 流水线实现项目的更新
    • 4.1 熟悉项目更新流程
    • 4.2 基于上面创建的Pipeline流水线任务修改(可自行重新创建)
    • 4.3 保存并构建流水线
    • 4.5 查看服务是否正常
  • 五、相关专栏
  • 六、相关文章

  之前采用Jenkins的自由风格构建的项目,每个步骤流程都要通过不同的方式设置,并且构建过程中整体流程是不可见的,无法确认每个流程花费的时间,并且问题不方便定位问题。

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

所以Pipeline相对自由风格或者其他的项目风格更容易操作。

  pipline是帮助Jenkins实现CI到CD转变的重要角色,是运行在jenkins2.X版本的核心插件,简单来说Pipline就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程,从而实现单个任务很难实现的复杂流程编排和任务可视化。

一、Pipeline 流水线的简介

1.1 什么是Jenkins的流水线?

Jenkins的流水线(Pipeline)是一套插件,用于实现和集成持续交付流水线到Jenkins。流水线可以自动表达从版本控制向用户和客户获取软件的进程。具体来说,软件的每次变更(在源代码控制中提交)在被释放的路上都会经历一个复杂的过程,这个过程包括以一种可靠且可重复的方式构建软件,并通过多个测试和部署阶段来开发构建好的软件。

对Jenkins流水线的定义被写在一个文本文件中(称为Jenkinsfile),该文件可以被提交到项目的源代码控制仓库,这是“流水线即代码”的基础。将CD流水线作为应用程序的一部分,像其他代码一样进行版本化和审查。 创建 Jenkinsfile并提交它到源代码控制中提供了一些即时的好处:

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

While定义流水线的语法, 无论是在 web UI 还是在 Jenkinsfile 中都是相同的, 通常认为在Jenkinsfile 中定义并检查源代码控制是最佳实践。

1.2 Pipeline中几个重要概念:

  • pipeline 流水线是用户定义的一个CD流水线模型 。流水线的代码定义了整个的构建过程, 他通常包括构建, 测试和交付应用程序的阶段 。
    pipeline 块声明式流水线语法的关键部分
  • Stage:阶段,一个pipeline可以划分为若干个stage,每个stage都是一个操作步骤,比如clone代码、代码编译、代码测试和代码部署,阶段是一个逻辑分组,可以跨多个node执行。
  • Node:节点,每个node都是一个jenkins节点,可以是jenkins master也可以是jenkins agent,node是执行step的具体服务器。另外, node块是 脚本化流水线语法的关键部分
  • Step:步骤,step是jenkins pipeline最基本的操作单元,从在服务器创建目录到构建容器镜像,由各类Jenkins插件提供实现,一个stage中可以有多个step,例如:sh “make”

1.3 Pipeline优势

  • 可持续性:jenkins的重启或者中断后不影响已经执行的pipeline Job
  • 支持暂停:pipeline可以选择停止并等待人工输入或批准后再继续执行
  • 可扩展:通过groovy的编程更容易的扩展插件
  • 并行执行:通过groovy脚本可以实现step,stage间的并行执行,和更复杂的相互依赖关系。

二、Pipeline流水线 简单的构建

流水线既能作为任务的本身,也能作为Jenkinsfile,其类似于dockerfile(将启动docker的所有命令,打包成一个文件)

Jenkins的web-ui所做的操作,也可以落地到Jenkinsfile里面,与dockerfile类似去开发

使用流水线可以让我们的任务从ui手动操作,转换为代码化,像docker的dockerfile一样,从shell命令到配置文件,更适合大型项目,可以让团队其他开发者同时参与进来,同时也可以编辑开发Jenkinswebui不能完成的更复杂的构建逻辑,作为开发者可读性也更好。

2.1 jenkinsfile 必备的五个组成部分

Jenkinsfile·有5个必备的组成部分

语法解析
pipeline整条流水线
agent指定执行器(也就是你要在哪台服务器上执行)
stages所有阶段(只有一个,下面为stage)
stage某一阶段(可有多个,下面为steps)
steps阶段内的每一步,可执行命令(可执行多条命令)

2.2 Jenkins 上创建一个 Pipeline 流水线任务

2.2.1 Jenkins 上安装Blue Ocean插件

找到插件商场;

Manage Jenkins --> Plugins --> 点击Available plugins :搜索Blue Ocean --> 点击安装

在这里插入图片描述

在这里插入图片描述

因为我这里已经安装了,就从installed里面截图了。找到Blue Ocean点击安装。

在这里插入图片描述

在这里插入图片描述

等待安装完重启jenkins;重启完之后就可以在首页中的左侧看到打开Blue Ocean了;

在这里插入图片描述

然后我们新建一个流水线任务;

2.2.2 新建一个 Pipeline 任务

点击新建Item – > 选中Pipeline,输入一个任务名称;

在这里插入图片描述

自己定义一下描述即可;

在这里插入图片描述

2.2.3 编辑流水线

鉴于对新手不太友好,我们这里先看看,然后使用Hello World脚本生成;生成Groovy脚本;

在这里插入图片描述

默认会生成一个Hello World脚本,可以看到应用到了上面说的Jenkinsfile必备的五个组成部分;其他的就可以自行添加了,我们先来测试;

2.2.4 保存并构建流水线

  • 直接点击保存 --> 然后build构建

在这里插入图片描述

在这里插入图片描述

点击构建的时候会在左下角的构建历史展示,如果没有刷新一下页面就可以了;直接点击进去再去找Console Output控制台输出或者是直接鼠标停留点击尖角号,再点击Console Output查看控制台输出。

在这里插入图片描述

SUCCESS表示执行完成,没有报错:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们执行完也可以看一下阶段视图

在这里插入图片描述

这样一个简单的流水线就构建成功了,可视化我们可以点击左侧的 打开Blue Ocean,就可以看到刚刚执行的流程;

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这样就可以看到可视化执行过程了,当然因为这个是只有一个stage所以看着不是很清晰,后面我们会添加更多的stage,这时候的可视化过程就发挥到了他的作用了。

三、Pipeline流水线 声明式语法解析

可参考:

【Jenkins】Pipeline流水线语法解析全集 – 声明式流水线

【Jenkins】Pipeline流水线语法解析全集 – 脚本式流水线、groovy语法

四、【进阶】基于Pipeline 流水线实现项目的更新

4.1 熟悉项目更新流程

熟悉项目更新流程:就是我们在服务器上是怎么更新的,那么我们在这就先写好更新的流程;

例如:我们更新服务里的某一个文件使用的容器方式,那么步骤就是:

1、复制文件到一个目录下;

2、备份之前的文件;

3、将复制的文件放到服务所需的目录下;

4、重启服务容器;

5、直接在容器外执行指定容器内命令启动服务;

6、测试(可使用脚本进行测试返回一个值,也可以自己再页面测试)

以上就是整体更新的流程了,那么我们可以写5个 – 6个stage:看以下部分:

pipeline {
    agent {
        label '224'
    }
    environment {
        Container_wai = '/home/lcy/'
        Container_nei = '/application/'
    }

    stages {
        stage('copy_file') {	// 复制文件到服务器上
            steps {
                
            }
        }
        
        stage('backup_file') {	// 备份要更新的文件
            steps {
                
            }
        }
        
        stage('mv_file') {	// 将新上传的文件复制到项目所需的路径下
            steps {
                
            }
        }
        
        stage('restart_container') {	// 重启容器
            steps {
                
            }
        }
        
        stage('start_service') {	// 启动服务
            steps {
                
            }
        }
    }
}

解析:

agent {
    label '224'
}

在node为224的服务器上执行此操作,224为添加node时自定义的名字,具体如何添加node,可查看:【Jenkins】Pipeline流水线语法解析全集 – 声明式流水线 中的如何创建一个node节点。


environment:为配置的环境变量,这里我们配置的是文件上传的路径的和文件要更新的路径;

下面就是一个大的stages下分别有多个stage,一个stage代表一个操作,便于排查问题;一个stage下有一个steps,steps内可以写具体要执行的操作;

大概流程写完之后,我们就可以在steps中写具体操作了;

4.2 基于上面创建的Pipeline流水线任务修改(可自行重新创建)

这里我们没有项目在git上,所以跳过git那一步,从本机往目标服务器拉取文件;

目标服务器记得做免密,一般在配置node节点的时候就会做免密;

pipeline {
    agent {
        label '224'
    }
    environment {
        file_Path = '/home/lcy/'
        Container_wai = '/home/lcy/V1.0'
        Container_nei = '/application/'
        file_Name = 'cs.py'
    }

    stages {
        stage('copy_file') {
            agent {
                label 'localhost'
            }
            steps {
                script {
                    def sourcePath = "/root/${file_Name}"
                    def targetNode = '172.11.11.224'
                    sh "scp ${sourcePath} root@${targetNode}:${file_Path}/"
                    sh 'if [ $? -eq 0 ];then echo \'成功\'; else echo \'失败\'; fi'
                }
            }
        }
        
        stage('backup_file') {
            steps {
                sh "mv ${Container_wai}/${file_Name} ${Container_wai}/${file_Name}-`date +%Y-%m-%d`"
                echo "备份要更新的文件"
            }
        }
        
        stage('mv_file') {
            steps {
                sh "mv ${file_Path}/${file_Name} ${Container_wai}/ && chmod 775 ${Container_wai}/${file_Name}"
                echo '将新上传的文件复制到项目所需的路径下'
            }
        }
        
        stage('restart_container') {
            steps {
                sh "docker restart test"
                echo '重启容器'
            }
        }
        
        stage('start_service') {
            steps {
                sh "docker exec -i test /bin/bash -c 'sh start.sh'"
                echo '启动服务'
            }
            post {
                always {
                    emailext(
                        to: "********@qq.com",
                        subject: "执行成功通知: " + currentBuild.fullDisplayName,
                        body: 
                        """
                        <h2>Build Result: ${currentBuild.result}</h2> 
                        <p>Full Display Name: ${currentBuild.fullDisplayName}</p> 
                        <p>URL: ${currentBuild.absoluteUrl} </p>
                        <p>Change: ${currentBuild.changeSets}</p>
                        <p>user: </p>
                        """
                    )
                }
            }
        }
    }
}

解析:

image-20240312162945962

4.3 保存并构建流水线

image-20240312163333547

  • 跑完也可以查看阶段视图:项目 --> 状态

在这里插入图片描述

4.5 查看服务是否正常

image-20240312163254879

这个是执行完发送的邮件,具体服务是否正常,需要根据自己的服务类型去判断;也可自行添加调用,判别服务是否正常。


自此,流水线自动更新服务就完成了!!!

五、相关专栏

专栏名称专栏地址
《Jenkins》https://blog.csdn.net/liu_chen_yang/category_12493057.html
《自动化运维》https://blog.csdn.net/liu_chen_yang/category_12473478.html
《Linux从入门到精通》https://blog.csdn.net/liu_chen_yang/category_10887074.html

六、相关文章

文章名称文章链接
【Jenkins】Pipeline流水线语法解析全集 – 声明式流水线https://liucy.blog.csdn.net/article/details/136528857
【Jenkins】Pipeline流水线语法解析全集 – 脚本式流水线、groovy语法https://liucy.blog.csdn.net/article/details/136567517
【Linux】Jenkins Pipeline流水线详解及基于Jenkins流水线实现自动更新项目https://liucy.blog.csdn.net/article/details/136656568

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

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

相关文章

传感器在智能家居中的应用

在物联网时代&#xff0c;智能家居成为人们生活中的重要组成部分。而传感器作为实现智能家居的基础设备&#xff0c;起到了关键的作用。不同类型的传感器能够获取环境中的各种参数&#xff0c;并通过物联网技术实现与智能家居系统的连接。例如&#xff0c;温度传感器可以实时监…

华为OD机试 - 火星文计算2(Java 2024 D卷 100分)

华为OD机试 2024D卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;D卷C卷A卷B卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测…

stm32学习-软件I2C读取MPU6050

接线 SDAPB11SCLPB10 I2C 对操作端口的库函数进行封装 void MyI2C_W_SCL(uint8_t BitValue)//写 {GPIO_WriteBit(GPIOB, GPIO_Pin_10, (BitAction)BitValue);Delay_us(10); }void MyI2C_W_SDA(uint8_t BitValue)//写 {GPIO_WriteBit(GPIOB, GPIO_Pin_11, (BitAction)BitValu…

LeetCode 1789, 6, 138

目录 1789. 员工的直属部门题目链接表要求知识点思路代码 6. Z 字形变换题目链接标签思路代码 138. 随机链表的复制题目链接标签思路代码 1789. 员工的直属部门 题目链接 1789. 员工的直属部门 表 表Employee的字段为employee_id&#xff0c;department_id和primary_flag。…

graalvm编译springboot3 native应用

云原生时代容器先行&#xff0c;为了更好的拥抱云原生&#xff0c;spring boot3之后&#xff0c;推出了graalvm编译boot项目&#xff0c;利用jvm的AOT&#xff08; Ahead Of Time &#xff09;运行前编译技术&#xff0c;可以将java源码直接构建成机器码二进制的文件&#xff0…

28. 空间滤波器

导论&#xff1a; 几何光线追迹是光线传播的一种不完善描述。严格地说&#xff0c;光束传播是一个相干过程。当波前通过自由空间或光学介质时&#xff0c;波前会发生相干干涉。这种相干传播的建模包括物理光学领域。 物理光学传播&#xff08;POP&#xff09;是zemax的一项强…

基于 Thingsboard 定制开发,国产化企业级、低代码 AIoT 物联网平台

项目源码&#xff0c;文末联系小编 01 ThingsKit 物联网平台 ThingsKit 是基于 Thingsboard 开源物联网平台二次开发&#xff0c;面向中小型企业开箱即用的低代码物联网平台&#xff0c;提供N1N&#xff08;N个终端产品1个物联网平台N个行业方案&#xff09;的产品服务矩阵&…

MySQL数据库入门

1、MySQL概述 MySQL官方网站 https://www.mysql.com/downloads/ MySQL被Oracle公司收购了&#xff0c;作者又重新编写了一个开源的数据库管理系统&#xff0c;Mariadb 2、MySQL产品&版本 2、数据库在网站架构中的角色 LAMP LNMP网站架构 3、安装MySQL-基于yum 查…

现代体育场馆的新宠:气膜体育馆的特点与优势—轻空间

气膜体育馆作为一种新型的运动场馆&#xff0c;近年来在国内外迅速普及&#xff0c;成为现代综合性体育场馆的代表。其独特的结构设计和多功能应用&#xff0c;不仅满足了人们日益增长的健身需求&#xff0c;也为各类体育项目提供了理想的场地。本文将探讨气膜体育馆的特点、优…

GPT-4o的视觉识别能力,将绕过所有登陆的图形验证码

知识星球&#x1f517;除了包含技术干货&#xff1a;《Java代码审计》《Web安全》《应急响应》《护网资料库》《网安面试指南》还包含了安全中常见的售前护网案例、售前方案、ppt等&#xff0c;同时也有面向学生的网络安全面试、护网面试等。 我们来看一下市面上常见的图形验证…

Node.js中基于node-schedule实现定时任务之详解

文章目录 一、定时任务二、node-schedule、1、安装2、引入3、基于Cron表达式的规则4、基于Date的规则5、基于RecurrenceRule的规则6、API7、状态监听 一、定时任务 实际工作中&#xff0c;可能会遇到定时清除某个文件夹内容&#xff0c;定时发送消息或发送邮件给指定用户&…

与Citrix桌面的共存期,如何保障一致体验?

在用户实际的应用场景中&#xff0c;从Citrix到深信服桌面云的替换并不是一蹴而就的过程。特别是对于已经投资购买Citrix桌面云的用户来说&#xff0c;如何最大限度地利用现有设备&#xff0c;实现成本效益最大化&#xff0c;是他们面临的一个重要问题。 为了应对这一需求&…

智慧工厂监控可视化解决方案(160页WORD)

方案介绍&#xff1a; 本智慧工厂监控可视化解决方案通过集成先进的物联网和大数据技术&#xff0c;为制造业企业提供了全面的数字化转型支持。通过实时监控、数据分析、可视化展示等功能&#xff0c;帮助企业提升生产效率、降低运营成本、优化产品质量和能源利用率&#xff0…

高考志愿填报,理科生如何分析选专业?

理科生选择专业的范围更大一些&#xff0c;相比文科说理工科的院校也更多&#xff0c;如何选择适合自己的专业&#xff0c;这是一个比较重要的课题&#xff0c;毕竟大学专业直接关系到职业&#xff0c;是一辈子的大事。 那么理科究竟如何选择专业呢&#xff1f;需要从什么地方…

【单片机毕业设计选题24013】-基于STM32的城市垃圾分类引导系统

系统功能: 1、系统具有语音识别功能&#xff0c;可以对厨余垃圾、其他垃圾、有害垃圾、可回收垃圾进行语音识别&#xff1b; 2、系统可根据语音识别结果直接开启对应类别的垃圾桶&#xff0c;引导分类投放&#xff1b; 3、系统具有语音播报功能&#xff0c;可以语音播报出识…

备忘录怎么插入文件和附件 备忘录插入文件附件方法

在繁忙的工作与生活中&#xff0c;我们时常需要记录各种信息&#xff0c;而备忘录则成为了我们不可或缺的得力助手。然而&#xff0c;当备忘录中需要包含的文件或附件越来越多时&#xff0c;如何高效、便捷地管理这些文件&#xff0c;便成为了一个亟待解决的问题。 想象一下&a…

STM32学习笔记(八)--DMA直接存储器存取详解

&#xff08;1&#xff09;配置步骤1.配置RCC外设时钟 开启DMA外设2.初始化DMA外设 调用DMA_Init 外设存储器站点的起始地址 数据宽度 地址是否自增 方向 传输计数器 是否需要自动重装 选择触发源 通道优先级3.开启DMA控制 4.开启触发信号输出&#xff08;如果需要硬件触发&…

点云格网过程可视化(C++ PCL)

1、背景介绍 在以往的博客中&#xff0c;介绍过利用格网统计平面点云面积&#xff08;具体参考博客&#xff1a;详解基于格网法统计平面点云面积_点云格网法计算xy投影面积-CSDN博客&#xff09;&#xff0c;其实点云格网化可以做其他内容&#xff0c;如边缘检测、格网关系拓扑…

「51媒体」食品展览展会活动,媒体邀约资源有哪些?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 食品展览展会活动在媒体邀约方面拥有丰富的资源&#xff0c;可以吸引各类媒体的关注和报道。以下是一些常见的媒体邀约资源&#xff1a; 1. 行业媒体&#xff1a; 专业食品杂志&#xff…

黑马苍穹外卖2 员工的增查改+异常处理+ThreadLocal

员工管理 新增员工 Controller&#xff1a; PostMapping//post类型的请求ApiOperation("添加员工")public Result save(RequestBody EmployeeDTO employeeDTO) {log.info("新增员工{}", employeeDTO);employeeService.save(employeeDTO);return Result.su…