Top

3天学会Jenkins_6_管道或流水线教程之Jenkinsfile示例


本文属于原创,转载注明出处,欢迎关注微信小程序小白AI博客 或者网站 https://xiaobaiai.net 或者我的CSDN http://blog.csdn.net/freeape

关注我的公众号,获取最新学习分享:

[TOC]

1 什么是Jenkins管道(流水线)

以下管道和流水线为同指一个概念。

在Jenkins中,管道(Pipeline)是一组事件或任务,它们按顺序相互链接。简单来说,Jenkins Pipeline是一个插件组合,支持使用Jenkins集成和实现持续交付管道。管道具有可扩展的自动化服务器,用于通过管道DSL(特定领域语言)“作为代码”创建简单或复杂的交付管道,即将所有子任务进行流水线化。

Pipeline是Jenkins2.X的最核心的特性,帮助Jenkins实现从CI到CD与DevOps的转变。

2 什么是持续交付管道?它是如何工作的?

在Jenkins管道中,每个任务或事件都至少对一个或多个事件具有某种依赖性。

上图代表Jenkins的连续交付管道。它包含一组称为构建,部署,测试和发布的状态。这些状态彼此相互关联,每个状态都有自己的事件,这些事件按照称为连续交付管道的顺序工作。连续交付管道是一个自动表达式,用于显示获取版本控制软件的过程。因此,软件中所做的每一个更改在发布过程中都会经历许多复杂的过程。它还涉及以可靠和可重复的方式开发软件,以及通过测试和部署的多个阶段对构建的软件进行升级。

在本节中,你将学到:

  • 什么是Jenkins管道?
  • 什么是JenkinsFile?
  • 为什么使用Jenkins管道?
  • Jenkins管道相关概念
  • 如何创建Jenkins管道?
  • 运行Jenkins管道
  • 使用Jenkins管道的最佳实践
  • Freestyle与Pipeline的区别

3 什么是JenkinsFile?

可以使用名称为JenkinsFile的文本文件定义Jenkins管道。您可以使用JenkinsFile将管道用代码实现,可以通过使用特定领域语言(DSL)来书写代码。使用JenkinsFile,你可以编写运行Jenkins管道所需的步骤。

使用JenkinsFile的好处:

  • 你可以为所有分支自动创建管道,并仅使用一个JenkinsFile执行拉取请求。
  • 你可以在管道上查看代码
  • 你可以审核你的Jenkins管道
  • 作为管道的唯一源头,可以由多个用户修改操作

JenkinsFile可以在WEB UI端或者直接使用JenkinsFile来定义。

4 实现JenkinsFile的两种语法

有两种类型的语法用于定义JenkinsFile:声明式(Declarative)脚本化(Scripted)管道语法。推荐使用声明式语法。

4.1 声明式(Declarative)

Jenkins2.5后支持,声明性管道语法提供了一种创建管道的简便方法。它包含用于创建Jenkins管道的预定义层次结构,它使你能够以简单,直接的方式控制管道执行的所有方面。

特点:

  • 最外层必须由pipline{ //do something }来进行包裹
  • 不需要分好作为分隔符,每个语句必须在一行内
  • 不能直接使用groovy语句(例如循环判断等),需要被script {}包裹

4.2 脚本化(Scripted)

脚本化管道语法在轻量级执行程序的帮助下在Jenkins主机上运行。它使用非常少的资源将管道转换为原子命令。声明式和脚本化语法彼此不同,并且有着完全不同地定义。

特点:

  • 最外层有node{}包裹
  • 可直接使用groovy语句

5 为什么使用Jenkins管道?

Jenkins是一个开放的持续集成服务器,能够支持软件开发过程的自动化。可以在用例的帮助下创建多个自动化作业,并将它们作为Jenkins管道来运行。

以下是使用Jenkins管道的原因:

  • 代码方便:Jenkins管道可以用代码来实现,允许多个用户编辑和执行管道流程
  • 可持续性:管道非常强大。如果你的服务器经历了无法预料的重启,管道将自动恢复
  • 交互:你可以暂停管道进程并使其等待恢复,直到有来自用户的输入
  • 多任务:Jenkins Pipelines支持大项目。你可以运行多个任务(job),甚至可以在循环中使用管道

6 Jenkins管道相关概念

术语 描述
master Jenkins 安装和运行的地方,它负责解析 job 脚本,处理任务,调度计算资源
agent 负责处理从 master 分发的任务,操作实际上是通过 executor 来执行的。在声明式语法中,agent块为必选。
executor 执行任务的计算资源,它可以在 master 或者 agent 上运行。多个 executor 也可以合作执行一些任务。
Groovy Groovy 是一门动态语言,支持在 Java 平台上进行 Java 编程,使用方式基本与使用 Java 代码的方式相同。声明式Pipeline语法可以使用Groovy语法,脚本式Pipeline语法可以使用大多数Groovy语法。
Pipeline 管道是以代码形式给出的一组指令,用于持续交付,并包含整个构建过程所需的指令。使用管道,你可以构建,测试和交付应用程序。一个Pipeline可以划分成若干个Stage,每个Stage代表一组操作(Build/Test/Deploy)
Node Jenkins运行的机器称为节点。节点块(a node block)主要用于脚本化管道语法,是Step的具体运行环境,安装有Jenkins的主机默认节点为master
Stage 阶段块(stage block)包含管道中的一系列步骤。也就是说,构建,测试和部署过程都在一个阶段汇集在一起。通常,阶段块用于可视化Jenkins管道过程。在声明式语法中,stages块为必选,stage必须有一个。
Step Step是最基本的操作单元,小到创建一个目录,大到构建一个Docker镜像,步骤只是在定义的时间执行特定进程的单个任务。当一个步骤运行成功时继续运行下一个步骤。 当任何一个步骤执行失败时,Pipeline 的执行结果也为失败。当所有的步骤都执行完成并且为成功时,Pipeline 的执行结果为成功。在声明式语法中,steps块为必选。

其他常用概念和语法(以声明式方式):

  • 在 Linux、BSD 和 Mac OS(类 Unix) 系统中的 shell 命令, 对应于 Pipeline 中的一个 sh 步骤(step)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    // Jenkinsfile (Declarative Pipeline)
    pipeline {
    agent any
    stages {
    stage('Build') {
    steps {
    sh 'echo "Hello World"'
    sh '''
    echo "Multiline shell steps works too"
    ls -lah
    '''
    }
    }
    }
    }
  • 基于 Windows 的系统使用bat步骤表示执行批处理命令。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // Jenkinsfile (Declarative Pipeline)
    pipeline {
    agent any
    stages {
    stage('Build') {
    steps {
    bat 'set'
    }
    }
    }
    }
  • 超时,重试,完成时动作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    // Jenkinsfile (Declarative Pipeline)
    pipeline {
    agent any
    stages {
    stage('Deploy') {
    steps {
    // “Deploy”阶段(stage)重复执行 flakey-deploy.sh 脚本3次
    retry(3) {
    sh './flakey-deploy.sh'
    }
    // 上面执行完成后,然后等待 health-check.sh 脚本最长执行3分钟,超时的话Deploy会失败
    timeout(time: 3, unit: 'MINUTES') {
    sh './health-check.sh'
    }
    // 重试部署任务 5 次,但是总共花费的时间不能超过 3 分钟
    timeout(time: 3, unit: 'MINUTES') {
    retry(5) {
    sh './flakey-deploy.sh'
    }
    }
    }
    }
    }
    // 当 Pipeline 运行完成时,你可能需要做一些清理工作或者基于
    // Pipeline 的运行结果执行不同的操作, 这些操作可以放在 post 部分。
    post {
    always {
    // 不管成功与否都会执行
    echo 'This will always run'
    }
    success {
    echo 'This will run only if successful'
    }
    failure {
    echo 'This will run only if failed'
    }
    unstable {
    echo 'This will run only if the run was marked as unstable'
    }
    changed {
    echo 'This will run only if the state of the Pipeline has changed'
    echo 'For example, if the Pipeline was previously failing but is now successful'
    }
    }
    }
  • 更多参见官方文档 https://jenkins.io/doc/book/pipeline/syntax/

7 如何创建Jenkins管道

7.1 示例1之HelloWorld

  • 首页->New Item->输入项目名称并选择Pipeline类型,然后点击Ok
  • 自动跳转到Pipeline项目配置项,Advanced Project Options中输入Pipeline语法任务
  • 点击Save,然后点击Build Now,开始执行Pipeline
  • 执行成功后,在Build History面板上出现历史操作编号,点击编号可以进入详情

7.2 示例2之执行Github远程仓库任务

  • 在Git项目中建立Jenkinsfile

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    pipeline {
    agent any
    stages {
    stage('Build') {
    steps {
    sh 'javac HelloWorld.java'
    sh 'java HelloWorld'
    }
    }
    }
    }
  • 按示例1建立Pipeline项目

  • 在项目配置Advanced Project Options面板中设置Pipeline,指定远程仓库

  • 点击保存

  • 编译并查看记录

8 Freestyle与Pipeline区别

调度方式:

  • pipeline:通过结构化pipeline 语法进行调度,易于理解与阅读
  • freestyle:通过jenkins api或者cli进行调度

显示方式:

  • pipline:提供上帝视角(全局视图)
  • freestyle:没有视图

9 总结

本文从零基础介绍了Jenkins的Pipeline及Jenkinsfile相关概念,并通过实例操作去了解如何结合具体项目实现Pipeline项目。读完本篇,相信可以去了解更多的Pipeline操作知识,而且实现更强大更复杂的Pipeline操作,从而简化我们项目开发中的各种流程,提高效率。

10 参考



授权:知识共享署名-相同方式共享 4.0 国际许可协议
网站信息: 小白AI.易名
文章标题:3天学会Jenkins_6_管道或流水线教程之Jenkinsfile示例
永久链接:https://xiaobaiai.net/2019/20191118124603.html
关注公众号 别打名名
关注微信小程序:小白AI博客
微信打赏 支付宝打赏

 发表评论

文明评论,请勿灌水。