Jenkins Pipeline 常用指令
时间:2021-08-11
本文章向大家介绍Jenkins Pipeline 常用指令,主要包括Jenkins Pipeline 常用指令使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Groovy 背景
Jenkins 流水线(Pipeline 是 Jenkins2.X 最核心的特性,帮助 Jenkins 实现从 CI 到 CD 与DevOps 的转变,可支持复杂流程的编排与可视化) 是一套插件,可通过 Jenkinsfile 执行,支持脚本式(Script)和声明式(Declarative)两种,其中脚本式可通过 Groovy 语法编写执行过程,声明式需要用 script {}包裹使用 Groovy 语句。
声明式指令简介
1.最外层必须由 pipline{ //do something }来进行包裹
2.不需要分号作为分隔符,每个语句独占一行
3.不能直接使用 groovy 语句(例如循环判断等),需要被 script {}包裹
- pipeline :声明其内容为一个声明式的 pipeline 脚本
- agent:执行节点(支持 any,none,label,docker,dockerfile)
- stages:阶段集合,包裹所有的阶段(例如:打包,部署等各个阶段)
- stage:阶段,被 stages 包裹,一个 stages 可以有多个 stage
- steps:步骤,为每个阶段的最小执行单元,被 stage 包裹
// 示例
pipeline {
agent any
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
}
environment
- 在 pipline 块内,为全局变量,对所有阶段和步骤生效
- 在 stage 阶段内,为局部变量,只对阶段和步骤生效
withEnv
- 一般使用在子步骤下
// 示例
pipeline {
agent any
stages {
stage('Example') {
environment {
deploy = 'testing'
}
steps {
echo env.NAME
echo "${NAME}"
echo "${deploy}"
echo "$CC"
withEnv(['name=tester']) {
echo "$name"
}
}
}
}
environment {
CC = 'clang'
}
}
post (通常定义在 pipeline 末端)
- always: 始终执行
- aborted: 终止时执行
- failure: 失败时执行
- success: 成功是执行
- unsuccessful :不成功时执行
- cleanup :其他 post 过程执行完毕后执行
// 示例
pipeline {
agent any
stages {
stage('Example') {
steps {
error '构建失败:这是一个自定义的错误信息'
}
}
}
post {
failure {
echo "this is a error"
}
}
}
when (使用在 stage 内)
- branch: 分支匹配时执行(when { branch 'master' })
- branch: 分支匹配时执行(when { branch 'master' })
- environment: 变量为给定值时执行(when { environment name: 'DEPLOY_ENV', value: 'production' })
- expression: Groovy表达式求值为true时执行(when { expression { return params.DEBUG_BUILD } })
- not: 嵌套条件为false时执行(when { not { branch 'master' } })
- allOf: 嵌套的条件都为真时执行(when { allOf { branch 'master'; environment name: 'DEPLOY_ENV', value: 'production' } })
- anyOf: 至少一个嵌套的条件为真时执行(when { anyOf { branch 'master'; branch 'staging' } })
// 示例
pipeline {
agent any
stages {
stage('DEPLOY_ENV') {
when { environment name: 'DEPLOY_ENV', value: 'production' }
steps {
echo "production 环境正在执行"
}
}
}
}
Parallel (并行)
// 示例
pipeline {
agent any
stages {
stage('Parallel Stage') {
when {
branch 'master'
}
parallel {
stage('testing') {
steps {
echo "depoly testing"
}
}
stage('staging') {
steps {
echo "depoly staging"
}
}
}
}
}
}
options (选项)
- 常用的有 timeout()、retry()
// 示例
pipeline {
agent any
options {
retry(3) // 重试
timeout(time:10, unit:"SECONDS") // 超时
}
stages {
stage('demo'){
steps{
sh 'echo hello'
sleep(15)
}
}
}
}
steps 中的一些操作
- error:抛出异常,中断整个pipeline
- timeout: 超时
- waitUntil: 循环运行闭包内容,直到返回true,通常与timeout一起使用
- retry:失败重试
- sleep:睡眠,默认单位秒
// 示例
pipeline{
agent any
stages{
stage('stash'){
parallel('测试') {
stage('轮询') {
steps{
timeout(time:10, unit:"SECONDS"){
waitUntil{
script{
def rs = sh script: 'docker version', returnStatus: true
return (rs == 0)
}
}
}
}
}
stage('重试') {
steps{
retry(3){
script{
sh script: 'curl https://www.baidu.com', returnStatus: true
}
sleep(3)
}
}
}
stage('错误') {
steps{
retry(3){
error("执行失败")
}
}
}
}
}
}
}
input (暂停执行,等待确认)
// 示例
pipeline {
agent any
stages {
stage('Example') {
input {
message 'Should we continue?'
parameters {
string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?')
}
}
steps {
echo "Hello, ${PERSON}, nice to meet you."
input(message: '是否继续执行构建', parameters: [ choice(name:'depoly',description:'部署环境',choices:['testing','staging','production'])])
}
}
}
}
script (脚本使用)
// 示例
def test = "test"
pipeline {
agent any
stages {
stage('环境变量') {
steps {
sh 'pwd'
sh "echo ${NAME}"
script {
if ("${NAME}" == "/root/test") {
echo "pass"
} else if ("${NAME}" == "${test}") {
echo "pass"
} else {
error("环境变量有误 ${NAME}")
}
}
}
}
}
}
脚本式案例
- 最外层有 node{} 包裹
// 示例
def TEST_PROJECT_NAME=""
def deployments = ["testing", "staging", "production"]
def run(stepName) {
retry(3){
TEST_PROJECT_NAME = sh(script: "openssl rand -hex 4",returnStdout: true).trim()
sh (
script: "echo ${TEST_PROJECT_NAME}",
label: "开始 ${stepName} 环境API测试"
)
}
}
node {
deployments.each{ param ->
stage("$param") {
run("$param")
}
}
}
拓展
build
- build 用法,支持触发另一个 job 构建
// 示例
pipeline {
agent any
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
post {
success {
script {
println "执行成功"
jobB = build job: 'pipeline'
println("构建状态: "+jobB.getResult())
}
}
}
}
原文地址:https://www.cnblogs.com/test-works/p/15129986.html
- HDUOJ---1233还是畅通工程
- HDUOJ---1863畅通工程
- HDUOJ---1879 继续畅通工程
- MySQL命令行工具:percona-toolkit安装使用初探
- 解决Nginx配置http2不生效,谷歌浏览器仍然采用http1.1协议问题
- 海量数据切分抽取的实践场景(r11笔记第43天)
- 使用shell自动化诊断性能问题(一)(r11笔记第41天)
- Data Guard实现故障自动切换(二)(r11笔记第40天)
- Oracle Data Guard延迟的原因(r11笔记第69天)
- 一个细小的空间问题触发的报警(r11笔记第68天)
- MySQL误操作数据恢复的简单实践(r11笔记第67天)
- Oracle 12c中JOB运行失败的简单处理(r11笔记第66天)
- MySQL中的半同步复制(r11笔记第65天)
- Linux系统LVM逻辑卷创建过程以及自动化脚本
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Flutter Widgets 之 Opacity 和AnimatedOpacity
- 聊聊常见的服务(接口)认证授权
- Flutter Widgets 之 FutureBuilder
- [Hei-Ocelot-Gateway ].Net Core Api网关Ocelot的开箱即用版本
- Flutter Widgets 之 InkWell 和 Ink
- Flutter Widgets 之 BottomNavigationBar
- Flutter Widgets 之 PageView
- 笔试题:代码如何实现“百钱买百鸡”?
- Flutter Widgets 之 Dialog 对话框
- 全网最详细的一篇Flutter 尺寸限制类容器总结
- 一篇带你看懂Flutter叠加组件Stack
- Flutter 拖拽排序组件 ReorderableListView
- 女神节 | 程序员如何低调而又不失逼格
- Flutter 拖拽控件Draggable看这一篇就够了
- 面试官:你精通多少种语言的Hello World?