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

Jenkinsfile流水线构建教程

前言

Jenkins 是目前使用非常广泛的自动化流程的执行工具, 我们目前的一些自动化编译, 自动化测试都允许在 Jenkins 上面. 在 Jenkins 的术语里面, 一些自动化工作联合起来称之为流水线, 比如拉取代码, 编译, 运行自动化测试等.

本文的主要目的是引导你快速熟悉 Jenkinsfile 结构和语义, 让你读完之后可以自己写出一个 Jenkinsfile.

Jenkins 流水线分为脚本式的和声明式的. 脚本式流水线比较灵活, 可以嵌入一些 groovy 语言编程,功能比较强大, 但是对于新手而言上手比较困难, 有一定的学习门槛. 声明式流水线更具结构化, 简单直白, 减少了对 groovy 语言的依赖, 对新用户更友好.

Jenkinsfile 是什么

在 Jenkins 2 中, 流水线配置可以从 Jenkins 中分离出来. Jenkinsfile 允许你将配置文件和执行步骤以代码的形式保存, 这样就可以做到像管理 源代码一样管理 Jenkins 任务, 支持历史追溯, 差异对比等.

Jenkins2 推荐使用名为 'Jenkinsfile’的文件保存任务配置和流水线信息, 不同的项目和分支都有自己 的 Jenkinsfile, 其内容各不相同.

Jenkinsfile 基本功能

让我们先从一个简单的 Jenkinsfile 开始, 逐步了解 Jenkinsfile 的功能和用法.

Jenkinsfile Hello world

pipeline {agent anystages {stage('Source') {steps {echo 'hello world'}}}
}
  • 第 1 行声明这是一个流水线.
  • 第 2 行指定了执行该流水线的 agent, agent 可以理解为一个执行环境, 可以是 docker, k8s, 也可以是当前机器环境
  • 第 4 行指定了执行该流水线所需要的步骤, stages 里面可以保护多个 stage
  • 第 5 行指定了一个名字叫做'Source'stage
  • 第 6 行指定了该 stage 内需要执行的 steps
  • 第 7 行调用 echo 内置函数打印了一句'hello world'

执行 shell 脚本

在 steps 块中使用sh来执行. 多行命令可以用"""(三个双引号) 或者 "'(三个单引号). 区别在于双引号里面引用 的变量会被计算展开. 例如:

steps {// 单行shell命令sh 'echo "Hello world"'// 多行shell命令, 以连续的三个'或者"包围sh '''#!/bin/bash# multi line shell scriptcd projectmkdir build && cd buildcmake .. && cmake --build .'''
}

指定工作目录

dir指令的功能是设定命令执行时的工作目录, 如果该目录不存在则创建它.

steps {dir('project/build') {sh "echo `pwd`"}
}

拉取 GitHub/Bitbucket 代码

声明式流水线的 git 检出代码非常简单直白. 如下:

steps {dir('code_repo') {git credentialsId: "${BITBUCKET_CREDENTIALS_ID}",url: 'ssh://git@git.company.com/code_repo.git',branch: 'master'}
}

需要说明几点:

  1. git指令会检出到当前的目录. 如果你需要检出到子目录则需要使用dir指令.
  2. credentialsId这块引用了一个环境变量, 该变量保存着仓库服务器的 credential. 定义环境变量的方法见后.
  3. branch 指定使用该仓库的哪个分支, 如果是 master 那可以省略.

定义环境变量

环境变量在 pipeline 的environment块中定义.

pipeline {agent noneenvironment {// credentials for other service, you can find it atBITBUCKET_CREDENTIALS_ID = 'bitbucket.company.com'REGISTRY_CREDENTIALS_ID = 'jenkins-harbor'}
}

使用 docker 容器

这里有两种办法.

docker 插件提供的方法

在 agent 中指定 docker 环境. 这种方法适合安装了 docker 的 Jenkins.

stage ('SetupEnv') {agent {docker {alwaysPull trueimage 'hub.company.com/jenkins/ubuntu:24_04'registryCredentialsId "${REGISTRY_CREDENTIALS_ID}"registryUrl 'https://hub.company.com'reuseNode true}}steps {// 这里的代码运行在上面的docker container环境sh '''#!/bin/bashset -xeucd code_repo./setup_env.sh 64'''}
}

此时 steps 块中的命令都是在 docker 环境中执行的.

Docker Template

本方法适用于在 k8s 集群上面部署的 Jenkins, 并且已经设置了全局的 Docker Template 文件. 如果想使用 自己设定的 yaml 文件, 请参考下一节. label 是指定 k8s 有相应标签属性的 pod, 而container 则是指定选取特定的 docker images.

pipeline {agent {kubernetes {label 'jenkins-streaming'}}stages {stage('stage1') {steps{container('ubuntu'){sh 'lsb_release -a'}}}}
}

指定自己的 k8s yaml 文件

本方法适用于 k8s 环境下部署的 Jenkins. 特点在于可以由使用者配置 Docker Template.

pipeline {agent {kubernetes {yaml libraryResource('co/company/project_pod.yaml')}}stages {stage('show') {steps{container('ubuntu'){sh 'lsb_release -a'}}}}
}

yaml 文件如果在本地仓库, 则可以使用

yamlFile 'path/to/local/pod/file.yaml'

指定 agent

一个 pipeline 可以指定一个或者多个agent. 指定一个全局通用 agent 的方法是在 pipeline 开始的地方指定.

pipeline {agent any
}pipeline {agent {docker {// docker images settings}}
}pipeline {agent {kubernetes {// k8s settings}}
}

如果需要在不同的 stage 使用不同的 agent, 则在开始处指定为none, 然后在各个 stage 分别指定.

pipeline {agent nonestages {stage('Source') {agent any}stage('Compile') {agent {image: 'hub.company.com/jenkins/ubuntu:2404'}}}
}

Artifactory 上传下载

中间产物文件需要上传到 Artifactory 的, 可以参考下面步骤:

stage ('Upload Files to Artifactory') {steps {rtUpload (serverId: "${ARTIFACTORY_SERVER_ID}",spec: """{"files": [{"pattern": "/build/library.a","target": "your_repo","props": "gcc_version=4.8;branch=your_branch_name"},{"pattern": "/build/executable.a","target": "your_repo","props": "gcc_version=4.8;branch=your_branch_name"}]}""")}
}

关于 spec 的详细信息可以参考: Upload

SonarQube 集成

SonarQube 提供了代码审计, 漏洞检查的功能. 目前可以集成 clang-tidy, cppcheck 静态检查结果, 以及 gcov 的覆盖率分析结果.
同时能提供新增代码的质量检查, 确保新 merge 的代码符合质量要求.

stage('Analysis') {steps {withSonarQubeEnv('SonarQubeServerID') {container("sonar-scanner-image") {sh '''#!/bin/bashset -eucd your/projectsonar-scanner -X \-Dsonar.projectKey=ProjectName'''}}}
}

一般而言, 我们会在执行 sonar-scanner 的目录里面存放一个名为sonar-project.properties
的文件, 用以指定更多的 sonar 配置. 示例的配置如下:

sonar.projectVersion=3.0.0
sonar.language=c++
# 指定源文件目录
sonar.sources=.
sonar.sourceEncoding=UTF-8
# 指定排除的文件/目录
sonar.exclusions=\build/** \doc/** \script/** \libs/** \test/**
# 指定排除覆盖率的文件
sonar.coverage.exclusions=**/*_test.cpp
# cppcheck 报告文件
sonar.cxx.cppcheck.reportPath=./cppcheck_report.xml
# clang tidy报告文件
sonar.cxx.clangtidy.reportPath=./clang-tidy-report.txt
sonar.cxx.coverage.reportPath=./bullseye_report.xml

总结

在这篇文章中, 我们深入探讨了 Jenkinsfile 的基础与高级用法, 从最简单的"Hello World"示例到复杂的 Docker 容器集成, Kubernetes 部署, Artifactory 上传下载以及 SonarQube 代码质量检查. 通过这些内容的学习, 可以帮你掌握如何创建一个基本的流水线, 并且了解了如何扩展这个基础以适应更复杂的需求.

参考资料

Jenkins 2: Up and Running

相关文章:

Jenkinsfile流水线构建教程

前言 Jenkins 是目前使用非常广泛的自动化流程的执行工具, 我们目前的一些自动化编译, 自动化测试都允许在 Jenkins 上面. 在 Jenkins 的术语里面, 一些自动化工作联合起来称之为流水线, 比如拉取代码, 编译, 运行自动化测试等. 本文的主要目的是引导你快速熟悉 Jenkinsfile …...

flex布局自定义一行几栏,靠左对齐===grid布局

模板 <div class"content"><div class"item">1222</div><div class"item">1222</div><div class"item">1222</div><div class"item">1222</div><div class"…...

开发HarmonyOS NEXT版五子棋游戏实战

大家好&#xff0c;我是 V 哥。首先要公布一个好消息&#xff0c;V 哥原创的《鸿蒙HarmonyOS NEXT 开发之路 卷1&#xff1a;ArkTS 语言篇》图书终于出版了&#xff0c;有正在学习鸿蒙的兄弟可以关注一下&#xff0c;写书真是磨人&#xff0c;耗时半年之久&#xff0c;感概一下…...

AI革命下的多元生态:DeepSeek、ChatGPT、XAI、文心一言与通义千问的行业渗透与场景重构

前言 人工智能技术的爆发式发展催生了多样化的AI模型生态&#xff0c;从通用对话到垂直领域应用&#xff0c;从数据挖掘到创意生成&#xff0c;各模型凭借其独特的技术优势与场景适配性&#xff0c;正在重塑全球产业格局。本文将以DeepSeek、ChatGPT、XAI&#xff08;可解释人…...

大语言模型(LLM)微调技术笔记

图1&#xff1a;大模型进化树2 大模型微调 在预训练后&#xff0c;大模型可以获得解决各种任务的通用能力。然而&#xff0c;越来越多的研究表明&#xff0c;大语言模型的能力可以根据特定目标进一步调整。 这就是微调技术&#xff0c;目前主要有两种微调大模型的方法1&…...

六十天前端强化训练之第一天HTML5语义化标签深度解析与博客搭建实战

欢迎来到编程星辰海的博客讲解 目录 一、语义化标签的核心价值 1.1 什么是语义化&#xff1f; 1.2 核心优势 二、语义标签详解与使用场景 2.1 布局容器标签 2.2 内容组织标签 三、博客结构搭建实战 3.1 完整HTML结构 3.2 核心结构解析 3.3 实现效果说明 四、学习要点…...

NLP的预处理数据

处理文本数据的主要工具是Tokenizer。Tokenizer根据一组规则将文本拆分为tokens。然后将这些tokens转换为数字&#xff0c;然后转换为张量&#xff0c;成为模型的输入。模型所需的任何附加输入都由Tokenizer添加。 如果您计划使用预训练模型&#xff0c;重要的是使用与之关联的…...

【DeepSeek问答】QProcess::start是异步的吗?会使UI卡顿吗?

好的&#xff0c;我现在需要回答用户关于QProcess::start是否是异步的&#xff0c;以及它是否会导致UI卡顿的问题。用户之前已经询问过如何开发一个调用7-Zip的Qt应用&#xff0c;并且我给出了示例代码。现在用户可能在使用过程中遇到了问题&#xff0c;或者想更深入了解QProce…...

【Java项目】基于Spring Boot的体质测试数据分析及可视化设计

【Java项目】基于Spring Boot的体质测试数据分析及可视化设计 技术简介&#xff1a;采用Java技术、Spring Boot框架、MySQL数据库等实现。 系统简介&#xff1a;体质测试数据分析及可视化设计是一个基于Web的在线平台&#xff0c;主要分为前台和后台两大功能模块。前台功能模…...

JAVA-如何理解Mysql的索引

一、索引的概念 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用(指针/地址)。可以对表中的一列或多列创建索引&#xff0c; 并指定索引的类型&#xff0c;各类索引有各自的数据结构实现。 二、索引是什么&#xff0c;用来干嘛 数据库中的表、数据、索引之间的…...

VUE向外暴露文件,并通过本地接口调用获取,前端自己生成接口获取public目录里面的文件

VUE中&#xff0c;如果我们想对外暴露一个文件&#xff0c;可以在打包之后也能事实对其进行替换&#xff0c;我们只需要把相关文件放置在public目录下即可&#xff0c;可以放置JSON&#xff0c;Excel等文件 比如我在这里放置一个other文件 我们可以直接在VUE中使用axios去获取…...

京准电钟:NTP精密时钟服务器在自动化系统中的作用

京准电钟&#xff1a;NTP精密时钟服务器在自动化系统中的作用 京准电钟&#xff1a;NTP精密时钟服务器在自动化系统中的作用 NTP精密时钟服务器在自动化系统中的作用非常重要&#xff0c;特别是在需要高精度时间同步的场景中。NTP能够提供毫秒级的时间同步精度&#xff0c;这…...

CSDN年度评选揭晓,永洪科技AI技术与智能应用双星闪耀

近日&#xff0c;永洪科技在CSDN&#xff08;中国专业开发者社区&#xff09;的年度评选中&#xff0c;凭借在人工智能技术创新与vividime在行业应用中的卓越表现&#xff0c;一举斩获“人工智能企业”及“智能应用”双料大奖。这一荣誉不仅彰显了永洪科技在AI领域的领先地位&a…...

vscode settings(二):文件资源管理器编辑功能主题快捷键

参考资料 Visual Studio Code权威指南 by 韩骏 一. 文件资源管理器 1.1 文件资源管理器隐藏文件夹 默认情况下&#xff0c;Visual Studio Code会在文件资源管理器中隐藏一些文件夹&#xff08;如.git文件夹&#xff09;​。可以通过files.exclude来配置要被隐藏的文件和文件…...

Ubuntu本地使用AnythingLLM

1.介绍 AnythingLLM是一个全栈应用程序&#xff0c;由Mintplex Labs Inc.开发&#xff0c;旨在将任何文档、资源或内容片段转换为大语言模型&#xff08;LLM&#xff09;在聊天中可以利用的相关上下文。 2.在ubuntu本地安装 打开终端并运行&#xff1a; curl -fsSL https:/…...

MybatisPlus-注解

TableName设定表名 1. MyBatis-Plus在确定操作的表时&#xff0c;由BaseMapper的泛型决定&#xff0c;即实体类型决 定&#xff0c;且默认操作的表名和实体类型的类名一致 2. 若实体类类型的类名和要操作的表的表名不一致&#xff0c;访问数据库表将会报错 3. 在实体类上添加…...

【多模态大模型学习】位置编码的学习记录

【多模态大模型学习】位置编码的学习记录 0.前言1. sinusoidal编码1.0 数学知识——复数1.0.1 复数乘法、共轭复数1.0.2 复数的指数表示 1.1 sinusoidal编码来历1.2 代码实现 2. Rotary Positional Embedding (RoPE) ——旋转位置编码2.1 RoPE来历2.2 代码实现2.2.1 GPT-J风格的…...

在MAC上面通过HomeBrew安装node和npm@指定版本

文章目录 搜索可用的 Node.js 版本安装指定版本的 Node.js将 node22 添加到 PATH验证安装是否成功给npm配置淘宝镜像 搜索可用的 Node.js 版本 liujinglong192 ~ % brew search node > Formulae libbitcoin-node node-build node20 nodeenv linod…...

基于YOLO11深度学习的医学X光骨折检测与语音提示系统【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...

HDFS扩缩容及数据迁移

1.黑白名单机制 在HDFS中可以通过黑名单、白名单机制进行节点管理&#xff0c;决定数据可以复制/不可以复制到哪些节点。 黑名单通常是指在HDFS中被标记为不可用或不可访问的节点列表&#xff0c;这些节点可能由于硬件故障、网络问题或其他原因而暂时或永久性地无法使用。当一…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...