技术分享 | 跨平台API对接(Java)

news2024/11/22 16:49:32

本章介绍基于 Jenkins API 调用的跨平台 API 对接。

基于Jenkins实现跨平台API对接

Jenkins 提供了远程访问应用编程接口(Remote Access API),能够通过 Http 协议远程调用相关命令操作 Jenkins 进行 Jenkins 视图、任务、插件、构建信息、任务日志信息、统计信息等,非常容易与其配合更好的完成 CI/CD 工作。

Jenkins API 总共有三种格式,分别为:

  • XML API

可以使用 xml 方式进行 API 的使用,这种方式的优势在于可以使用强大的 xpath 特性进行相关的访问控制。如我们下文将要介绍的 Jenkins 客户端底层就是基于 XML API 实现的。

  • JSON API

使用 JSON 方式进行操作,因为 json 基本上已经是应用之间数据交换的准标准格式之一,这种方式比较方便 Javascript 或者和其他应用的集成。

  • Python API 可以通过 python-jenkins 库对 Jenkins 进行控制操作。此库对 Jenkins 的 API 进行了进一步的包装,使用起来更加方便,但是一般需要安装 python-jenkins,并通过 python 脚本的执行来达到集成的方式。

为什么基于Jenkins API对接

  • 频繁创建 Job 时,降低手工错误的概率

在工作中,如果需要创建的 Jenkins 的 Job 非常多,而大多又呈现有规律的方式时,Job 的创建成为了一个繁琐而又需要频繁操作的任务。在这种场景下,使用 API 结合脚本进行自动化可以提高效率,降低手工错误的几率。

  • 满足特定条件时自动触发 Jenkins

如果需要动态的创建 Jenkins Job ,如根据中间结果在某个触发点自动生成,再如生成的 Job 需要使用的参数也是动态运行阶段才能取到值的场景下。

  • 基于 Jenkins 自研产品或工具

如果产品或工具相关的功能,需要基于 Jenkins 进行研发,而且不希望用户直接使用 Jenkins,仅将 Jenkins 作为背后的执行引擎的场景,这种情况下也需要使用 Jenkins API 才能完成。

快速开始

下面我们通过实战学习下如何将 Spring Boot 和 Jenkins 进行集成,实现跨平台 API 对接。

Maven 依赖

<dependency>

    <groupId>com.offbytwo.jenkins</groupId>

    <artifactId>jenkins-client</artifactId>

    <version>0.3.8</version>

</dependency>

我们先引入 Jenkins-client 用于和 Jenkins 进行交互。而 Jenkins-client 的底层实现其实就是调用 Jenkins XML API 来完成操作 Jenkins 的,如下表部分示例所示。

操作HTTP动作APIjenkins-client 方法URI 使用示例
创建 JobPOST/createItemjenkinsServer.createJob()/createItem?name=Job 名称
起用 JobPOST/job/job 名称/enablejenkinsServer.enableJob()/job/job 名称/enable
禁用 JobPOST/job/job 名称/disablejenkinsServer.disableJob/job/job 名称/disable
删除 JobPOST/job/job 名称/doDeletejenkinsServer.deleteJob()/job/job 名称/doDelete
执行 JobPOST/job/job 名称/buildjob.build()/job/job 名称/build
停止执行中的 JobPOST/job/Job 名称/构建序号/stopbuild.Stop()/job/Job 名称/构建序号/stop

常用类和方法

  • JenkinsHttpClient:封装了调用 JenkinsAPI 的底层方法JenkinsHttpClient(URI uri, String username, String password)

操作 API 方法示例

方法名说明
get(String path)根据请求路径获取 Jenkins 的文本内容
getFile(URI path)根据请求路径获取 Jenkins 的文件内容
post(String path, boolean crumbFlag)根据请求路径向 Jenkins 发送 post 请求
getJenkinsVersion()获取 Jenkins 版本
post(String path, D data, Class cls, boolean crumbFlag)根据请求路径向 Jenkins 发送 post 请求数据
post_xml(String path, String xml_data, boolean crumbFlag)根据请求路径向 Jenkins 发送 post 请求 xml 数据
  • JenkinsServer:封装了调用 JenkinsAPI 的语义级别的方法,其本质调用的是 JenkinsHttpClient 类中的方法,只是根据操作 Jenkins 的功能进行了语义级别的封装JenkinsServer(JenkinsHttpConnection client)

操作 API 方法示例

方法名说明
isRunning()通过 ping 得到 Jenkins 端点的当前状态
getVersion()获取 Jenkins 的版本信息
getJobs()获取 Jenkins 服务器上所有已定义作业的列表(仅摘要信息)
getViews()获取 Jenkins 服务器上所有已定义视图的列表(仅摘要信息)
getView(String name)从 Jenkins 服务器获取单个视图对象
getJob(String jobName)从 Jenkins 服务器获取单个 Job
getJobXml(String jobName)获取现有 Job 的 xml 描述
createJob(String jobName, String jobXml, Boolean crumbFlag)使用提供的 xml 在服务器上创建 Job,且需要权限认证
updateJob(String jobName, String jobXml, boolean crumbFlag)更新现有 Job 的 xml 描述,且需要权限认证
createView(String viewName, String viewXml)使用提供的 xml 在服务器上创建一个视图
updateView(String viewName, String viewXml)更新 Jenkins 服务器现有视图的 xml 描述
createFolder(String folderName)在 Jenkins 服务器上创建一个文件夹(在根目录下)
getJobXml(String jobName)获取现有 Job 的 xml 描述
getLabel(String labelName)获取现有标签的描述
getComputers()获取 Jenkins 服务器上所有计算机的列表(仅摘要信息)
getPluginManager()获取 Jenkins 插件管理器的信息
deleteJob(String jobName, boolean crumbFlag)从 jenkins 删除一个 Job,且需要权限认证
disableJob(String jobName)从 jenkins 禁用一个 Job
enableJob(String jobName)从 jenkins 启用一个 Job
runScript(String script, boolean crumbFlag)在服务器上运行提供的 groovy 脚本并返回结果。这类似于使用脚本控制台运行 groovy 脚本。
方法名说明
renameJob(String oldJobName, String newJobName)重命名一个 Job
close()关闭底层资源。关闭的实例不应该再被使用,且关闭一个已经关闭的实例没有副作用
restart(Boolean crumbFlag)在不等待任何现有构建完成的情况下重新启动 Jenkins
safeRestart(Boolean crumbFlag)将 Jenkins 设置为安静模式,等待已存在的构建待完成,然后重新启动 Jenkins
exit(Boolean crumbFlag)在不等待任何现有构建完成的情况下关闭 Jenkins
safeExit(Boolean crumbFlag)让 Jenkins 进入安静模式,等待现有的构建完成,然后关闭 Jenkins
  • Job:Jenkins 中 job 对应的实体类,有很多实用的语义级别的方法,如构建等。

Job(String name, String url)

方法名说明
getName()获取 Job 名称
getUrl()获取 Job 地址
getFileFromWorkspace(String fileName)从工作区获取一个文件
build()触发一个没有参数的构建
build(boolean crumbFlag)触发一个没有参数的构建,需权限校验
build(Map params)仅使用字符串参数触发参数化构建
build(Map params, boolean crumbFlag)使用字符串参数触发参数化构建,需权限校验

如何获取创建(更新) Jenkins Job 的请求参数数据

  • 创建新 Job

image1080×508 61.2 KB

  • 进入 Job 配置

  • 将 Job/Job 名称/ Configure 改为 Job/Job 名称/ Config.xml 并回车

请求参数数据

  • 在 resources 目录下,jenkinsDir ,并添加 hogwarts_test_mini_start_test.xml 文件,此时我们为了测试命令可以正常被执行,需要在测试命令前加 eval 关键字,并将${testCommand}放在英文双引号括内部,如图中红框部分。
  • JenkinsUtil 示例代码
import com.offbytwo.jenkins.JenkinsServer;
import com.offbytwo.jenkins.client.JenkinsHttpClient;
import com.offbytwo.jenkins.model.Job;
import org.springframework.core.io.ClassPathResource;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;

/**

 * @Author tlibn

 * @Date 2020/8/11 15:21

 **/

public class JenkinsUtil {

    //调试使用

    public static void main(String[] args) throws IOException, URISyntaxException {

        build("hogwarts_test_mini_start_test_100","12","token","pwd");

    }

    public static void build(String jobName, String userId, String remark,String testCommand) throws IOException, URISyntaxException {

        System.out.println("========== 执行开始 ===========");

        // 1. 通过 ClassPathResource 获取 Jenkins 的 JenkinsJob 请求参数数据

        ClassPathResource classPathResource = new ClassPathResource("JenkinsConfigDir/hogwarts_jenkins_test_start.xml");

        InputStream inputStream = classPathResource.getInputStream();

        String jobConfigXml = FileUtil.getText(inputStream);

        // 2. 获取 Jenkins 信息

        String baseUrl = JenkinsInfo.baseUrl;

        String userName = JenkinsInfo.userName;

        String password = JenkinsInfo.password;

        // 3. 根据 Jenkins 信息创建 JenkinsHttpClient 对象

        JenkinsHttpClient jenkinsHttpClient = new JenkinsHttpClient(new URI(baseUrl),userName,password);

        // 4. 根据 Jenkins 客户端创建 JenkinsServer 对象

        JenkinsServer jenkinsServer = new JenkinsServer(jenkinsHttpClient);

        // 5. 创建 Job,如果Job已经存在,可以改为更新 Job 方法

        jenkinsServer.createJob(jobName,jobConfigXml,true);

        // 6. 获取 Jenkins 服务器中所有的 Job 信息

        Map<String, Job> jobMap = jenkinsServer.getJobs();

        // 7. 获取 Jenkins 服务器中我们创建的单个 Job 信息

        Job job = jobMap.get(jobName);

        // 8. 组装 Jenkins 服务器的构建参数

        Map<String,String> map = new HashMap<>();

        map.put("userId",userId);

        map.put("remark",remark);

        map.put("testCommand",testCommand);

        // 9. 构建 Jenkins Job

        job.build(map,true);

        System.out.println("========== 执行完毕 ===========");

    }

}
  • 创建新 Job 并构建成功

  • 构建参数页面查看参数数据

  • 构建日志页面查看 pwd 命令执行情况

image1080×338 69.9 KB

数据持久化技术就先讲到这里啦,下面留两个思考给大家,希望大家能用心练习一下哦~

  1. 尝试更新 Jenkins Job 配置信息,并在构建参数中新增用户名称字段
  2. 将 Jenkins API 调用和 Spring Boot 结合在一起,通过 postman 发送以下数据进行 Jenkins Job 的创建和更新操作
{

  "jobName": "hogwarts_test_mini_start_test_100",

  "testCommand": "pwd",

  "remark": "token",

  "userId": "12"

}

推荐学习

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

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

相关文章

vue3 安装使用scss

1、安装相关依赖 node-sass css-loader style-loader sass-loader 2、声明 lang"scss" 或者 scss文件中就可以直接使用 3、重点&#xff1a;安装依赖的过程中出现的各种问题 3.1、安装node-sass 报错 如果没有安装python,就去下个安装包装一下记得配置环境变量…

世界杯小吐槽

冷门 在看这次世界杯的时候&#xff0c;心里真的是一上一下&#xff0c;今年的冷门太多了&#xff01; 如&#xff1a; 阿根延 VS 沙特阿拉伯 阿根延输了&#xff08;我想可能是阿拉伯的战术比较新吧!&#xff09;那场比赛之后&#xff0c;阿拉伯还全国放假一天。到现在&#…

1.浮动 float

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 1.4什么是浮动 float属性用于创建浮动框&#xff0c;将其移动到右边&#xff0c;直到左边缘或右边缘触及包含块或另一个浮动框的边缘。 1、语法&#xff1a; <style> …

2023年pmp的考试时间是什么时候?

PMP 考试一年是有四次考试&#xff0c;分别是 3 月、6月、9月、12月&#xff0c;不出意外的话就是这几个月了&#xff0c;提前 2 个月开始报名&#xff0c;但还是要关注PMI/基金会官网的信息&#xff0c;以官网的消息为准。 一、报考条件 报考条件其实挺简单的&#xff0c;最核…

MFC 错误 error C2504: “CDialogEx”: 未定义基类-报错解决

错误&#xff1a; 在MFC文件中添加资源窗口&#xff0c;后添加新类&#xff0c;随后在.h头文件中出现 CDialogEx C class 未定义基类错误。 原因&#xff1a; 首先&#xff0c;下图这个framework.h非常关键&#xff0c;它在pch.h中也有定义&#xff0c;所以下图这个framework.h…

编译原理实验三

编译原理实验三 问题1: cpp与.ll的对应 请描述你的cpp代码片段和.ll的每个BasicBlock的对应关系。描述中请附上两者代码。 assign 对应的.ll代码如下&#xff1a; define i32 main() #0 {%1 alloca [10 x i32] ;int a[10]%2 getelementptr inbounds [10 x i32], [10 …

用“博弈论”看什么是高质量的代币设计?

在每个领域&#xff0c;都有国王&#xff0c;皇后&#xff0c;小兵和其他玩家。它们决定了该行业赖以生存的质量和标准。在同一领域&#xff0c;必然有赢家和输家。对于加密货币和代币经济来说&#xff0c;情况也是如此。本文的重点是代币经济的博弈论。它涉及游戏本身、谁在玩…

【大数据技术Hadoop+Spark】HDFS概念、架构、原理、优缺点讲解(超详细必看)

一、相关基本概念 文件系统。文件系统是操作系统提供的用于解决“如何在磁盘上组织文件”的一系列方法和数据结构。 分布式文件系统。分布式文件系统是指利用多台计算机协同作用解决单台计算机所不能解决的存储问题的文件系统。如单机负载高、数据不安全等问题。 HDFS。英文…

freeswitch的distributor模块

概述 freeswitch 是一款简单好用的VOIP开源软交换平台。 当呼叫是同一个入中继&#xff0c;但是有多条出中继时&#xff0c;需要对出中继做负载均衡&#xff0c;mod_distributor模块可以完成对应的配置和路由。 mod_distributor是一个轻量级的线路分发模块&#xff0c;配置简…

【Redis技术探索】「底层架构原理」探索分析服务核心数据结构介绍和案例

Redis常用存储类型 Redis底层提供了5种数据结构&#xff1a;字符串、哈希、列表、集合、有序集合 下图非常形象的表示了数据结构&#xff1a; 字符串String 常用命令 EX seconds&#xff1a;设置失效时长&#xff0c;单位秒PX milliseconds&#xff1a;设置失效时长&#x…

过滤器工厂详解

内置过滤器 1 AddRequestHeader GatewayFilter Factory 添加请求头 2 AddRequestParameter GatewayFilter Factory 3 AddResponseHeader GatewayFilter Factory 4 DedupeResponseHeader GatewayFilter Factory 5 Hystrix GatewayFilter Factory 6 FallbackHeaders GatewayFil…

答对这 9 题你就超越了 83.3% 的图数据库 NebulaGraph 用户

熟悉 NebulaGraph 社区的小伙伴可能都知道一个技能认证叫做&#xff1a;NGCP&#xff0c;全称 NebulaGraph Certified Professional。用户在考试认证期间在 1 个小时内回答 100 道题目&#xff0c;并获得 60 分&#xff0c;便是 NebulaGraph 认证过的 NGCP 用户。NGCP 用户除了…

二、Node.js 模块基础 1.0

模块、模块化 在讲Node.js当中的模块之前先来简单了解什么是模块、模块化、以及模块化编程的演变过程&#xff1b;模块通常指的是编程语言提供的代码组织机制&#xff0c;利用此机制可将程序拆解位独立且通用的代码单元&#xff0c;表意文绉绉&#xff0c;你可以理解为能够组装…

Docker+Jenkins+Gitlab+SpringBoot 自动化部署项目

我这边Docker、Jenkins、Gitlab 都已准备完毕&#xff0c;Jenkins和GItlab 都是用Docker起的 我们先进入Jenkins&#xff0c;插件什么的按他推荐的装就可以了&#xff0c;另外使用gitlab,还需要额外安装下面的插件 然后我们开始在Jenkins上创建项目 然后点保存&#xff0c;接下…

行业说 | 建筑业面临失宠,越来越留不住年轻人?原因在这

大家好&#xff0c;这里是建模助手。 不知道大家有没有发现&#xff0c;现在建筑行业存在着一种现象&#xff0c;就是&#xff1a;年轻人建筑行业“不想去”&“留不住”。 在这种情况下&#xff0c;行业的老龄化趋势便愈发明显&#xff0c;据数据显示&#xff1a; 2021年…

跬智信息(Kyligence)荣登「甲子20」中国数据智能领域最具商业潜力科技企业榜

近日&#xff0c;为表彰中国科技产业与数字经济领域的杰出贡献者&#xff0c;中国科技产业智库甲子光年在 2022「甲子引力」年终盛典上公布多项榜单。凭借在数据智能领域的核心技术优势与高成长性的商业价值表现&#xff0c;跬智信息&#xff08;Kyligence&#xff09;最终荣登…

【C++11】三大神器之——包装器和绑定器

前言 如果你还不知道 C 11 引入的包装器和绑定器是什么&#xff0c;可以读读这篇文章&#xff0c;看看有什么 启发&#xff1b;如果你已经对包装器和绑定器了如指掌&#xff0c;也可以读读这篇文章&#xff0c;看看有什么 补充。欢迎交流~&#x1f60f; 可调用对象 C中存在【…

PCB叠层当中的“假八层”是什么意思呢?

大家在进行PCB设计的时候都是需要对我们的板子选择叠层方案的&#xff0c;一个好的层叠方案能使我们的信号质量变好&#xff0c;板子性能也会更稳定等等&#xff0c;大家可能或多或少的接触过多层板&#xff0c;也就是两层往上的板子&#xff0c;那么大家在做六层板的时候是否有…

Servlet:狂神Response源码分析【文件下载 + 动态图形验证码 + 重定向】

目录web.xmlindex.jspRequestTestlogin测试FileServlet文件下载测试动态图形验证码Servlet动态图形验证码测试总结web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi&quo…

15-16-17 - 保护模式中的特权级

---- 整理自狄泰软件唐佐林老师课程 文章目录1. 保护模式小结1.1 使用选择子访问段描述符表时&#xff0c;索引值的合法性检测1.2 内存段类型合法性检测1.3 实例分析2. 问题一3. 保护模式中的特权级3.1 特权级的表现形式3.2 初探特权级3.2.1 CPL和DPL的关系3.2.2 段描述符中的D…