Pipeline As Code With Jenkins2.0

前端之家收集整理的这篇文章主要介绍了Pipeline As Code With Jenkins2.0前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。


Jenkins2.0 Pipeline导入

Pipeline as Code是Jenkins 2.0版本的精华所在,是帮助Jenkins实现从CI到CD华丽转身的关键工具。

所谓Pipeline,简单来说,就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程

Pipeline的实现方式是一套Groovy DSL(类似Gradle),任何发布流程都可以表述为一段Groovy脚本,并且Jenkins支持代码库直接读取脚本,从而实现了Pipeline as Code的理念。

注: 本文首发于 My 公众号 CodeSheep ,可 长按扫描 下面的 小心心订阅 ↓ ↓ ↓


为什么要使用Jenkins2.0 Pipeline

这里主要结合我自己对传统Jenkins Job使用的一些痛点来说:

  • 传统的Jenkins Job难以灵活高效地并行(Job间、节点间、任务间、甚至任务内四个维度的并行)
  • 传统的Jenkins Job日益失控的趋势让我们措手不及,Job太多,CI脚本太离散,维护成本实在太高了,而且很危险,一单Jenkins Server挂了,一切都Game Over了
  • 新拉分支的分支代码CI部署太麻烦了
  • 传统的Jenkins Job显示真的是不太直观啊
  • @H_403_47@
    我想这些理由应该足以让我们把目光转向Jenkins2.0的Pipeline!

    Pipeline的功能和优点:

    1. 持久性:在jenkins的master按计划和非计划的重启后,pipeline的job仍然能够工作,不受影响。其实理解起来也很简单,jenkins的master和agent通过ssh连接,如果你知道nohup或disown的话,就可以理解为啥master的重启不会影响agent上的job继续运行。
    2. 可暂停性:pipeline基于groovy可以实现job的暂停和等待用户的输入或批准然后继续执行。

    3.更灵活的并行执行,更强的依赖控制,通过groovy脚本可以实现step,stage间的并行执行,和更复杂的相互依赖关系。

    1. 可扩展性:通过groovy的编程更容易的扩展插件
    2. 设计Pipeline = 设计代码,很优雅
    3. As Code:集中管理CI脚本、用代码库来管理脚本、从代码库直接读取脚本,从而可以将项目CI迅速拉起来!

    Pipeline原理与流程

    Pipeline为用户设计了三个最最基本的概念:

    • Stage:一个Pipeline可以划分为若干个Stage,每个Stage代表一组操作。注意,Stage是一个逻辑分组的概念,可以跨多个Node。
    • Node:一个Node就是一个Jenkins节点,或者是Master,或者是Agent,是执行Step的具体运行期环境。
    • Step:Step是最基本的操作单元,小到创建一个目录,大到构建一个Docker镜像,由各类Jenkins Plugin提供。
    • @H_403_47@

      一个典型的Stage View如下图所示:

      从图中可以十分方便地看到哪些Stage通过,哪些Stage失败,以及构建的时间。

      Jenkins2.0的Pipeline搭建使用的是Groovy脚本,通过Groovy脚本实现工作流管理的步骤如下:

      • 去Jenkins主界面建立Pipeline任务
      • @H_403_47@

        实际上更常用的是MultiBranch Pipeline,上面的图中截图没有包含,但与普通Pipeline基本类似。

        • 使用Groovy脚本自定义工作流
        • @H_403_47@

          上图的实例脚本如下:

          node { 
              stage('Checkout Code') { // for display purposes 
                  // Get some code from a GitHub repository 
                  git 'https://github.com/jglick/simple-maven-project-with-tests.git' 
              }
           
              stage('Build') { 
                  // Run the maven build 
                  if (isUnix()) { 
                      sh "'${MAVEN_HOME}/bin/mvn' -Dmaven.test.failure.ignore clean package" 
                  } else { 
                      bat(/"${MAVEN_HOME}\bin\mvn" -Dmaven.test.failure.ignore clean package/) 
                  } 
              } 
           
              stage('Unit test') { 
                  junit '**/target/surefire-reports/TEST-UT.xml' 
                  archive 'target/*.jar' 
              } 
          }
          • 开始执行Pipeline
          • @H_403_47@

            构建过程的stage View如下:

            很明显可以看出,这里显示的和Groovy脚本中格式化的代码是一致的,会实时显示各个工作流的执行进度和结果,直观易懂。鼠标移上去,能看到日志信息的缩略图,单击可以调到对应stage的console中。

            总而言之,一切都是那么地优雅!


            Jenkins2.0 Pipeline关键DSL语法及示例

            在这里总结一下Pipeline中的关键DSL语法,利用Groovy对其进行组合可以完成任何一项复杂的CI/CD流程,熟悉它们大有裨益。

            • archiveArtifacts
            • @H_403_47@

              归档文件,举例:

              archiveArtifacts 'target/*.jar'
              • bat
              • @H_403_47@

                执行windows平台下的批处理文件,如

                bat "call example.bat"
                • build
                • @H_403_47@

                  触发构建一个jenkins job,如

                  build 'TEST_JOB'
                  • checkout
                  • @H_403_47@

                    从SCM系统中checkout repo,如:

                    checkout([$class: 'SubversionSCM',additionalCredentials: [],excludedCommitMessages: '',excludedRegions: '',excludedRevprop: '',excludedUsers: '',filterChangelog: false,ignoreDirPropChanges: false,includedRegions: '',locations: [[credentialsId: '30e6c1e5-1035-4bdd-8a44-05ba8f885158',depthOption: 'infinity',ignoreExternalsOption: true,local: '.',remote: 'svn://xxxxxx']],workspaceUpdater: [$class: 'UpdateUpdater']])
                    • deleteDir()
                    • @H_403_47@

                      从workspace中删除当前目录

                      • dir
                      • @H_403_47@

                        切换目录,如

                        dir('/home/jenkins') { // 切换到/home/jenkins目录中做一些事情
                            // some block
                        }
                        • echo
                        • @H_403_47@

                          打印信息,如 echo 'hello world'

                          • emailtext
                          • @H_403_47@

                            利用Jenkins发送邮件内容主题全都可以自定义,如

                            emailext body: 'Subject_test',subject: 'Subject_test',to: 'hansonwang99@163.com.cn'
                            // 邮件的正文body,主题subject,收件人to等可以进行自定义
                            • error
                            • @H_403_47@

                              抛出一个错误信号,可以自行在代码里抛出,如 error 'read_error'

                              • fileExists
                              • @H_403_47@

                                检查工作空间某个路径里是否存在某个file,举例:

                                fileExists '/home/test.txt'  // 检查是否存在test.txt
                                • input
                                • @H_403_47@

                                  等待外界用户的交互输入,举例:

                                  input message: '',parameters: [string(defaultValue: '默认值',description: '版本号',name: 'version')] // 在某一步骤,等待用户输入version参数才能往下执行

猜你在找的设计模式相关文章