Jenkins Pipeline 构建 CI/CD 流程

文章目录

    • jenkins 安装
    • jenkins 配置
    • jenkins 快速上手
      • 在 jenkins 中创建一个新的 Pipeline 作业
      • 配置Pipeline
      • 运行 Pipeline 作业
    • Pipeline
      • 概述
      • Declarative Pipeline
      • Scripted Pipeline


jenkins 安装

安装环境:

  • Linux CentOS 10:Linux CentOS9安装配置
  • Java 21:Java downloads
  • jenkins WAR 包:下载 Jenkins

官方给的下载方式很简单明了

在这里插入图片描述

此处博主的Jenkins 安装目录为:/home/fishpie/workspace/apps/

运行安装命令:

java -jar jenkins.war --httpPort=8080

在这里插入图片描述
如果遇到字体配置(Fontconfig)失败,可能是因为 linux 操作系统采用了最小化安装,缺失

  • fontconfig 包或相关字体
  • 缺少 libfontconfig 或其他图形依赖
SEVERE  hudson.util.BootFailure#publish: Failed to initialize Jenkins
java.lang.RuntimeException: Fontconfig head is null, check your fonts or fonts configuration

解决办法:

# 安装 fontconfig 和默认字体
sudo dnf install -y fontconfig dejavu-sans-fonts
# 安装图形相关依赖
sudo dnf install -y libX11 libXext libXrender libXtst libXi

另外如果出现 security 问题,需要注意系统时间是否正确

在这里插入图片描述
在这里插入图片描述

出现此页面证明Jenkins 安装完成,此时访问本机的 8080 端口即可访问 Jenkins

例如我本地装了 Jenkins 的机器:

http://192.168.156.129:8080/

在这里插入图片描述


jenkins 配置

密码登录进入后建议选择 安装推荐的插件

在这里插入图片描述

在这里插入图片描述

如果遇到插件安装错误可以多次尝试安装,可在
Manage Jenkins -> Plugins -> Download progress
中找到 安装完成后重启Jenkins 选项并勾选

正常的 jenkins 界面

在这里插入图片描述


jenkins 快速上手

前置环境:

  1. git
  2. docker
  3. 更新 OpenSSL 和 SSL 证书
# 安装或更新 OpenSSL
sudo dnf install -y openssl
# 更新 CA 证书
sudo dnf install -y ca-certificates
sudo update-ca-trust
  1. 安装 jenkins 的 docker pipline 插件

采用 github 项目 https://github.com/yeasy/simple-web 演示使用jenkins 构建和部署一个项目的完整过程

在 jenkins 中创建一个新的 Pipeline 作业

  1. 登录到你的 Jenkins 控制台。
  2. 在左侧菜单中点击 New Item(新建项目)。
  3. 输入作业名称,例如 SimpleWebPipeline。
  4. 选择 Pipeline(流水线)作为项目类型,然后点击 OK。

在这里插入图片描述
在这里插入图片描述


配置Pipeline

  1. 在作业配置页面,向下滚动到 Pipeline(流水线)部分。
  2. 在 Definition(定义)下拉菜单中,选择 Pipeline script(流水线脚本)。
  3. 在 Script(脚本)文本框中,粘贴以下 Jenkinsfile 代码:
pipeline {agent anystages {stage('Checkout') {steps {git 'https://github.com/yeasy/simple-web.git'}}stage('Build') {steps {script {// 验证 Docker 环境sh 'docker version'// 构建 Docker 镜像def image = docker.build("simple-web:latest")}}}stage('Deploy') {steps {script {// 停止并删除已存在的容器sh 'docker rm -f simple-web || true'// 运行新容器docker.image("simple-web:latest").run("-d -p 8081:80 --name simple-web")}}}}
}
  1. 点击 Save(保存)以保存作业配置。

在这里插入图片描述


运行 Pipeline 作业

  1. 在作业页面,点击 Build Now(立即构建)以启动流水线。
  2. 通过点击 Build History(构建历史)下的构建编号并选择 Console Output(控制台输出),监控构建过程。你将看到每个阶段(Checkout、Build、Deploy)的执行情况。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如果构建成功,则可在本机看到构建成功的镜像与进程

在这里插入图片描述

访问本机的 8081 端口可以正常看到网页

在这里插入图片描述


Pipeline

概述

Jenkins Pipeline(或简称为 “Pipeline”)是一套插件,将持续交付的实现和实施集成到 Jenkins 中

Jenkins Pipeline 有两种主要语法:

  • Declarative Pipeline:结构化、易读,适合大多数场景,推荐初学者使用。

  • Scripted Pipeline:基于 Groovy 语言,灵活但复杂,


Declarative Pipeline

固定结构,主要由 pipeline 块构成,包含以下核心部分:

  • agent:定义执行 Pipeline 的环境。
  • stages:定义一系列构建阶段。
  • steps:每个阶段的具体操作。
  • post:构建后的处理逻辑。

pipeline 块

  • 作用:pipeline 的根节点,包含整个流水线的定义
  • 要求:所有的 Declarative Pipeline 必须以 pipeline {} 开始
  • 示例:
pipeline {// 流水线内容
}

agent 指令

  • 作用:指定 pipeline或特定阶段运行的执行环境(节点或容器)
  • 常用选项:
    • any:可在任何节点上运行(默认)
    • none :不指定全局代理,需要在每个 stage 中定义
    • docker :在 Docker 容器中运行
    • label :在带有特定标签的节点上运行
  • 示例:
// 表示 pipeline 在 jenkins 主节点或任意代理节点上运行
pipeline {agent any
}
//使用 Docker 容器运行
pipeline {agent {docker {image 'maven:3.6.3-jdk-11'args '-v /root/.m2:/root/.m2'}}
}
//在 Maven 容器中运行,挂载本地 Maven 缓存

stages 和 stage

  • 作用:
    • stages :包含所有阶段的集合
    • stage :定义单个阶段(如拉取代码、构建、部署)

可以把“步骤(step)”看作一个执行单一动作的单一的命令。 当一个步骤运行成功时继续运行下一个步骤。 当任何一个步骤执行失败时,Pipeline 的执行结果也为失败

当所有的步骤都执行完成并且为成功时,Pipeline 的执行结果为成功

  • 结构:
stages {stage('Stage Name') {steps {// 操作}}
}
  • 示例:
pipeline {agent anystages {stage('Checkout') {steps {git 'https://github.com/yeasy/simple-web.git'}}stage('Build') {steps {script {// 验证 Docker 环境sh 'docker version'// 构建 Docker 镜像def image = docker.build("simple-web:latest")}}}stage('Deploy') {steps {script {// 停止并删除已存在的容器sh 'docker rm -f simple-web || true'// 运行新容器docker.image("simple-web:latest").run("-d -p 8081:80 --name simple-web")}}}}
}
  • Checkout:从 github 克隆代码
  • Build:构建 Docker 镜像
  • Deploy:运行 Docker 容器

每个 stage 是一个逻辑单元,失败后会阻止后续阶段执行

阶段名称(如 Checkout)会显示在 Jenkins 的 Pipeline 视图中

节点名称可以自定义


steps 指令

  • 作用:定义阶段内的具体操作(如执行命令、调用插件)

  • 常用步骤:

    • sh :执行 Linux、BSD 和 Mac OS(类 Unix ) 系统中的 shell 命令
    • bat :执行 Windows 批处理命令
    • git :拉取 Git 仓库代码
    • docker :调用 Docker 命令(需要 Docker Pipeline 插件)
    • archiveArtifacts :归档构建产物

    如果在 archiveArtifacts 步骤中指定了多个参数, 那么每个参数的名称必须在步骤代码中明确指定, 即文件的路径、文件名和 fingerprint 三个参数。 如果只需指定文件的路径和文件名, 那么可以省略参数名称 artifacts ,例如: archiveArtifacts 'build/libs/**/*.jar'

    • junit :发布测试报告
  • 示例:

// 拉取指定 Git 仓库
steps {git 'https://github.com/yeasy/simple-web.git'
}
pipeline {agent anystages {stage('Build') {steps {sh './gradlew build'}}stage('Test') {steps {sh './gradlew check'}}}post {always {archiveArtifacts artifacts: 'build/libs/**/*.jar', fingerprint: truejunit 'build/reports/**/*.xml'}}
}

script 块

  • 作用:允许在 Declarative Pipeline 中嵌入 Scripted Pipeline 的 Groovy 代码,用于复杂逻辑
// 检查 docker 环境并构建镜像,负载操作采用 script 块包裹
steps {script {sh 'docker version'def image = docker.build("simple-web:latest")}
}

post 指令

  • 作用:钩子函数,定义构建完成后执行的操作,基于构建结果触发

  • 常用条件:

    • always :无论成功或失败都执行
    • success :构建成功时执行
    • failure :构建失败时执行
    • unstable:构建不稳定时执行(如测试失败)
  • 示例:

// 如果构建成功则打包为 jar 包,否则发送指定邮件提醒
post {always {echo 'Pipeline finished!'}success {archiveArtifacts artifacts: '**/target/*.jar', allowEmptyArchive: true}failure {mail to: 'admin@example.com', subject: 'Build Failed', body: 'Check Jenkins for details.'}
}
pipeline {agent anystages {stage('No-op') {steps {sh 'ls'}}}post {always {echo 'One way or another, I have finished'deleteDir() /* clean up our workspace */}success {echo 'I succeeeded!'}unstable {echo 'I am unstable :/'}failure {echo 'I failed :('}changed {echo 'Things were different before...'}}
}

tools 指令

  • 作用:指定构建所需的工具版本(如 JDK、Maven),从 jenkins 全局工具配置中加载
  • 示例:
自动配置 Maven 和 JDK 环境
tools {maven 'Maven 3.6.3'jdk 'JDK 21'
}

需要在 Manage Jenkins > Tool 中预先配置工具

在这里插入图片描述


environment 指令

  • 作用:定义环境变量
  • 示例:
// 创建环境变量,相当于 Java 中的定义字符串
environment {DOCKER_IMAGE = 'simple-web:latest'APP_PORT = '8081'
}
// 引用上面的环境变量
sh "docker run -p ${APP_PORT}:80 ${DOCKER_IMAGE}"

同时,我们可以将 simple-web 的 pipeline 部分优化为:

environment {IMAGE_NAME = 'simple-web:latest'
}
stages {stage('Build') {steps {script {docker.build("${IMAGE_NAME}")}}}
}

when 指令

Java 语言的本性

  • 作用:控制阶段是否执行,基于条件判断
  • 示例:
stage('Deploy') {when {branch 'main'}steps {// 仅在 main 分支上部署}
}
  • 常用条件
    • branch :指定分支
    • environment:检查环境变量
    • expression :自定义 Groovy 表达式

try-catch

  • 作用:捕获并处理阶段失败,异常处理
  • 示例:
steps {script {try {sh 'make test'} catch (Exception e) {echo "Tests failed: ${e}"currentBuild.result = 'UNSTABLE'}}
}
// 执行 make test 命令,如果未能正常执行,则回显异常并设置当前构建结果为 UNSTABLE

retry-timeout

  • 作用:重复执行步骤直到成功(重试)和如果一个步骤执行花费的时间太长则退出
stage('Deploy') {steps {retry(3) {sh './flakey-deploy.sh'}timeout(time: 3, unit: 'MINUTES') {sh './health-check.sh'}}
}
// 在 Deploy 阶段重复执行 flakey-deploy.sh 脚本 3 次,然后等待 health-check.sh 脚本最长执行 3 分钟,如果 health-check.sh 超过 3 分钟内没有完成,pipeline 会标记此 Deploy 阶段为失败

Scripted Pipeline

Scripted Pipeline 是 Jenkins Pipeline 的另一种语法,基于 Groovy 语言,结构更自由但复杂

核心特点:

  • 使用 node 块定义执行环境
  • 直接编写 Groovy 代码,没有固定的 stages 或 steps 结构
  • 适合需要高度自定义的场景。

可以将上述的 jenkins 快速上手 中的 Declarative Pipeline 改写为 Scripted Pipeline

node {stage('Checkout') {git 'https://github.com/yeasy/simple-web.git'}stage('Build') {def image = docker.build("simple-web:latest")}stage('Deploy') {sh 'docker rm -f simple-web || true'docker.image("simple-web:latest").run("-d -p 8081:80 --name simple-web")}
}

Declarative Pipeline 与 Scripted Pipeline 的区别

特性Declarative PipelineScripted Pipeline
语法结构化,固定格式自由,基于 Groovy
易用性简单,适合初学者复杂,需熟悉 Groovy
可读性高,清晰的阶段划分较低,代码风格自由
灵活性有限,需用 script 块扩展高,完全自定义
错误处理内置错误检查需手动处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/diannao/80456.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【CF】Day43——Codeforces Round 906 (Div. 2) E1

E1. Doremys Drying Plan (Easy Version) 题目: 思路: very好题,加深对扫描线的应用,值得深思 由于k 2,那我们就可以使用简单一点的方法来写 题目可以转化为:给定n个线段,现在让你删去2条线段…

电子设备的“记忆大脑”:NAND、NOR、EEPROM谁在掌控你的数据?

大家好,我是硅言。存储芯片是电子设备的“记忆大脑”,未进入存储行业工作之前,一听到NAND、NOR、EEPROM这些专业名词就头大。本文用通俗的语言,带大家了解这三种常见存储芯片的核心区别和应用场景。 一、存储芯片的“门派”&#…

可视化程序设计|| 实验三:C#面向对象编程(二)

一、实验目的 1.加深理解面向对象编程的概念,如类、对象、实例化等。 2.熟练掌握类的封装、继承和多态机制。 3.掌握编程常用的几种排序算法。 4.理解异常的产生过程和异常处理的概念,掌握C#异常处理的方法。 5.能够将面向对象思想应用与编程实践&a…

STM32MPU开发之旅:从零开始构建嵌入式Linux镜像

前言 在工业4.0与边缘计算深度融合的今天,STM32MP257F作为意法半导体第二代工业级64位微处理器的旗舰产品,凭借异构计算架构、1.35 TOPS边缘AI算力和军工级安全特性,已成为工业自动化、机器视觉和新能源控制等领域的标杆方案。 性能跃迁的异…

大模型应用开发(PAFR)

Prompt问答 特征:利用大模型推理能力完成应用的核心功能 应用场景: 文本摘要分析 舆情分析 坐席检查 AI对话 AgentFunction Calling 特征:将应用端业务能力与AI大模型推理能力结合,简化复杂业务功能开发 应用场景: 旅行指南 数据…

SpringClound 微服务分布式Nacos学习笔记

一、基本概述 在实际项目中,选择哪种架构需要根据具体的需求、团队能力和技术栈等因素综合考虑。 单体架构(Monolithic Architecture) 单体架构是一种传统的软件架构风格,将整个应用程序构建为一个单一的、不可分割的单元。在这…

WebRTC服务器Coturn服务器用户管理和安全性

1、概述 Coturn服务器对用户管理和安全方面也做了很多的措施,以下会介绍到用户方面的设置 1.1、相关术语 1.1.1 realm 在 coturn 服务器中,域(realm)是一种逻辑上的分组概念,用于对不同的用户群体、应用或者服务进行区…

基于opencv和PaddleOCR识别身份证信息

1、安装组件 pip install --upgrade paddlepaddle paddleocr 2、完整code import cv2 import numpy as np from paddleocr import PaddleOCR# 初始化 PaddleOCR use_angle_clsTrue, lang"ch", det_db_thresh0.1, det_db_box_thresh0.5)def preprocess_image(image…

【6】GD32 高级通信外设 CAN、USBD

高级通信外设:CAN、USBD CAN CAN简介、主要功能与相关API回环模式收发发送特定ID的数据帧实验CAN数据帧的接收实验使用过滤器接收特定的数据帧 USBD USB通信简介USBD设备固件库架构、分层文件与库函数说明USBD模拟键盘应用USBD虚拟串口应用USBD模拟U盘应用

【LLM+Code】Windsurf Agent 模式PromptTools详细解读

一、前言 https://windsurf.com/ https://windsurf.com/blog/why-we-built-windsurf https://github.com/x1xhlol/system-prompts-and-models-of-ai-tools/tree/main/Windsurf 二、System Prompt 相比于cursor和claude code, windsurf的system prompt非常长&am…

安全性测试常规测试点全解析:从基础到高级的实战指南

引言 安全性测试是保障软件系统免受恶意攻击的核心环节,其目标是识别系统在设计、开发、部署过程中存在的安全漏洞。本文将围绕12大常规安全测试点展开,结合具体测试方法、示例代码及防范建议,帮助读者构建完整的安全测试体系。 一、认证与授权测试 1. 认证机制测试 测试…

OpenCV 图形API(55)颜色空间转换-----将图像从 RGB 色彩空间转换为 I420 格式函数RGB2I420()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 将图像从 RGB 色彩空间转换为 I420 色彩空间。 该函数将输入图像从 RGB 色彩空间转换为 I420。R、G 和 B 通道值的常规范围是 0 到 255。 输出图…

Pycharm(十六)面向对象进阶

一、继承 概述: 实际开发中,我们发现很多类中的步分内容是相似的,或者相同的,每次写很麻烦,针对这种情况, 我们可以把这些相似(相同的)部分抽取出来,单独地放到1个类中&…

Codeforces Round 1020 (Div. 3)(题解ABCDEF)

A. Dr. TC 有n次翻转,从1到n,0->1,1->0,每次统计1的数量,设cnt1是字符串1的数量,n次就是n*cnt1, 但每个1都会被翻转一次减去一个cnt1,再统计cnt0,每个被翻转一次,答案就是(n-1)*cnt1cnt0…

HTML字符实体和转义字符串

HTML字符实体和转义字符串用于处理特殊字符,确保它们在不同上下文中正确显示或解析。以下是详细总结: HTML字符实体(Character Entities) ‌定义‌:用于在HTML中表示保留字符或不可见字符,避免与HTML语法…

FreeRTOS菜鸟入门(六)·移植FreeRTOS到STM32

目录 1. 获取裸机工程模版 2. 下载 FreeRTOS V9.0.0 源码 3. FreeRTOS文件夹内容简介 3.1 FreeRTOS文件夹 3.1.1 Demo文件夹 3.1.2 License 文件夹 3.1.3 Source 文件夹 3.2 FreeRTOS-Plus 文件夹 4. 往裸机工程添加 FreeRTOS 源码 5. 拷贝 FreeRTOSConfig…

通过 Tailwind CSS 自定义样式 实现深色模式切换

创建vite项目或者vue-cli配置大同小异 1、当前环境 Vue.js 3.5nuxtjs/tailwindcss 6.13.1nuxt3.15.4node18 这里主要依赖是tailwindcss 因为当前项目是使用nuxt开发。 2、配置颜色模式 在assets/css下创建main.css * {padding: 0;margin: 0;box-sizing: border-box; }[dat…

PWNOS:2.0(vulnhub靶机)

文章目录 靶机地址主机发现、端口扫描web渗透目录探测漏洞利用权限提升 解密工具地址总结 靶机地址 https://download.vulnhub.com/pwnos/pWnOS_v2.0.7z 这里如果是windows系统直接使用vmware或者virtubox打开可以使用,如果是mac系统需再去做一个配置,比较麻烦 这里…

Gartner魔力象限(Gartner Magic Quadrant)

Gartner魔力象限(Gartner Magic Quadrant)是由全球领先的研究和咨询公司Gartner发布的市场研究报告,广泛应用于IT行业,尤其是在技术供应商评估中。它以图形化的方式展示了不同技术领域中各个供应商的市场表现,帮助企业…

信创时代开发工具选择指南:国产替代背景下的技术生态与实践路径

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开…