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

【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…...

staruml绘制时序图和用例图

文章目录 1.文章介绍2.绘制用例图3.绘制时序图 1.文章介绍 之前&#xff0c;我们初步介绍了这个staruml软件的安装和如何使用这个软件对于uml类图进行绘制&#xff0c;当时我们是绘制了这个user类&#xff0c;实现了相关的接口&#xff0c;表示他们之间的关系&#xff0c;在今…...

问题修复-后端返给前端的时间展示错误

问题现象&#xff1a; 后端给前端返回的时间展示有问题。 需要按照yyyy-MM-dd HH:mm:ss 的形式展示 两种办法&#xff1a; 第一种 在实体类的属性上添加JsonFormat注解 第二种&#xff08;建议使用&#xff09; 扩展mvc框架中的消息转换器 代码&#xff1a; 因为配置类继…...

Rust配置开发环境+服务器实战

https://www.cnblogs.com/skzxc/p/12129353.html 默认已经安装好MSVC。 官网https://www.rust-lang.org/zh-CN/learn/get-started安装Rust安装器&#xff0c;选择winodwsx64版本 运行安装&#xff0c;将文件夹移动到D盘&#xff0c;安装后&#xff0c;文件夹在C:\Users\xxx下…...

使用DeepSeek+KIMI生成高质量PPT

一、使用DeepSeek DeepSeek官网&#xff1a;DeepSeek 点击“开始对话”&#xff0c;进入交互页面。 在上图中&#xff0c;输入问题&#xff0c;即可获取AI生成的结果。 基础模型&#xff08;V3&#xff09;&#xff1a;通用模型&#xff08;2024.12&#xff09;&#xff0c;高…...

虚拟机如何设置ip

在虚拟机中设置IP地址的具体步骤会因虚拟机软件&#xff08;如VMware、VirtualBox等&#xff09;和操作系统&#xff08;如Windows、Linux等&#xff09;的不同而有所差异。以下是几种常见虚拟机软件和操作系统的IP设置方法。 --- 一、VMware中的IP设置 1.Windows虚拟机 1. 打…...

蓝桥杯 路径之谜

路径之谜 题目描述 小明冒充 XX 星球的骑士&#xff0c;进入了一个奇怪的城堡。 城堡里边什么都没有&#xff0c;只有方形石头铺成的地面。 假设城堡地面是 nnnn 个方格。如下图所示。 按习俗&#xff0c;骑士要从西北角走到东南角。可以横向或纵向移动&#xff0c;但不能斜着走…...

Git操作指南:分支合并、回退及其他重要操作

在软件开发的协作过程中&#xff0c;Git 作为一款强大的版本控制系统&#xff0c;能帮助开发者高效管理代码的各个版本和分支。本文将详细介绍 Git 中常见的分支合并、取消本地修改、回退操作等&#xff0c;并提供通俗易懂的解释和步骤指南。 一、分支合并 分支合并是 Git 工…...

Element Plus中el-tree点击的节点字体变色加粗

el-tree标签设置 <el-tree class"tree":data"treeData":default-expand-all"true":highlight-current"true"node-click"onTreeNodeClick"><!-- 自定义节点内容&#xff0c;点击的节点字体变色加粗 --><!-- 动…...

jenkens使用笔记

jenkens使用笔记 笔记使用版本是2.492.1 git仓库ssh证书配置 已开始配置一直不行&#xff0c;然后下载插件&#xff0c;多次重启等一些列操作&#xff0c; 后来配置就可以工作了&#xff0c;原因不祥&#xff0c;不知道哪个配置起效了。 等回来闹明白了&#xff0c;再补充笔记…...

腾讯混元文生图大模型(Hunyuan-DiT)与Stable Diffusion(SD)对比分析

腾讯混元文生图大模型&#xff08;Hunyuan-DiT&#xff09;与Stable Diffusion&#xff08;SD&#xff09;对比分析 腾讯混元文生图大模型&#xff08;Hunyuan-DiT&#xff09;与Stable Diffusion&#xff08;SD&#xff09;作为当前文生图领域的两大代表模型&#xff0c;各自…...

深入浅出理解编译器:前端视角

一、编译器究竟是什么&#xff1f; 在前端开发的世界里&#xff0c;我们经常会听到 “编译器” 这个词。就拿 Babel 来说&#xff0c;在它的官网上&#xff0c;最显眼的一句话就是&#xff1a;“Babel is a JavaScript compiler”。那什么是 JavaScript 编译器呢&#xff1f;又…...

Minio搭建并在SpringBoot中使用完成用户头像的上传

Minio使用搭建并上传用户头像到服务器操作,学习笔记 Minio介绍 minio官网 MinIO是一个开源的分布式对象存储服务器&#xff0c;支持S3协议并且可以在多节点上实现数据的高可用和容错。它采用Go语言开发&#xff0c;拥有轻量级、高性能、易部署等特点&#xff0c;并且可以自由…...

Ubuntu系统上部署Node.js项目的完整流程

以下是在Ubuntu系统上部署Node.js项目的完整流程&#xff0c;分为系统初始化、环境配置、项目部署三个部分&#xff1a; 一、系统初始化 & 环境准备 bash # 1. 更新系统软件包 sudo apt update && sudo apt upgrade -y# 2. 安装基础工具 sudo apt install -y buil…...

DeepSeek效应初现:Grok-3补刀ChatGPT,OpenAI已在ICU?

嘿&#xff0c;技术小伙伴们&#xff01;今天咱们聊聊最近在AI界引发轰动的新闻——DeepSeek和xAI相继用R1和Grok-3证明了预训练Scaling Law并非OpenAI的护城河。这意味着什么呢&#xff1f;让我们一探究竟&#xff01; 开场白 首先&#xff0c;让我们看看最新的“全能冠军”…...

【知识】torchrun 与 torch.multiprocessing.spawn 的对比

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 来自ChatGPT、DeepSeek 有点干&#xff0c;可仅做了解。 torchrun 和 torch.multiprocessing.spawn 都是在 PyTorch 中用于并行化和分布式训练的工具&a…...

深入了解 K-Means 聚类算法:原理与应用

引言 在数据科学和机器学习的世界中&#xff0c;聚类是一项非常重要的技术&#xff0c;它帮助我们根据数据的相似性将数据划分为不同的组或簇。聚类算法在许多领域中得到了广泛的应用&#xff0c;如图像处理、市场细分、基因研究等。K-Means 聚类算法作为最常见的无监督学习算…...

Rust ~ Collect

背景 Transforms an iterator into a collection 将一个迭代器转换为一个集合 collect() 可以处理任何可迭代的对象&#xff0c;并将其转换为相关的集合 collect() 最基本模式是将一个集合转换为另一个集合&#xff1a; 先获取一个集合&#xff0c;对其调用 iter 方法&#x…...

C# 类型转换

C# 类型转换 引言 在C#编程语言中&#xff0c;类型转换是一种将一个数据类型的变量转换成另一个数据类型的操作。类型转换是编程中常见的操作&#xff0c;特别是在处理不同数据类型的变量时。本文将详细探讨C#中的类型转换&#xff0c;包括隐式转换和显式转换&#xff0c;以及…...

[IP] DDR_FIFO(DDR3 用户FIFO接口)

IP(DDR_FIFO)将DDR3 IP的用户侧复杂接口修改为简易的FIFO接口&#xff0c;用户侧更加简易例化使用MIG 核 IP介绍 c0_xx (连接DDR app接口) 此IP 仅需根据MIG配置进行有限修改&#xff0c;即可使用&#xff01; 关于IP详细使用说明&#xff0c;参考IP datasheet&#xff01; 示…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...