Jenkins Pipeline 部署总结
Jenkins Pipeline 部署总结
前言
Jenkins Pipeline 是 Jenkins 提供的一套强大的工作流框架,它允许开发者以代码的形式定义整个软件交付过程,从而实现持续集成和持续部署(CI/CD)。通过 Pipeline,原本独立运行于单个或多个节点的任务可以被连接起来,形成一个完整的、可视化的工作流。以下是对 Pipeline 部署的一个综合记录与总结,涵盖了常用语法的概述以及实践应用的展示。
语法
Pipeline 的语法主要基于 Groovy,并分为声明式(Declarative)和脚本式(Scripted)两种。
声明式 Pipeline
声明式 Pipeline 是 Jenkins Pipeline 的推荐方式,它更简洁、更易于理解。其最简结构如下:
pipeline { agent any stages { stage('Example') { steps { echo 'Hello World' } } }
}
主要组成部分
- pipeline:整个流水线的根元素,包含流水线的全部逻辑。
- agent:指定流水线的执行节点(Jenkins agent)。可以是 any、none、label、node 或 docker。
- stages:包含多个 stage 的容器。
- stage:代表流水线的阶段,每个阶段必须有名称。
- steps:代表阶段中的一个或多个具体步骤(step)的容器。
- post:可选部分,包含整个 pipeline 或阶段完成后的一些附加步骤。根据完成状态分为 always、success、failure、unstable、changed、fixed、aborted 和 cleanup 等条件块。
常用指令
- environment:设置环境变量,可定义在 stage 或 pipeline 部分。
pipeline { agent any environment { CC = 'clang' } stages { stage('Example') { environment { AN_ACCESS_KEY = credentials('my-predefined-secret-text') } steps { sh 'printenv' sh 'echo ${CC}' } } }
}
- tools:定义自动安装并自动放入 PATH 里面的工具集合。
pipeline { agent any tools { maven 'apache-maven-3.0.1' } stages { stage('Example') { steps { sh 'mvn --version' } } }
}
- input:在 stage 部分使用,会暂停 pipeline,提示输入内容。
stage('Input Example') { input 'Should we continue?'
}
- options:配置 pipeline 本身的选项,如 timeout、retry、buildDiscarder、disableConcurrentBuilds 等。
pipeline { agent any options { timeout(time: 10, unit: 'SECONDS') buildDiscarder(logRotator(numToKeepStr: '2')) retry(5) } stages { stage('Example') { steps { echo 'Hello World' } } }
}
- parameters:定义 pipeline 的专有参数列表,支持 string、text、booleanParam、choice、password 等数据类型。
pipeline { agent any parameters { string(name: 'PERSON', defaultValue: 'Jenkins', description: '输入的文本参数') choice(name: 'CHOICE', choices: ['One', 'Two', 'Three'], description: 'Pick something') } stages { stage('Example') { steps { echo "Hello ${params.PERSON}" } } }
}
- triggers:定义 pipeline 的触发器,如 cron 和 pollSCM。
pipeline { agent any triggers { cron('H 4/* 0 0 1-5') } stages { stage('Example') { steps { echo 'Hello World' } } }
}
- parallel:声明式 Parallel 的代码块中可以嵌套多个 stage,从而让多个 stage 任务并行执行。
pipeline { agent any stages { stage('Parallel Example') { steps { script { def tasks = [:] tasks['Task 1'] = { echo 'Running Task 1' // 其他步骤 } tasks['Task 2'] = { echo 'Running Task 2' // 其他步骤 } parallel tasks } } } }
}
常用的内置步骤
文件目录相关步骤:deleteDir、dir、fileExists、pwd、writeFile、readFile。
制品相关步骤:stash、unstash。
命令相关步骤:sh。
其他步骤:error、tool、timeout、waitUntil、retry、sleep。
脚本式 Pipeline
node { stage('Build') { echo 'Building..' sh 'make' } stage('Test') { echo 'Testing..' sh 'make check' } stage('Deploy') { echo 'Deploying....' sh 'make publish' }
}
- 使用node作为根元素,表示Pipeline将在某个节点上执行。
- stage块是可选的,但在这里使用它可以清晰地展示Jenkins UI中的每个stage的任务子集。
- 每个stage中同样定义了要执行的步骤,但这里没有显式地指定steps块,因为步骤是直接写在stage块中的。
对比分析
声明式 Pipeline 以其简洁的语法结构和固定的组织要求,更适合小型项目或快速构建需求,且对无编程经验的用户友好;如果需要更复杂的逻辑,可以通过嵌套script块来实现。而脚本式 Pipeline 则基于Groovy 脚本,提供了更高的灵活性和几乎无限制的功能,适用于大型项目或需要复杂逻辑和高度定制化的场景,但要求用户具备一定的Groovy编程基础。
应用实例
网页部署
- Jenkins 首页 < New Item > 新建 < Pipeline >,并进行配置。

- 绑定 gerrit project,用于 gerrit 代码提交时触发 Pipeline 执行。

- 在部署 Pipeline 时,可以先直接在网页配置 Pipeline script 进行测试,等 Pipeline script 调试通过后再移植到代码仓库进行版本管理。

- 网页的 Pipeline script 调试通过后,可以将脚本内容复制到代码仓库 .jenkinsfile 文件上(比如我这里的 chirpstack.jenkinsfile),方便后续进行版本管理。


Pipeline script
下面是一个使用 docker 构建 yocto openstlinux 镜像的 pipeline script 实例,主要流程有:
- 指定 pipeline 使用的 docker 镜像环境。(agent)
- 拉取项目代码并检出到对应分支。(Checkout)
- 从 aws 私人仓库下载相关软件加速包(避免在编译过程中下载)。(Download)
- 配置编译环境,构建镜像。(Build)
- 将构建的镜像上传到 aws。(Upload)
- 构建成功时将镜像下载链接附属到网页。(post )
关于如何构建 openstlinux 编译环境的 docker 镜像(chirpstack-dev:latest),可以参考 Docker 基础入门
pipeline {agent {docker {label 'Embedded'image 'chirpstack-dev:latest'args '-v ${HOME}/.gitconfig:/home/ubuntu/.gitconfig -v ${HOME}/.ssh:/home/ubuntu/.ssh -v ${HOME}/.aws:/home/ubuntu/.aws'}}environment {JOB_PATH = "${env.WORKSPACE}/lorawan/yocto_ws"}stages {stage('Checkout') {steps {sh '''#!/bin/bashset -xewhoamimkdir -p "$JOB_PATH" && cd $JOB_PATHinit_and_update() {local max_retries=3local retries=0local success=falsewest init -m ssh://gerrit.robotics.cn:29419/iot_device/lorawan/gateway/cloud_walking_shoeswhile [ $retries -lt $max_retries ]; doretries=$((retries + 1))local result=$(west update 2>&1)local status=$?if echo "$result" | grep -q "ERROR"; thenecho "Attempt $retries failed to initialize job $JOB_PATH. Retrying..."elsesuccess=trueecho "Initialization and update completed successfully for job $JOB_PATH on attempt $retries."breakfisleep 3doneif [ $success = false ]; thenecho "Error initializing job $JOB_PATH after $max_retries attempts:"echo "$result"exit 1fi}init_and_update'''}}stage('Download') {steps {sh '''#!/bin/bashset -xeEXPECTED_MD5="04fca21f1061fd33a831ffc3660722b2"CACHE_DIR=$JOB_PATH/../buildmkdir -p "$CACHE_DIR"echo "Starting download process ..."aws s3 cp s3://embedded/yocto/chirpstack/download/downloads.zip $CACHE_DIR/if [ $? -ne 0 ]; thenecho "Error: Failed to download files from S3."exit 1fiecho "Download process completed successfully."# ACTUAL_MD5=$(md5sum "$CACHE_DIR/downloads.zip" | awk '{print $1}')# if [ "$ACTUAL_MD5" != "$EXPECTED_MD5" ]; then# echo "Error: MD5 checksum mismatch. Expected: $EXPECTED_MD5, Actual: $ACTUAL_MD5"# exit 1# fi# echo "Download process completed successfully and MD5 checksum verified."unzip -o $CACHE_DIR/downloads.zip -d $CACHE_DIRrm $CACHE_DIR/downloads.zip'''}}stage('Build') {steps {sh '''#!/bin/bashset -xecd ${JOB_PATH}/../source ${JOB_PATH}/poky/oe-init-build-envpwdsed -i 's/^MACHINE ??=.*/MACHINE ??= \"stm32mp15-loar-gateway\"/' conf/local.confsed -i 's/^DISTRO ?=.*/DISTRO=\"openstlinux-weston\"/' conf/local.confcat conf/local.conf | grep -E "MACHINE|DISTRO"bitbake-layers add-layer ../yocto_ws/meta-openembedded/meta-oebitbake-layers add-layer ../yocto_ws/meta-openembedded/meta-pythonbitbake-layers add-layer ../yocto_ws/meta-openembedded/meta-networkingbitbake-layers add-layer ../yocto_ws/meta-openembedded/meta-gnomebitbake-layers add-layer ../yocto_ws/meta-openembedded/meta-multimediabitbake-layers add-layer ../yocto_ws/meta-openembedded/meta-webserverbitbake-layers add-layer ../yocto_ws/meta-loar-gatewaybitbake-layers add-layer ../yocto_ws/meta-st-stm32mpbitbake-layers add-layer ../yocto_ws/meta-st-openstlinuxbitbake-layers add-layer ../yocto_ws/meta-st-stm32mpu-app-lorawancat conf/bblayers.confls -al $(pwd)/downloadsset +ebitbake_build() {local max_retries=3local retries=0local success=falsewhile [ $retries -lt $max_retries ]; doretries=$((retries + 1))bitbake st-image-westonif [ $? -ne 0 ]; thenecho "Attempt $retries failed to Bitbake build. Retrying..."elsesuccess=truebreakfisleep 3doneif [ $success = false ]; thenecho "Error failed to Bitbake build after $max_retries attempts:"exit 1fi}bitbake_build'''}}stage('Upload') {steps {sh '''set -xetar -czvf ${JOB_PATH}/stm32mp15-loar-gateway_${BUILD_NUMBER}.tar.gz ${JOB_PATH}/../build/tmp-glibc/deploy/images/stm32mp15-loar-gatewayaws s3 cp ${JOB_PATH}/stm32mp15-loar-gateway_${BUILD_NUMBER}.tar.gz s3://embedded/yocto/chirpstack/Artifacts/'''}}}post {success {archiveArtifacts artifacts: "lorawan/yocto_ws/stm32mp15-loar-gateway_${BUILD_NUMBER}.tar.gz", fingerprint: true}cleanup {cleanWs()}}
}
构建日志

Pipeline UI

相关文章:
Jenkins Pipeline 部署总结
Jenkins Pipeline 部署总结 前言 Jenkins Pipeline 是 Jenkins 提供的一套强大的工作流框架,它允许开发者以代码的形式定义整个软件交付过程,从而实现持续集成和持续部署(CI/CD)。通过 Pipeline,原本独立运行于单个或…...
HTTP的初步了解
目录 前言 一、HTTP协议的基本概念 1.1、请求格式 1.2、响应格式 二、HTTP链接问题 前言 提示:这里可以添加本文要记录的大概内容: HTTP协议是超文本传输协议 HTTP的短连接:建立连接——数据传输——关闭连接 HTTP的长连接:…...
SM单元 硬件
在硬件上,SM(Streaming Multiprocessor)指的是流式多处理器单元,它是GPU架构中非常重要的组成部分。SM可以看作是GPU的心脏,类似于CPU核心,负责执行并行计算任务。每个SM包含多个流处理器(cores…...
如何从CSV、JSON等格式创建DataFrame
在Spark中,你可以使用 SparkSession 从CSV和JSON等格式创建 DataFrame。以下是如何从这两种格式创建 DataFrame 的示例。 1. 从CSV文件创建DataFrame scala// 创建SparkSessionval spark SparkSession.builder().appName("CSV to DataFrame").getOrCrea…...
Java避坑案例 - 线程池错误的混用引发的性能故障分析
文章目录 问题现象问题分析问题修复线程池的混用策略任务类型与线程池配置最佳实践 问题现象 代码使用了线程池异步处理一些内存中的数据,但通过监控发现处理得非常慢,整个处理过程都是内存中的计算不涉及 IO 操作,也需要数秒的处理时间&…...
七种方法助你找到实用且免费的API服务
随着现代互联网的迅猛发展,API(应用程序编程接口)已成为推动技术创新的核心工具。API使得开发者能够快速实现复杂的功能,如数据分析、自然语言处理、图像识别等,而无需从头编写大量的代码。在这个开放的生态中…...
leetcode-74-搜索二维矩阵
题解: 遍历二维数组matrix中的每个list,如果target在list中则返回True(退出循环);如果全部遍历完还没有出现target则返回False。 核心就是在list中查找target! 代码实现:...
122.WEB渗透测试-信息收集-ARL(13)
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:121.WEB渗透测试-信息收集-ARL(12) 输入命令: docker…...
动态规划 —— 路径问题-下降路径最小和
1. 下降路径最小和 题目链接: 931. 下降路径最小和 - 力扣(LeetCode)https://leetcode.cn/problems/minimum-falling-path-sum/description/ 2. 算法原理 状态表示:以莫一个位置位置为结尾 dp[i,j]表示:到…...
【Linux网络】TCP_Socket
目录 TCP协议(传输控制协议) listen状态 accept和connect TCP_echo_server (1)创建套接字 (2)绑定 (3)设置listen状态 (4)loop (5)客户端 多线程远程…...
NVR批量管理软件/平台EasyNVR多个NVR同时管理支持视频投放在电视墙上
在当今智能化、数字化的时代,视频监控已经成为各行各业不可或缺的一部分,无论是公共安全、交通管理、企业监控还是智慧城市建设,都离不开高效、稳定的视频监控系统的支持。而在这些应用场景中,将监控视频实时投放到大屏幕电视墙上…...
Springboot集成阿里云通义千问(灵积模型)
我这里集成后,做成了一个工具jar包,如果有不同方式的,欢迎大家讨论,共同进步。 集成限制: 1、灵积模型有QPM(QPS)限制,每个模型不一样,需要根据每个模型适配 集成开发思路: 因有…...
微信公众号(或微信浏览器)获取openId(网页授权)
下单支付需要openId 首先授权去拿到code --然后调用后太换取openId 1.去拿取code 下图中执行到window.location.href ( redirect_uri 传入当前路径-)–执行后重新跳转到当前页面–但是路径上会带上code参数 //然后调用后台方法–将code传给后台得到 o…...
C++算法第五天
本篇文章继续和大家一起刷算法题 第一题 题目链接 . - 力扣(LeetCode) 题目解析 题目要求: 这是一个连续的子数组 计算子数组内元素的和,若数组内元素的和符合 > target的值并且该子数组的长度是最短的,则返回…...
牛客网剑指Offer-树篇-JZ26 树的子结构
题目 来源:JZ26 树的子结构 描述 输入两棵二叉树A,B,判断B是不是A的子结构。(我们约定空树不是任意一个树的子结构) 假如给定A为{8,8,7,9,2,#,#,#,#,4,7},B为{8,9,2},2个树的结构如下ÿ…...
FFmpeg 4.3 音视频-多路H265监控录放C++开发六,使用SDLVSQT显示yuv文件
使用QT 显示YUV 文件 在最后一帧的时候会不停的显示最后一帧图片。 Vsqtshowyuv.h #pragma once#include <QtWidgets/QWidget> #include "ui_vsqtshowyuv.h" #include <sdl/SDL.h> #include <iostream> #include <fstream> #include <Q…...
Spring 设计模式之适配器模式
Spring 设计模式之适配器模式 适配器模式用到的场景java举例 适配器模式 适配器模式(Adapter Pattern)是一种结构型设计模式,它允许接口不兼容的类一起工作。 其核心思想是通过一个适配器类将不兼容的接口转换成客户端期望的另一个接口&…...
多传感器数字化分析系统
在工业飞速发展的今天,设备的安全稳定运行成为企业高效生产的关键因素。然而,传统的人工巡检方式面临着诸多挑战,如效率低下、漏检误检以及难以精准掌握设备运行状态等。旗晟凭借深厚的技术积累和创新精神,推出了多传感器数字化分…...
Java 基础教学:面向对象编程基础-封装、继承与多态
面向对象编程(OOP)是现代编程的重要范式,Java 语言提供了丰富的 OOP 特性,主要包括封装、继承和多态。本文将详细讲解这三个概念及其实现方式,并提供相应的代码示例。 1. 封装 1.1 概念 封装是将对象的状态…...
Ubuntu环境本地部署DbGate数据库管理工具并实现无公网IP远程访问
文章目录 前言1. 安装Docker2. 使用Docker拉取DbGate镜像3. 创建并启动DbGate容器4. 本地连接测试5. 公网远程访问本地DbGate容器5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定公网地址远程访问 前言 本文主要介绍如何在Linux Ubuntu系统中使用Docker部署DbGate数…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
