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 (中文文档)
相关推荐
Elastic 中国社区官方博客2 天前
使用 Elasticsearch open inference API 对 OpenAI chat completions 进行支持
大数据·elasticsearch·搜索引擎·全文检索·jenkins
X1A0RAN3 天前
Jenkins Pipeline 变量打印指南
运维·servlet·jenkins
heimeiyingwang3 天前
【CI/CD·Jenkins篇】多节点构建:Agent 配置与任务分发策略
ci/cd·jenkins
heimeiyingwang4 天前
【CI/CD·Jenkins篇】环境搭建:从零部署 Jenkins 主从架构
ci/cd·jenkins
heimeiyingwang4 天前
【CI/CD·Jenkins篇】Pipeline 基础:Declarative 与 Scripted 语法详解
ci/cd·pipeline·jenkins
遨游DATA5 天前
Jenkins 修改 config.xml 后页面仍是旧配置:让 live job 配置真正生效
ci/cd·jenkins·devops·故障排查·config.xml
Dobby_055 天前
【CICD】Jenkins Pipeline 快速学习入门
运维·学习·jenkins
上海安当技术6 天前
统一身份认证平台怎么落地?11 个异构业务系统接入 ASP 的完整实施路径
数据库·servlet·架构·kubernetes·jenkins
回眸不遇7 天前
Elasticsearch嵌套类型nested使用指南
大数据·elasticsearch·jenkins
回眸不遇8 天前
类型的区别和应用场景 nested 每个对象独立存储为隐藏的子文档 适合存储数组 查询的时候有特定的语法 nested查询 且字段要 ...
运维·jenkins