当前位置: 首页 > article >正文

【Jenkins】个人向-Jenkinsfile如何写

官方参考:https://www.jenkins.io/doc/book/pipeline/syntax/
Pipeline Utility Steps 插件:https://birdbook.com.cn/ops/ci/jenkins/plugins/pipeline%20utility%20steps.html

常用环境变量

含义表达式备注
params,传入参数传入参数params.都可以用env.来访问
执行Jenkins用户名env.BUILD_USER_ID依赖用户名插件:
wrap([$class: ‘BuildUser’]) {
env.BUILD_USER_ID
}
构建序号env.BUILD_NUMBER
构建节点env.NODE_NAME
windows默认cpu逻辑核数env.NUMBER_OF_PROCESSORSlinux获取命令 nproc
STAGE名字env.STAGE_NAME

常用语法

等待

sleep 300

条件

_force_cores = '16'
if (_force_cores.toInteger() < 64 && _force_cores.toInteger() > 0) {matlab_cores = _force_cores.toInteger()
} else {error "Faulty data in FORCE_MATLAB_CORES: ${_force_cores}"
}

循环

for(i in list_matcher_in.toSet()){command = command.replaceAll("@S_IN_VAR@${i}@E_IN_VAR@", global_vars.get(i))
}def continue_update = true
while (continue_update){continue_update=false
}batch.each { elem ->println elem 
}// 带序号的遍历
batches.eachWithIndex{ elem , index ->
}

临时切换工作目录

dir("xxxx") {xxxx
}

常用option

options {/* 配置构建超时时间 */timeout(time: 600, unit: "MINUTES")/* 设置不允许并发构建 */disableConcurrentBuilds()/* 保留记录 */buildDiscarder logRotator(artifactDaysToKeepStr: '30', artifactNumToKeepStr: '30', daysToKeepStr: '30', numToKeepStr: '30')}

定义初始参数(可选,可以直接再视图定义,不在jenkinsfile里)

parameters {string(defaultValue: "/app/jenkins/xxxx.zip", description: '文件路径', name: 'filePath')string(defaultValue: "", description: '部署日期', name: 'date')booleanParam defaultValue: true, description: '是否需要验证', name: 'needVerify'
}

任务输入弹窗

// 仅做确认
input ”请确认“
// 输入一个参数
env.URL_REPO_BUILD = input message: '请输入仓库地址', ok: 'Yes', parameters: [string(description: 'ssh://git@10.1.1.111/XX_Build' , name: 'URL_REPO_BUILD', trim: true)]
// 输入多个参数
def inputResp = input message: '请输入子仓库信息', ok: '更新', parameters: [string(defaultValue: 'Application_Code_Files/SWU_XXXX', description: '子仓库相对路径', name: 'SWU_REPO_NAME', trim: false), string(defaultValue: '', description: '子仓库版本号', name: 'SUB_REVISION_ID', trim: false), booleanParam(defaultValue: false, description: '是否继续更新子仓库', name: 'CONTINUE_UPDATE')]
continue_update = inputResp['CONTINUE_UPDATE']
env.SUB_REVISION_ID = inputResp['SUB_REVISION_ID']
env.SWU_REPO_NAME = inputResp['SWU_REPO_NAME']

定义全局可访问的量

/// 全局定义变量
def project_prefix = 'WORK'
def JOB = [xxx: "${project_prefix}_Build",log_archive: 'log_files.7z',repo: [base_repo: "${project_prefix}_Build",bsw_repo: 'core',],path: [_7z: 'C:/Program Files/7-Zip/7z.exe'var_path: ""],lic: [XXXX: 'XXXXX',]
]// 访问方式
JOB.path._7z
// 赋值方式
JOB.path.var_path = 'nihao'//全局配置文件
/*
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/day11
password=root
username=root
maxActive=20
minIdle=3
initialSize=20
*/// 读取配置文件,原生调用方法
import hudson.FilePath
import hudson.model.ParametersAction
import hudson.model.FileParameterValue
import hudson.model.Executordef getConfig(){File file = new File("static-server.properties")def props = new Properties();props.load(new BufferedReader(new InputStreamReader(new FileInputStream(file))));return props;
}def config = getConfig();
env.baseDeployDir=config["baseDeployDir"]  //全局可访问
env.deployDir="${baseDeployDir}/${system}"// Pipeline Utility Steps
pipeline {agent anystages {stage('Read Properties') {steps {script {// 读取 properties 文件def props = readProperties file: 'config.properties'// 输出 properties 文件中的值echo "DB_URL: ${props['db.url']}"echo "DB_USER: ${props['db.user']}"echo "DB_PASSWORD: ${props['db.password']}"// 或者遍历所有的属性props.each { key, value ->echo "${key}: ${value}"}}}}}
}// 不推荐(中途定义全局变量)
定义变量的时候不加def,默认定义全局变量// 用environment初始定义环境变量
pipeline {agent anyenvironment {A = '100' // 环境变量,在所有 stage 中有效}stages {stage('Stage 1') {steps {echo "A in Stage 1: ${env.A}"}}stage('Stage 2') {steps {echo "A in Stage 2: ${env.A}"}}}
}// 用env定义环境变量
env.system_type="linux"
pipeline {agent anystages {stage('Stage 1') {steps {script{env.system="system"}}}stage('Stage 2') {steps {echo env.systemprintln env.system_type}}}
}

执行条件

// 环境变量当条件
when{environment name: 'deployMgmt', value: 'true'
}
// 多个条件
when{allOf{environment name: 'deploy1', value: 'true'anyOf{environment name: 'deploy2', value: 'true'environment name: 'deploy3', value: 'true'}}
}

字符串操作

// 拼接
"${aa}${bb}"
aa+bb
//替换
command = command.replaceAll('aa', 'bb')
command = command..replaceAll(/\.(abc|dfg)$/, "")  // 正则表达式
// 切分
text.split(/[ ,!]+/)  // 正则表达式
text.split('split')   // 按单词切分 如果分割单词出现2次,返回的字符串数组中会有一个null
text.tokenize('ab')  // 按字符a和b去切分,连续出现分割字符,自动合并连续的分隔符,保证没有null
// 判断包含
filepath.contains('xxx.pdf')

有用的内置函数

fileExists('/app/a.txt') //判断是否有文件
fileExists('/app/dir/'') //判断是否有目录,多个/
isUnix() //判断系统类型,依赖插件Pipeline Utility Steps
// 正则表达式 /[0-9a-f]{12}/
def matcher = (inPath =~ /\/([^_]+)_Autosar\.mdl/)
if (matcher) {match = matcher[0][1]
}
// 列表拼接
def swuList = []
swuList.add(name)
swus = '\n'.join(swuList)

调用其他作业

jobB =build job: "xxxx-deploy", propagate: false, wait: true, parameters: [string(name: 'dir', value: "${env.dir}")
]
String result = jobB.getResult();
Name = jobB.getProjectName()
println result;

函数功能抽象,以微信通知为例

def notice(result){return script {String author=config["receiver"]String msg = "${envDesc}发布${result}"jobB = build job: "notice", propagate: false, wait: false, parameters: [string(name: 'msg', value: "${msg}"),string(name: 'authors', value: "${author}"),string(name: "msgType", value: "wechat")]}
}

post处理

post {/* post节点定义在阶段运行结束的操作,支持一些后置条件* always 总是运行* changed 当前状态与上一次构建状态不同时运行* failure 当前失败时运行* success 当前成功时运行* unstable 不稳定状态时运行* aborted 被终止时运行* */failure {script{}
}

多台机器执行的时候,共享文件

// 保留文件或者文件夹
stash includes: "${JOB.output_folder_name}/**", allowEmpty: true, name: 'output_folder_stash'
// 切换节点后,释放
unstash 'output_folder_stash'

归档文件

// 可多次执行
archiveArtifacts artifacts: "${JOB.log_archive}"

主动报错

error 'Invalid format'

环境变量局部生效

//代码块生效
withEnv (['TMP=E:\\TMP']) {
}//stage级别生效
stage('STAGE') {agent {label "MATLAB"}environment {TOOLS_PATH = "${JOB.path.build_tools_common}"}stages {

动态stage,可以动态生成stage

batches.eachWithIndex { batch, index ->stage("Batch ${index+1}/${batches.size()}") {echo running}

相关文章:

【Jenkins】个人向-Jenkinsfile如何写

官方参考&#xff1a;https://www.jenkins.io/doc/book/pipeline/syntax/ Pipeline Utility Steps 插件&#xff1a;https://birdbook.com.cn/ops/ci/jenkins/plugins/pipeline%20utility%20steps.html 常用环境变量 含义表达式备注params&#xff0c;传入参数传入参数params…...

python第十一课:并发编程 | 多任务交响乐团

&#x1f3af; 本节目标 理解多线程/多进程/协程的应用场景掌握threading与multiprocessing核心用法学会使用asyncio进行异步编程开发实战项目&#xff1a;高并发爬虫引擎破解GIL锁的性能迷思 1️⃣ 并发编程三剑客 &#x1f3bb; 生活化比喻&#xff1a; 多线程 → 餐厅多个…...

Android SystemUI深度定制实战:下拉状态栏集成响铃功能开关全解析

一、功能实现全景视图 目标场景&#xff1a;在Android 14系统级ROM定制中&#xff0c;为SystemUI下拉状态栏的QuickQSPanel区域新增响铃模式切换开关&#xff0c;实现静音/响铃快速切换功能。该功能需通过三层关键改造实现&#xff1a; 二、核心实现三部曲 1. 配置注入&…...

基于 Flink CDC YAML 的 MySQL 到 Kafka 流式数据集成

本教程的演示都将在 Flink CDC CLI 中进行&#xff0c;无需一行 Java/Scala 代码&#xff0c;也无需安装 IDE。 这篇教程将展示如何基于 Flink CDC YAML 快速构建 MySQL 到 Kafka 的 Streaming ELT 作业&#xff0c;包含整库同步、表结构变更同步演示和关键参数介绍。 准备阶段…...

ubuntu下r8125网卡重启丢失修复案例一则

刚装的一台服务器&#xff0c;ubuntu24.04&#xff0c;主板网卡是r8125&#xff0c;安装服务后会莫名其妙丢失驱动 按照官网的方法下载最新8125驱动包&#xff1a; Realtek 然后卸载驱动 rmmod r8125 然后在驱动包里安装&#xff08;幸好我之前装了build-essential&#x…...

解决 ERROR 1130 (HY000): Host is not allowed to connect to this MySQL server

当使用 MySQL 时&#xff0c;您可能会遇到错误信息“ERROR 1130 (HY000): Host ‘hostname’is not allowed to connect to this MySQL server”这是 MySQL 用于防止未经授权的访问的标准安全特性。实际上&#xff0c;服务器还没有配置为接受来自相关主机的连接。 Common Caus…...

科普|无人机专业术语

文章目录 前言一、飞控二、电调三、通道四、2S、3S、4S电池五、电池后面C是什么意思?六、电机的型号七、什么是电机的KV值?八、螺旋桨的型号九、电机与螺旋桨的搭配 前言 无人机飞控系统控制飞行姿态&#xff0c;电调控制电机转速&#xff0c;遥控器通道控制飞行动作。电池C…...

Qt:窗口

目录 菜单栏 QMenuBar 菜单添加快捷键 添加子菜单 添加分割线和添加图标 QMenuBar创建方式 工具栏 QToolBar 和菜单栏搭配 创建多个工具栏 状态栏 QStatusBar 状态栏中添加其他控件 浮动窗口 QDockWidget 对话框 对话框的内存释放问题 自定义对话框界面 模态对话…...

深入浅出 Go 语言:协程(Goroutine)详解

深入浅出 Go 语言&#xff1a;协程(Goroutine)详解 引言 Go 语言的协程&#xff08;goroutine&#xff09;是其并发模型的核心特性之一。协程允许你轻松地编写并发代码&#xff0c;而不需要复杂的线程管理和锁机制。通过协程&#xff0c;你可以同时执行多个任务&#xff0c;并…...

Python从0到100(八十九):Resnet、LSTM、Shufflenet、CNN四种网络分析及对比

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…...

实验:k8s+keepalived+nginx+iptables

1、创建两个nginx的pod&#xff0c;app都是nginx nginx1 nginx2 2、创建两个的pod的service 3、配置两台keepalived的调度器和nginx七层反向代理&#xff0c;VIP设置192.168.254.110 keepalived调度器master keepalived调度器backup 两台调度器都配置nginx七层反向代理&#…...

elpis全栈课程学习之elpis-core学习总结

elpis全栈课程学习之elpis-core学习总结 核心原理 elpis-core是全栈框架elpis的服务端内核&#xff0c;主要应用于服务端接口的开发以及页面的SSR渲染&#xff0c;elpis-core基于约定优于配置的原理&#xff0c;通过一系列的loader来加载对应的文件&#xff0c;大大节约用户的…...

LlamaFactory-webui:训练大语言模型的入门级教程

LlamaFactory是一个开源框架&#xff0c;支持多种流行的语言模型&#xff0c;及多种微调技术&#xff0c;同时&#xff0c;以友好的交互式界面&#xff0c;简化了大语言模型的学习。 本章内容&#xff0c;从如何拉取&#xff0c;我已经搭建好的Llamafactory镜像开始&#xff0…...

手机打电话时如何识别对方按下的DTMF按键的字符-安卓AI电话机器人

手机打电话时如何识别对方按下的DTMF按键的字符 --安卓AI电话机器人 一、前言 前面的篇章中&#xff0c;使用蓝牙电话拦截手机通话的声音&#xff0c;并对数据加工&#xff0c;这个功能出来也有一段时间了。前段时间有试用的用户咨询说&#xff1a;有没有办法在手机上&#xff…...

Spring Cloud LoadBalancer详解

一、介绍 Spring Cloud LoadBalancer是Spring Cloud官方自己提供的客户端负载均衡器,抽象和实现,用来替代Ribbon(已经停更), 二、Ribbon和Loadbalance 对比 组件组件提供的负载策略支持负载的客户端Ribbon随机 RandomRule轮询 RoundRobinRule 重试 RetryRule最低并发 Bes…...

使用Spring Boot与达梦数据库(DM)进行多数据源配置及MyBatis Plus集成

使用Spring Boot与达梦数据库(DM)进行多数据源配置及MyBatis Plus集成 在现代企业级应用开发中&#xff0c;处理多个数据源是一个常见的需求。本文将详细介绍如何使用Spring Boot结合达梦数据库&#xff08;DM&#xff09;&#xff0c;并通过MyBatis Plus来简化数据库操作&…...

基于SpringBoot和PostGIS的省域“地理难抵点(最纵深处)”检索及可视化实践

目录 前言 1、研究背景 2、研究意义 一、研究目标 1、“地理难抵点”的概念 二、“难抵点”空间检索实现 1、数据获取与处理 2、计算流程 3、难抵点计算 4、WebGIS可视化 三、成果展示 1、华东地区 2、华南地区 3、华中地区 4、华北地区 5、西北地区 6、西南地…...

【Qt】详细介绍如何在Visual Studio Code中编译、运行Qt项目

Visual Studio Code一只用的顺手&#xff0c;写Qt的时候也能用VS Code开发就方便多了。 理论上也不算困难&#xff0c;毕竟Qt项目其实就是CMake&#xff08;QMake的情况这里就暂不考虑了&#xff09;项目&#xff0c;VS Code在编译、运行CMake项目还是比较成熟的。 这里笔者打…...

【Linux】修改 core 文件大小和路径

在 Linux 系统中&#xff0c;默认情况下&#xff0c;核心转储文件&#xff08;core dump&#xff09;会生成在当前工作目录下。为了将核心转储文件生成在指定路径下&#xff0c;可以通过以下方法进行配置。 1. 设置核心转储文件路径 Linux 系统提供了两种方式来指定核心转储文…...

本地部署大语言模型-DeepSeek

DeepSeek 是国内顶尖 AI 团队「深度求索」开发的多模态大模型&#xff0c;具备数学推理、代码生成等深度能力&#xff0c;堪称"AI界的六边形战士"。 Hostease AMD 9950X/96G/3.84T NVMe/1G/5IP/RTX4090 GPU服务器提供多种计费模式。 DeepSeek-R1-32B配置 配置项 规…...

【03】STM32F407 HAL 库框架设计学习

【03】STM32F407 HAL 库框架设计学习 摘要 本文旨在为初学者提供一个关于STM32F407微控制器HAL&#xff08;Hardware Abstraction Layer&#xff09;库框架设计的详细学习教程。通过本文&#xff0c;读者将从零开始&#xff0c;逐步掌握STM32F407的基本知识、HAL库的配置步骤…...

鸿蒙HarmonyOS NEXT开发:组件-样式-基础 2

// 1 // 2 ArkUI 基本语法 // 方舟开发框架(简称:ArkUI),是一套 构建HarmonyOS应用 界面 的框架。 // 构建页面的最小单位就是 "组件"。 // 组件名(参数) { // 内容 // } // .属性1() // .属性2() // .属性N() import text from @ohos.graphics.text // @En…...

SQLAlchemy系列教程:SQLAlchemy快速入门示例项目

SQLAlchemy是与数据库交互的Python开发人员不可或缺的库。这个强大的ORM允许使用python结构进行简单的数据库操作。设置过程很简单&#xff0c;并且允许可扩展的数据库应用程序开发。本文通过入门项目完整介绍SQLAlchemy的应用过程&#xff0c;包括安装依赖包&#xff0c;创建连…...

【Linux网络#10】:Https协议原理

&#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;Linux—登神长阶 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; 生活总是不会一帆风顺&#xf…...

蓝桥杯备考:记忆化搜索之function

这道题是有重复的问题的&#xff0c;所以我们可以选择记忆化搜索 #include <iostream> using namespace std; typedef long long LL; const int N 25; LL ret[N][N][N]; LL dfs(LL a,LL b, LL c) {if(a<0 || b<0 || c<0) return 1;if(a>20 || b>20 || c…...

在Nginx上配置并开启WebDAV服务的完整指南

在Nginx上配置并开启WebDAV服务的完整指南 如何在 Nginx 上开启 WebDAV 服务 要在 Nginx 上开启 WebDAV 服务&#xff0c;你需要配置 Nginx 以支持 WebDAV 请求。以下是详细的步骤&#xff1a; 1. 确保 Nginx 安装了 WebDAV 模块 Nginx 的 WebDAV 功能由 http_dav_module 模…...

mysql 全方位安装教程

下载 MySQL 【官网下载地址】 注意要选择较大的哪个安装包&#xff0c;小的安装包是一个安装器。 我们不用登录&#xff0c;直接下载 直接运行下载好的安装包 MySQL如果是 安装包安装, 可以图形化界面自主配置 如果是压缩包解压, 可以配置 配置文件, 可以解压安装到指定的…...

设计模式Python版 观察者模式

文章目录 前言一、观察者模式二、观察者模式示例 前言 GOF设计模式分三大类&#xff1a; 创建型模式&#xff1a;关注对象的创建过程&#xff0c;包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式&#xff1a;关注类和对象之间的组…...

如何在Python用Plot画出一个简单的机器人模型

如何在Python中使用 Plot 画出一个简单的模型 在下面的程序中&#xff0c;首先要知道机器人的DH参数&#xff0c;然后计算出每一个关节的位置&#xff0c;最后利用 plot 函数画出关节之间的连杆就可以了&#xff0c;最后利用 animation 库来实现一个动画效果。 import matplo…...

如何使用ArcGIS Pro制作横向图例:详细步骤与实践指南

ArcGIS Pro&#xff0c;作为Esri公司推出的新一代地理信息系统&#xff08;GIS&#xff09;平台&#xff0c;以其强大的功能和灵活的操作界面&#xff0c;在地理数据处理、地图制作和空间分析等领域发挥着重要作用。 在地图制作过程中&#xff0c;图例作为地图的重要组成部分&…...