专栏首页小白AI.易名3天学会Jenkins_6_管道或流水线教程之Jenkinsfile示例

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

转载注明出处

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管道相关概念

Jenkins 安装和运行的地方,它负责解析 job 脚本,处理任务,调度计算资源

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

  • 在 Linux、BSD 和 Mac OS(类 Unix) 系统中的 shell 命令, 对应于 Pipeline 中的一个 sh 步骤(step)
// 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步骤表示执行批处理命令。
// Jenkinsfile (Declarative Pipeline)
pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                bat 'set'
            }
        }
    }
}
  • 超时,重试,完成时动作
// 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
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 参考

  • https://jenkins.io/zh/doc/book/pipeline/jenkinsfile/

本文分享自微信公众号 - 小白AI(gh_c002f3b12bc2),作者:Ethan

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 3天学会Jenkins_Jenkin与CI(Continuous Integration,持续集成)?

    持续集成(Continuous Integration)即是发生在每一次的代码提交后,立即开始软件的构建(Build)和测试(Test),在一个拥有许多开发人员...

    别打名名
  • 3天学会Jenkins_5_如何创建并编译自定义Jenkins项目

    一般的Jenkins项目是一个可重复的构建过程,其中包含各种步骤和构建后的操作,在构建步骤或构建后操作中执行的操作类型是非常有限。而Jenkins自定义项目中有...

    别打名名
  • MQTT安全性设计详解

    MQTT(MQ Telemetry Transport, MQ 遥测传输)。它是一种发布/订阅、极其简单和轻量级的消息传递协议,旨在用于受限设备和低带宽,高延迟...

    别打名名
  • 使用CircleCI2.0持续集成Angular项目

    这种事情完全可以交给CircleCI来处理。 CircleCI的好处(截止当前的政策2019.2):

    mafeifan
  • 实体处理模块IEntityModule

    在2015年7月16日,XCode新增了实体处理模块IEntityModule,用于拦截实体对象添删改操作。

    大石头
  • 实体处理模块IEntityModule

    在2015年7月16日,XCode新增了实体处理模块IEntityModule,用于拦截实体对象添删改操作。 该接口参考IHttpModule设计理念,横切在实...

    大石头
  • Python基础:条件与循环

      但如果你需要在满足某个条件前,不停地重复某些操作,并且没有特定的集合需要去遍历,那么一般则会使用 while 循环。

    用户2398817
  • Flex4中使用WCF

    虽然flex跟.net交互的首选是FluorineFx,但是如果在某些特定情况下(比如服务端是现成的,不允许修改,或者服务端开发方不懂FluorineFx为何物...

    菩提树下的杨过
  • 如何让你的旧 iphone 跑得更快更舒爽?

    前端正义联盟
  • 终于找全了:蝴蝶效应、青蛙现象、鳄鱼法则、鲇鱼效应、羊群效应、刺猬法则、手表定律、破窗理论、二八定律、木桶理论

    1、蝴蝶效应: 上个世纪70年代,美国一个名叫洛伦兹的气象学家在解释空气系统理论时说,亚马逊雨林一只蝴蝶翅膀偶尔振动,也许两周后就会引起美国得克萨斯州的一场龙卷...

    小莹莹

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动