jenkins 的pipeline 语法讲解上 (4)

一.必要的groovy知识

  学习pipeline可以不需要任何groovy知识,但是学习下对于写pipeline如虎添翼。

  变量def关键词  

#结尾分号不是必须的
def  x="abc"
def  y="xyz"

   下面是声明类似js的对象

//编译服务器设置start
def buildNodeSettings = [:]
buildNodeSettings.node = '阿里云Windows_2008_r2_x86'//编译服务器节点设置
buildNodeSettings.gitUrl = 'https://xxx/JenkinsPipelineProject.git'//git地址
buildNodeSettings.gitBarnches = '*/master' //分支
buildNodeSettings.slnFile = 'JenkinsPipelineProject.sln' //Nuget还原解决方案名

 

二. pipeline的组成

  jenkins pipeline其实就是基于groovy语言实现的一种DSL(领域特定语言),用于描述整条流水线是如何运行的,流水线的内容包括执行编译、打包、测试、发布等步骤。

  2.1 pipeline最简结构

   pipeline流水线包含多个阶段,每个阶段只专注于处理一件事情,而这件事情又通过多个步骤来完成。jenkins  pipeline的一个基本结构如下:

pipeline {
    agent any

    stages {
        stage('build') {
            steps {
                echo 'Hello World'
            }
        }
    }
}

   pipeline:代表整条流水线,包含整条流水线的逻辑。

   stages: 阶段容器,stages部分至少包含一个stage

   stage:阶段,代表流水线的阶段,每个阶段都必须有名称,本例中build就是阶段名称。

   steps: 步骤容器,一个stage阶段中有一个steps,steps部分至少包含一个步骤, echo就是一个步骤.

   agent:指定流水线执行位置,流水线中的每个阶段都必须在某个地方(物理机、虚拟机、docker)执行,agent部分即指定具体在哪里执行。

   以上每一个部分都是必需的,少一个jenkins都会报错

   

  2.2 步骤

    步骤是pipeline中已经不能再拆分的最小操作,前面我们只看到两个步骤:sh和echo。

    sh(linux)是指执行一条shell命令;echo是指执行echo命令。bat(windows)执行cmd命令,   这些步骤是jenkins pipeline内置的大量步骤中的几个。

     jenkins官方提供了pipeline 步骤参考文档 https://www.jenkins.io/doc/pipeline/steps/

    https://plugins.jenkins.io/dotnet-sdk/  是用于.net core的步骤。

    

  2.3 post部分

    post部分包含的是在整个pipeline或者阶段完成后一些附回的步骤,post是可选的部分,但并不代表它作用不大。根据pipeline或阶段的完成状态,post部分分成多种条件块,包括:

    always: 不论当前完成状态是什么,都执行。

    changed:只要当前完成状态与上一次完成状态不同就执行。

    fixed:上一次完成状态为失败或不稳定(unstable),当前完成状态为成功时执行。

    regression:上一次完成状态为成功,当前完成状态为失败或不稳定(unstable)或中止(aborted)时执行.

    aborted:当前执行结果是中止(一般为人为中止)执行。

    failure:当前完成状态为失败时执行。

    success:当前完成状态为成功时执行。

    unstable:当前完成状态为不稳定时执行。

    cleanup:清理条件块,不论当前完成状态是什么,在其他所有条件块执行完成后都执行。

pipeline {
        agent any
    
        stages {
            stage('Hello') {
                steps {
                    echo 'Hello World'
                }
                post {
                     always{
                        echo 'stage post always'
                    }
                }
            }
        }
        post{
            success{
                echo 'pipeline post success'
            }
            always{
                echo 'pipeline post always'
            }
        }
            
    }

   2.4 pipeline支持的指令(Directive)

    显然基本的结构满足不了现实多变的需求,所以jenkins pipeline通过各种指令来丰富自己,指令可以理解为对jenkins  pipe-line基本结构的补充。

    下图是使用生成器,生成options指令中的buildDiscarder脚本

    以下是所有指令说明:

    environment:用于设置环境变量,可定义在stage或pipeline部分。

    tools:可定义在stage或pipeline部分,它会自动下载并安装我们指定的工具,并将其加入path变量中.

    input:定义在stage部分,会暂停pipeline,提示你输入内容。

    options:用于配置pipeline本身的选项,比如options{ retry (3) } 指定pipeline失败时重试2次。可定义在stage或pipeline部分。

    parallel:并行执行多个step,在pipeline插件1.2版本后,parallel开始支持对多个阶段进行并行执行。

    parameters:与input不同,是执行pipeline前传入的一些参数。

    triggers:用于定义执行pipeline的触发器。

    when:当满足when定义的条件时,阶段才执行。

    buildDiscarder:保存最近历史构建记录的数量。

pipeline {
    agent any
    options{
        buildDiscarder logRotator(artifactDaysToKeepStr: '', artifactNumToKeepStr: '', daysToKeepStr: '3', numToKeepStr: '10')
        disableConcurrentBuilds()
        timeout(time:1, unit:'HOURS')
        retry(2)
    }
    ...

    checkoutToSubdirectory:jenkins从版本控制库拉取源码时,默认检出到工作空间的要目录中,此选项可以指定检出到工作空间的子目录。

    disableConcurrentBuilds:同一个pipeline, jenkins默认是可以同时执行多次的,引选项是为禁止pipeline同时执行。

pipeline {
    agent any
    options{
        disableConcurrentBuilds()
        timeout(time:1, unit:'HOURS')
        retry(2)
    }
    ...

     newContainerPerStage:当agent为docker或dockerfile时,指定在同一个jenkins节点上,每个stage都分别运行在一个新的容器中,而不是所有stage都运行在同一个容器中。

    retry:当发生失败时进行重试,可以指定整个pipeline的重试次数,当使用retry选项时,options可以被放在stage块中。

pipeline {
    agent any
    options{
        timeout(time:1, unit:'HOURS')
        retry(2)
    }
    ...

      timeout:如果pipeline执行时间过长,超出了我们设置的timeout时间,jenkins将中止pipeline,以下例子以小时为单位,还可以是SECONDS(秒),MINUTES(分钟),当使用timeout选项时,options可以被放在stage块中,通常设置10分钟就可以了。

pipeline {
    agent any
    options{
        timeout(time:1, unit:'HOURS')
    }
    ....

 

      

posted on 2022-11-30 17:12  花阴偷移  阅读(35)  评论(0编辑  收藏  举报

导航