pipeline使用
一、入门
(一)、介绍
Jenkins Pipeline是一套插件,支持将连续输送Pipeline实施和整合到Jenkins。Pipeline提供了一组可扩展的工具,用于通过PipelineDSL为代码创建简单到复杂的传送Pipeline。
(二)、脚本式
-
介绍
脚本式pipeline是基于groovy的DSL语言实现的,为Jenkins用户提供了大量的灵活性和可扩展性。
-
示例
node { ... stage('test') { if (env.BRANCH_NAME == 'master') { echo 'master' } else { echo 'error' } } }
(三)、声明式
-
介绍
声明式是jenkins2.5版本后开始,是一种更简单、更结构化的语法;可以结合脚本式一起使用。
-
示例
pipeline { agent{} tools{} parameters{} .... }
二、基本语法
(一)、基本内置关键字
-
pipeline
pipeline根节点
-
environment
定义公共的环境变量
environment { __REBOOT = "${env.__REBOOT}" __ROPE_GIT_URL = "${map.GIT_URL}" SSH_AUTH = "ssh" }
-
tools
定义工具,自动下载并加入PATH
tools { maven 'maven-3.6.3' }
-
agent
指定在哪个节点执行pipeline
agent { label 'test' }
-
stages
多个stage的父节点
-
stage
代表整个pipeline中的一个阶段,stage里面是具体的steps
-
steps
定义在stage阶段里面,代表具体如何执行
-
script
必须在scrip中t,才能中用groovy脚本
stage('test'){ steps { script { switch(env.BRANCH_NAME) { .... } } } }
-
其他
# 打印环境变量 sh "printenv"
(二)、内置步骤
-
dir()
切换目录
-
deleteDir()
删除当前目录
-
fileExists()
判断文件是否存在
fileExists('/tmp/test.jar')
-
isUnix()
是否为Unix系统
-
pwd()
当前目录
-
writeFile
写文件
writeFile file: 'test.txt', text: '写入文件内容' , encoding: 'UTF-8'
-
readFile
读文件
readFile encoding: 'UTF-8', file: 'test.txt'
-
sleep
睡眠一定时间段
// 睡眠5s sleep time: '5', unit: 'SECONDS'
三、配置
(一)、参数配置 parameters
-
choice
// 选项参数 parameters: [ choice(choices: ['release', 'rollbak'], description: '部署类型(发布项目/回滚项目)', name: 'deployType') ]
-
string
// 字符串参数 parameters { string defaultValue: 'test', description: '测试', name: 'name', trim: false }
-
text
// 文本参数 parameters { text defaultValue: '', description: '', name: '' }
-
其他
// 布尔值参数 parameters { booleanParam defaultValue: false, description: '', name: '' } // 密码参数 parameters { password defaultValue: '', description: '', name: '' }
(二)、选项配置options
-
buildDiscarder()
options { //为最近的流水线运行的特定数量保存组件和控制台输出 buildDiscarder(logRotator(numToKeepStr: '10')) }
-
disableConcurrentBuilds()
options { //不允许同时执行流水线。 可被用来防止同时访问共享资源等 disableConcurrentBuilds() }
-
skipDefaultCheckout()
options { //跳过从源代码控制中检出代码的默认情况。 skipDefaultCheckout() }
-
timeout()
opstions { //设置流水线运行的超时时间, 在此之后,Jenkins将中止流水线。 timeout(time: 1, unit: 'HOURS') }
(三)、触发器配置triggers
-
cron
// 每天下午15执行 triggers { cron 'H 0 15 * *' }
-
pollSCM
triggers { pollSCM ignorePostCommitHooks: true, scmpoll_spec: 'H 0 15 * *' }
-
upstream
// 只有构建稳定时触发 triggers { upstream 'test-pipeline' } // 即使构建失败时也会触发 triggers { upstream threshold: 'FAILURE', upstreamProjects: 'test-pipeline' } // 即使构建不稳定时也会触发 triggers { upstream threshold: 'UNSTABLE', upstreamProjects: 'test-pipeline' }
四、其他语法
(一)、when
-
branch
当正在构建的分支也给出的分支模式匹配时执行阶段。注意:这个仅适用于多分支pipeline
when { branch 'master' }
-
environment
当指定的环境变量设置为给定值时执行阶段
environment { environment name: 'DEPLOY', value: 'test' }
-
expression
当指定的表达式求值为true时执行阶段
when { expression { return params.DEBUG_BUILD } }
-
not
当嵌套条件为false时执行阶段。必须包含一个条件
when { not { branch 'master' } }
-
allOf
当嵌套条件全为真时执行阶段。必须包含一个条件
when { allOf { branch 'master'; environment name: 'DEPLOY', value: 'test' } }
-
anyOf
当嵌套条件至少包含一个条件为真时执行阶段。必须包含一个条件
when { anyOf { branch 'master'; branch 'develop' } }
-
equals
当期待值等于实践值时执行阶段
when { equals expected: 'rollbak', actual: approvalMap['deployType']; }
(二)、input
-
简单使用
input { message "是否发布当前版本?" ok "发布" }
-
高级使用
script { approvalMap = input ( message: '发布或者回滚项目?', ok: '确定', parameters: [ choice(choices: ['release', 'rollbak'], description: '部署类型(发布项目/回滚项目)', name: 'deployType') ], // 限制提交的用户id submitter: 'user01', submitterParameter: 'approver' ) }
(三)、post
-
always
无论pipeline当前是什么执行状态,都会执行
post { always { deleteDir() } }
-
failure
当前完成状态是失败时执行
post { failure { echo '失败' } }
-
success
当前完成状态是成功时执行
post { success { echo '成功' } }
-
其他
1. changed 当前状态和上一次构建完成状态不一致时执行 2. aborted 当前状态时人为终止状态时执行 3. unstable 当前完成状态为不稳定时执行 4. cleanup 清理条件块
五、插件使用
(一)、dingtalk
dingtalk (
robot: "${__REBOOT}",
type: 'ACTION_CARD',
title: "你有新的发布消息,请注意查收",
text: [
"# 项目名称-${APPLICATION_NAME}",
"-----------------------",
"* 任务: #${BUILD_NUMBER} ",
"* 部署状态: 成功 ",
"* 执行人: ${BUILD_USER_ID} ",
"* 执行人描述: ${BUILD_USER} ",
"* 部署环境: ${__DEPLOY_ENV} ",
"* 部署主机: ${DEPLOYMENT} ",
"* 部署路径: /home/test/${APPLICATION_NAME} ",
"* 镜像名称: ${HABOR_REGISTRY}/${DEPARTMENT}/${APPLICATION_NAME}:${BUILD_NUMBER} ",
"-----------------------"
],
btns: [
[
title: 'jenkins详情',
actionUrl: "${BUILD_URL}"
]
],
btnLayout: 'V'
)
(二)、configFileProvider
configFileProvider([configFile(fileId: 'default.env.config', variable: 'value')]) {
config = readFile encoding: 'UTF-8', file: "${value}"
writeFile file: '.env', text:"${config}"
}