• Jenkins的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 {
                    //
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    脚本式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') {
            //
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    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'
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    Jenkinsfile(脚本式Pipeline):

    node {
        stage('Build') {
            sh 'make'
        }
        stage('Test') {
            sh 'make check'
            junit 'reports/**/*.xml'
        }
        if (currentBuild.currentResult == 'SUCCESS') {
            stage('Deploy') {
                sh 'make publish'
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    参考

    • https://www.jenkins.io/doc/book/pipeline
    • https://www.jenkins.io/zh/doc/book/pipeline (中文文档)
  • 相关阅读:
    华为防火墙基本配置ASPF与Server-map表
    Ubuntu Server download
    34. 在排序数组中查找元素的第一个和最后一个位置
    Java核心知识:java集合之Map集合
    详细介绍下VLAN隔离与VLAN之间互联
    【无标题】
    JD-怎样获取别人家店铺商品的API接口呢??
    获取文件最后修改时间
    ECC加密算法的数学原理
    [论文必备]最强科研绘图分析工具Origin(2)——简单使用教程
  • 原文地址:https://blog.csdn.net/duke_ding2/article/details/136423602