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数…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决
问题: pgsql数据库通过备份数据库文件进行还原时,如果表中有自增序列,还原后可能会出现重复的序列,此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”,…...
