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):

groovy 复制代码
pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                //
            }
        }
        stage('Test') {
            steps {
                //
            }
        }
        stage('Deploy') {
            steps {
                //
            }
        }
    }
}

脚本式Pipeline

在脚本式Pipeline语法中,一个或多个 node 块在整个Pipeline中做核心工作。尽管这不是脚本式Pipeline语法的强制需求,把Pipeline的工作限制在 node 块中,做了两件事:

  1. 通过向Jenkins队列中添加一项,安排块中包含的step运行。一旦node上的执行器空闲,该step就会运行。
  2. 创建workspace(某个Pipeline所特有的目录),在此处工作在从源码控制检出的文件上。
    注意:取决于Jenkins配置,一些workspace在一段时间静止(inactivity)后,可能不会自动清理。

Jenkinsfile(脚本式Pipeline):

groovy 复制代码
node {
    stage('Build') {
        //
    }
    stage('Test') {
        //
    }
    stage('Deploy') {
        //
    }
}

Pipeline示例

Jenkinsfile(声明式Pipeline):

groovy 复制代码
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'
            }
        }
    }
}

Jenkinsfile(脚本式Pipeline):

groovy 复制代码
node {
    stage('Build') {
        sh 'make'
    }
    stage('Test') {
        sh 'make check'
        junit 'reports/**/*.xml'
    }
    if (currentBuild.currentResult == 'SUCCESS') {
        stage('Deploy') {
            sh 'make publish'
        }
    }
}

参考

  • https://www.jenkins.io/doc/book/pipeline
  • https://www.jenkins.io/zh/doc/book/pipeline (中文文档)
相关推荐
_oP_i3 小时前
.NET Core 项目配置到 Jenkins
运维·jenkins·.netcore
coder_pig15 小时前
📝小记:Ubuntu 部署 Jenkins 打包 Flutter APK
flutter·ubuntu·jenkins
运维&陈同学1 天前
【Elasticsearch05】企业级日志分析系统ELK之集群工作原理
运维·开发语言·后端·python·elasticsearch·自动化·jenkins·哈希算法
csdn_金手指2 天前
Jenkins持续交付web应用,通过docker制作相关的镜像进行发布部署
运维·jenkins
龙少95432 天前
【SpringBoot中怎么使用ElasticSearch】
spring boot·elasticsearch·jenkins
紫菜(Nori)3 天前
Jenkins 中 写 shell 命令执行失败,检测失败问题
jenkins
jwensh3 天前
【Jenkins】pipeline 的基础语法以及快速构建一个 jenkinsfile
pipeline·jenkins
测试工程师成长之路3 天前
解锁 Jenkins+Ant+Jmeter 自动化框架搭建新思路
jmeter·自动化·jenkins
听说唐僧不吃肉3 天前
CICD篇之通过Jenkins中书写pipeline构建编译打包发布流程
运维·jenkins
iRayCheung3 天前
python elasticsearch 8.x通过代理发起请求方法
python·elasticsearch·jenkins