一、背景
1.想法
jenkins1.x主要是实现的持续集成过程,集成各个插件,但是终究需要人为手工的操作,如果job太复杂,人为容易出错。于是jenkins2.x开始流行pipeline的写法,以代码的方式来进行job的构建。正如社会潮流总是从人工到自动化的过程,在之前那篇文章中提及,要做一个devops的小工具,从java代码实现上来说,对于我还是比较复杂,代码实现部分还在钻研中。本篇文章只是讲讲jenkins中pipeline怎么写!
二、pipeline基本语法介绍
学习一种编程语言(groovy)最开始的步骤总是学习它的语法,知晓它的规则。但是对于pipeline来说,暂时还不需要深入去学习groovy,下面简单的为大家介绍下pipeline的一些主要的基本知识:
agent:该部分指定整个Pipeline或特定阶段将在Jenkins环境中执行的位置,具体取决于该agent 部分的放置位置。该部分必须在pipeline块内的顶层定义 ,也可以使用在stage级。
stage:表示这个Pipeline的某一个执行阶段(使用stage使得逻辑变得更加简单明了)
steps: 包含一个或者多个在stage块中执行的step序列(在这里执行操作:运行maven或者部署等等)
environment:指定键值对,可用于step中,主要是为常量或者变量赋值,根据所在的位置来决定其作用范围(类似于java中全局和局部的概念)
options:允许执行pipeline内置的专用选项,也可以使用由插件提供的
parameters:提供触发pipeline时的参数列表
trigger:定义了触发pipeline的方式(jenkins1.x中的pollscm定时构建)
tools:自动安装工具,注意这里使用的一定是在jenkins全局配置中已经定义好了的
when:可以用来执行一些代码逻辑
post:可以根据pipeline的状态来执行一些操作
以上是属于个人理解,具体以官方文档为准。下面再来详细说说里面比较重要的agent,其他的部分请大家自行google或者百度,相对来说比较简单。我的理解是:agent是一个机器总代理,它其中的参数都是为了指定一些可以使用的机器
agent的一些参数如下:
any : 在任何可用的机器上执行pipeline
none : 当在pipeline顶层使用none时,每个stage需要指定相应的agent,比方说:
pipeline{
agent none //没有指定agent
stages{
stage('checkout code'){
steps{
sh 'echo "checkout code"'
}
}
}
}
以上代码会报下面这串错误,原因就是没有指定agent应用的节点:
label:在指定的机器上运行pipeline或者stage,比方说
agent{ label 'slave1'} //指定slave1的节点机器运行该stage或者pipeline
这个设置的作用:在大规模集群中,CI机器往往是相同的配置,而此时你的项目又需要一些额外的配置,这个时候这个设置可以很好的完成这个功能
docker:定义这个参数后,指定pipeline或stage时会动态的接收一个指定节点的docker的镜像,并且还可以接受一个args的参数用于执行docker run 的参数。比方说你的项目要在A环境中做测试,在B环境中做预发验证,在C环境做灰度发布(这里只是简单的打个比方,实际中不是这样的,只是为了说明此时需要在不同的环境中做不同的事情),这个时候涉及到多个环境,常规做法可以是直接指定几个不同的slave的从节点,但是如果我此时想做测试并且只有一台机器,那我可以在这台机器上做几个docker镜像,分别用于不同的构建过程.比方说:
agent{
docker{
image 'mydocker' //指定docker的镜像名称
label 'slave1' //指定在哪个机器上执行docker镜像
args '-v /tmp:/tmp' //运行时传入docker run的参数
}
}
以上命令是在slave1的从节点机器上用mydocker的镜像生成一个容器,并传入-v /tmp:/tmp的参数
以上是我想分享给大家的基本知识,可能其中理解不对,也请大牛出来指正.
这个网站也推荐给大家:Jenkins持续集成 - 管道详解,如若作者认为我放在这里不合适,请联系我删除.同时也推荐大家浏览一下官方文档:
Getting started with Pipelinejenkins.io
三、pipeline实际应用(小实例)
实例1.用pipeline实现:从代码库中拉取最新的代码,然后做pmd检测,如果此次构建成功的话输出“hello!success!”;如果失败的话输出“failed!Please check pipeline code!”并发送邮件到指定的地址上。按照以下流程做测试:
a.本地构建一个maven项目并上传到github上(最近github贼慢,之后考虑在自己服务器上搭建gerrit作为代码存放地址来演示)
***注意项目上传时一些不需要的文件及时使用.gitignore给忽略掉,要在git add 之前写好.gitignore文件,避免文件被track后忽略不了***
以上表示文件上传成功.
b.写好pipeline并运行,最后核查结果
***部分脚本可以使用jenkins中的Pipeline Syntax来生成,比如拉取代码的***
下面开始演示失败时候的场景,此时没配置mvn的环境,但是执行mvn命令,按照预计中的报错了:
下面开始演示正确的构建结果并附pipeline的代码:
pipeline{
agent any
tools{
maven 'maven3' //maven3必须是已经在jenkins上配置的工具
}
stages{
stage('checkout code'){
steps{
git credentialsId: '2c7a38c6-f536-4e93-bf3c-2ff4563fae8e', url: 'https://github.com/XXX/pipeline_script_test.git'
}
}
stage('mvn test'){
steps{
sh "mvn -B -f ${env.workspace}/pom.xml pmd:pmd"
}
}
}
post{
always{ //always表示不管怎么样都做下面的操作
pmd canComputeNew: false, defaultEncoding: '', healthy: '', pattern: '', unHealthy: ''
}
failure{
step([
$class: 'Mailer',
notifyEveryUnstableBuild: true,
recipients: "738402018@qq.com",
sendToIndividuals: true
])
echo "failed!Please check pipeline code!"
}
success{
echo "hello!success!"}
}
}
构建结果如下:
实例2:
以上就是一些关于jenkins的pipeline的简单介绍,关于实例,之后会陆续更新上来。