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

06-22 1243阅读

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

👨‍🎓博主简介

  🏅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 --> 点击安装

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

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

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

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

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

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

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

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

                  2.2.2 新建一个 Pipeline 任务

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

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

                  自己定义一下描述即可;

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

                  2.2.3 编辑流水线

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

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

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

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

                  2.2.4 保存并构建流水线

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

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

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

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

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

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

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

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

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

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

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

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

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

                    这样就可以看到可视化执行过程了,当然因为这个是只有一个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: 
                                            """
                                            

                    Build Result: ${currentBuild.result}

                    Full Display Name: ${currentBuild.fullDisplayName}

                    URL: ${currentBuild.absoluteUrl}

                    Change: ${currentBuild.changeSets}

                    user:

                    """ ) } } } } }

                    解析:

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

                    4.3 保存并构建流水线

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

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

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

                      4.5 查看服务是否正常

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

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


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

                      五、相关专栏

                      专栏名称专栏地址
                      《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
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]