本篇继续学习Declarative Pipeline的相关指令,本篇学习三个指令,分别是触发器(triggers),stage和tool。触发器主要是方便周期控制自动化提交,stage是在stages{...}下的一个指令,我们平台的大部分代码都在stage内完成,tool主要就是为了三大工具(jdk, gradle,maven)提供环境变量服务的。

指令1:triggers

该triggers指令定义了Pipeline应重新触发的自动化方式。对于与源代码集成的Pipeline,如GitHub或BitBucket,triggers可能不需要基于webhook的集成可能已经存在。目前有三个可用的触发器是cron和pollSCM 和 upstream。

这个triggers是触发器的意思,所以这块是设置什么条件下触发pipeline代码执行,以及触发的频率。看到这里,如果你学习过Jenkins UI功能部分,你应该记得有下面这个图,用来控制轮询频率的,特别适合周期的自动化提交。

这篇介绍的触发器知识点就和这个有关。先记住这个点,在一个pipeline{…}代码中,只运行出现一次triggers{…},而且这个指令不是必须存在的。

cron

    接受一个cron风格的字符串来定义Pipeline应重新触发的常规间隔,例如: triggers { cron('H 4/* 0 0 1-5') }

pollSCM

    接受一个cron风格的字符串来定义Jenkins应该检查新的源更改的常规间隔。如果存在新的更改,则Pipeline将被重新触发。例如:triggers { pollSCM('H 4/* 0 0 1-5') }

upstream

接受逗号分隔的作业字符串和阈值。 当字符串中的任何作业以最小阈值结束时,将重新触发pipeline。例如:triggers { upstream(upstreamProjects: 'job1,job2', threshold: hudson.model.Result.SUCCESS) }

举例一个可能利用scm的场景,如果一个公司做到了很好的代码覆盖测试,一般都会,如果监控到有人提交代码,就会自动化触发启动相关的单元测试。这个场景就是适合在pipeline代码里使用triggers指令,下面代码举例一个pollSCM的基本使用。

pipeline {
    agent any
    triggers {
        pollSCM (‘H H(9-16)/2 * * 1-5)’)
    }
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
}

解释下“H H(9-16)/2 * * 1-5)”的含义,这个你可以在上面截图这个页面点击右侧这个问号,出来具体含义。第一步,先根据空格,把字符串切割成5段。这5部分在下面这张图有解释。

所以,H H(9-16)/2 * * 1-5) 的含义就是:

第一部分“H” 表示hash,记住不是表示hour,是一个散列值,含义就是在一个小时之内,会执行一次,但是这次是一个散列值,而且不会并发执行。

第二部分“H(9-16)/2”,表示白天在早上9点到下午5点,每间隔2小时执行一次。

第三部分“*“,每天执行

第四部分“*“表示每月执行

第五部分“1-5“ 表示周一到周五执行

所以上面这个表达式“H H(9-16)/2 * * 1-5) “的含义就是,在每个月的周一到周五的白天,从早上9点到下午5点,每间隔两个小时去触发一次自动化构建。 这个就比较适合,我们每天上班,间隔两个小时去跑一次单元自动化测试。间隔时间长短,取决服务器压力和业务具体场景。

 

指令2:stage

该stage指令在该stages部分中,应包含步骤部分,可选agent部分或其他特定于阶段的指令。实际上,Pipeline完成的所有实际工作都将包含在一个或多个stage指令中。

 

特点:stage一定是在stages{…}里面,一个pipeline{…}中至少有一个stages{…}和一个stage{…}.这里多说一句,一个stage{…}中至少有一个steps{…}。Stage{…}还有一个特点就是,里面有一个强制的字符串参数,这个字符串参数就是描述这个stage是干嘛的,这个字符串参数是不支持变量的,只能你自己取名一个描述字段。

代码举例:

pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
}

指令3:tool

定义自动安装和放置工具的部分PATH。如果agent none指定,这将被忽略。

特点:

只支持定义maven jdk gradle三种工具的环境变量。

代码举例:

pipeline {
    agent any
    tools {
        jdk 'jdk8' 
    }
    stages {
        stage('Example') {
            steps {
                sh 'java -version'
            }
        }
    }
}

注意:工具名称必须在Jenkins 管理Jenkins → 全局工具配置中配置。例如,上面代码我写了jdk,那么我必须在jenkins管理的全局工具配置中有jdk配置。

 

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐