CI流水线中Jenkins应用实践丨IDCF

news2024/11/26 17:44:56

作者:达日汗,中国农业银行研发中心,系统支持部 

CI (Continuous Integration)在维基百科中的定义是:经常将几个小改动合并到一个主分支中,强调开发人员提交了新代码之后,立刻进行构建和(单元)测试。持续集成可以帮助开发人员尽早定位到错误,控制开发流程,减少大量不必要的工作,提高工作效率。一个好的持续集成和持续部署管道(CI/CD)可以使项目开发事半功倍。下面介绍一种使用Jenkins搭建持续集成流水线的方法。

Jenkins简介

Jenkins 是一个起源于Hudson(Hudson是商用的),使用 java 语言开发的开源持续集成工具,使软件项目可以进行持续集成,并且可以跨平台部署在 Windows、Linux和MacOS 等多种环境。经过十多年的发展 Jenkins 生态环境已经十分完善,大量插件的存在使得 Jenkins可以适应多种业务场景,是多数企业完成持续集成、持续部署等相关技术实践的首选。Jenkins 有如下几个特点:

  • 开源免费且多平台支持。

  • 安装配置简单。

    从官网下载Jenkins执行文件后,直接运行,无需额外的安装,更无需安装数据库并且 提供友好的GUI配置界面,浏览器访问即可完成配置;

  • 插件资源丰富。

    除了官方插件外,Jenkins 支持第三方插件,这使得Jenkins 功能变得越来越大能够满足多种场景下的需求。

  • 主从分布式架构。

    主节点可只提供调度功能,增加从节点即可提高任务处理能力,扩展简便。

流水线运行流程

如下图所示,我们通过在前端页面编排好流水线,将其以描述文件的形式发送给后端Jenkins调度模块,描述文件包含了流水线内多个任务包括代码下载、代码构建和制品上传等。

调度模块将其转化成Jenkins任务配置文件并发送给Jenkins的Master节点完成任务的生成。最后Master节点将任务分发到Slave节点执行完成一次流水线的运行。

Jenkins支持通过网页端进行各类操作,但是实际应用中需要和项目前端对接,并且Jenkins的API接口比较完善,所以通过API接口的方式对Jenkins进行了调用。

图片

图一

流水线任务转化

 

首先我们需要将前端编排的任务转化为Jenkins流水线任务。下图所示为通过页面生成Jenkins流水线任务,任务以Groovy脚本形式创建。Jenkins pipeline是基于Groovy语言实现的DSL,用于描述流水线如何进行,包括编译、打包、部署、测试等等步骤。其中一些基本概念如下:

  • pipeline: 代表整条流水线,包含整条流水线的逻辑。

  • agent部分:

    指定流水线的执行位置(如:

    物理机、虚拟机、Docker容器等)。

  • stage:

    阶段,代表流水线的阶段,每个阶段都必须有名称,本例中,build就是此阶段的名称。

  • stages:

    流水线中的多个stage的容器,stages部分至少包含一个stage。

  • steps部分:

    代表阶段中的一个或多个具体步骤(step)的容器。

    steps部分至少包含一个步骤,下图中echo就是一个步骤,在一个stage中有且只有一个steps。

图片

图二

在Jenkins中每个任务都有其配置文件(config.xml),如图三所示,存放在Jenkins的主目录下Jobs文件夹内。我们找到一个配置文件打开之后可以发现在

图片

图三

流水线任务执行

在上一阶段我们已经通过转换流水线描述文件生成了Jenkins 任务的配置文件,下一步将通过Jenkins API完成任务的创建和执行。Jenkins的API大致可以分为站点、节点和任务构建三部分,如下图所示。

图片

图四

在节点层面:

Jenkins可以提供节点信息的查询、系统的负载统计、节点的上下线、重启和任务创建等接口。我们项目中主要涉及到任务的创建,通过http:///createItem 接口配合配置文件和任务名称完成任务的创建。

在任务层面:

Jenkins可以提供执行任务、修改任务、启用任务、禁用任务、删除任务等接口。我们主要关注任务的启动与删除,任务创建成功后通过该接口启动任务,http:///job//build,其中Job-Name需要替换为上一步生成任务时的名字。通过http:///job//doDelete接口可以实现任务的删除,这通常在任务成功执行所有步骤后触发。

在构建层面:

Jenkins可以提共构建信息获取的接口。我们通过http:///job//BuildID/logText/progressiveText 完成日志查询。同时如果想要获取流水线任务每一阶段的状态可以通过http:///job//BuildID/wfapi/describe接口进行查询。(注:该接口非Jenkins原生,是pipeline stage view插件附带的接口)

在实际的应用过程中既可以通过原生API对Jenkins进行操作也可以通过第三方库完成功能实现。

Jenkins 部署方法

 

Jenkins性能问题依然是不可忽视的一点,单个Master节点 job数量达到一定程度时会开始出现延迟的情况,同时Slave节点的数量也需要进行控制,如果过多会出现大量Slave连接在构建过程中中断的情况,甚至可能会出现Slave连接丢失的情况。

在官方文档中推荐:Master节点每一个处理器核心对应500个任务,每500个任务对应15个executor(约等于一个CPU核心的Slave节点15台)在实际部署过程中我们根据CI流水线需求的不同预先将Master节点拆分为多个,根据不同的需求在调度模块将任务分流,以避免单个Master节点在高负载环境下出现性能问题。

图片

图五

至此我们通过Jenkins完成了CI流水线的建设。Jenkins功能十分丰富,其应用场景有待进一步研究与挖掘。

 

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

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

相关文章

大数据学习05-Kafka分布式集群部署

系统环境:centos7 软件版本:jdk1.8、zookeeper3.4.8、hadoop2.8.5 本次实验使用版本 kafka_2.12-3.0.0 一、安装 Kafka官网 将安装包上传至linux服务器上 解压 tar -zxvf kafka_2.12-3.0.0.tgz -C /home/local/移动目录至kafka mv kafka_2.12-3.0…

十二.Redis模拟集群搭建

配置环境 查看环境信息 127.0.0.1:6379> info replication #查看当前redis的信息 # Replication role:master #角色 master主机 connected_slaves:0 #从机数量为0 master_failover_state:no-failover master_replid:115f37a0ec195680ef754d6915738b0c0a05f450 master_replid…

学习UE的FArchive的最基础功能

目标 尝试FArchive的最基础功能。代码参考这里。 0. FArchive是什么? 源代码里FArchive的注释如下: Base class for archives that can be used for loading, saving, and garbage collecting in a byte order neutral way 它是 archive 的基类。&am…

【高并发基础】基本锁算法及原理

系列综述: 💞目的:本系列是个人整理为了秋招面试的,整理期间苛求每个知识点,平衡理解简易度与深入程度。 🥰来源:材料主要源于多处理器编程的艺术进行的,每个知识点的修正和深入主要…

elasticsearch操作(命令方式)

说明:elasticsearch是目前最流行的搜索引擎,功能强大,非常受欢迎。特点是倒排索引,在海量数据的模糊查找领域,效率非常高。elasticsearch的安装和使用参考:http://t.csdn.cn/yJdZb。 本文介绍在es的索引库…

Blender自动化脚本,无人值守批量渲图/渲视频

渲染视频是个非常耗时的大工程,如果要渲染多个视频或者每个视频还需要切换不同的贴图、颜色等,工作量就更离谱了,所以不得不用脚本实现自动化。 Blender的脚本是用Python编写,比PS的js要方便很多。再下载一套Blender对应版本的AP…

十分钟掌握 Vim 编辑器核心功能

十分钟掌握 Vim 编辑器核心功能 文章目录 十分钟掌握 Vim 编辑器核心功能👨‍🏫内容一:前言【Vim是什么】👨‍🔬内容二:Vim 常用模式👨‍🚀内容三:基本操作👨…

三十二章:Progressive Semantic Segmentation ——渐进式语义分割

0.摘要 这项工作的目标是在不过载GPU内存使用或丢失输出分割图中的细节的情况下对高分辨率图像进行分割。内存限制意味着我们必须对大图像进行降采样,或者将图像分为局部补丁进行分离处理。然而,前一种方法会丢失细节,而后一种方法由于缺乏全…

前端学习——Vue (Day1)

Vue 快速上手 Vue 是什么 创建 Vue 实例 Vue2官网&#xff1a;https://v2.cn.vuejs.org/ <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge…

Nexus3部署、配置+SpringBoot项目Demo

Docker部署Nexus 搜索Nexus3镜像&#xff1a;[rootlocalhost ~]# docker search nexus 拉取Nexus3镜像&#xff1a;[rootlocalhost ~]# docker pull sonatype/nexus3 启动Nexus3前查看虚拟机端口是否被占用&#xff1a;[rootlocalhost ~]# netstat -nultp 通过Docker Hub查看安…

MySQL——备份恢复

数据库备份&#xff0c;数据库为school&#xff0c;素材如下 1.创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address …

【unity3D】水平方向上UI自动排列整齐(Horizontal Layout Group组件)

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于游戏开发的学习笔记 &#x1f236;本篇是unity的Horizontal Layout Group Horizontal Layout Group 属性介绍属性详解使用以及效果展示补充 属性介绍 属性功能padding布局组边缘…

C语言——qsort函数的使用(详解)

qsort函数详解 前言&#xff1a;一、qsort函数的含义1.1 函数的参数1.2 参数的含义 二、用不同类型数据&#xff0c;测试sqort2.1 对数组内整数进行排序2.2对数组内浮点数进行排序2.3对字符串进行排序2.4对结构体进行排序 三、模拟实现qsort函数 前言&#xff1a; qsort&#…

RK3588平台开发系列讲解(Camera篇)V4L2 接口查询设备能力

文章目录 一、查询设备的基本信息二、查询设备支持的视频格式三、查询支持分辨率四、查询支持的帧率范围沉淀、分享、成长,让自己和他人都能有所收获!😄 📢在使用 V4L2 进行视频采集前,需要先通过查询设备能力来获取设备可以提供的视频格式、分辨率等信息。 一、查询设…

springboot 配置Knife4j- Swagger3.0

一、导入maven包 <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.2</version></dependency> 二、配置config-swagger工具 package com.exceltotxt.…

MySQL连接查询与存储过程

一、连接查询1.1 内连接1.2 左连接1.3 右连接 二、存储过程2.1 概述2.2 简介2.3 优点2.4 语法2.5 举例2.5.1 创建存储过程2.5.2 调用存储过程2.5.3 查看存储过程2.5.4 存储过程的参数2.5.5 修改存储过程2.5.6 删除存储过程 三、总结 一、连接查询 MySQL 的连接查询&#xff0c…

Java集合是Set

HashSet集合 HashSet集合的特点 HashSet常用方法 ①&#xff1a;add(Object o)&#xff1a;向Set集合中添加元素&#xff0c;不允许添加重复数据。 ②&#xff1a;size()&#xff1a;返回Set集合中的元素个数 public class Test {public static void main(String[] args) {…

LeetCode107. 二叉树的层序遍历 II

107. 二叉树的层序遍历 II 文章目录 [107. 二叉树的层序遍历 II](https://leetcode.cn/problems/binary-tree-level-order-traversal-ii/)一、题目二、题解方法一&#xff1a;正常层序遍历翻转数组 一、题目 给你二叉树的根节点 root &#xff0c;返回其节点值 自底向上的层序…

HTTP Header定制,客户端使用Request,服务器端使用Response

在服务器端通过request.getHeaders()是无效的&#xff0c;只能使用response.getHeaders()。 Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType mediaType,Class selectedConverterType, ServerHttpRequest request, ServerHttpRespo…

前端将css.html.js打包到一起在手机打开

过程我是按照下面的执行的&#xff0c;大家可以直接参考这个博客里的过程&#xff0c;下面我记录一下遇到的一些问题&#xff0c;我的电脑是mac 打包教程 1.执行命令npm install electron 在安装Electron时报错command sh -c node install.js 在指令后面添加 --ignore-scripts…