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

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

本章介绍基于 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动作 API jenkins-client 方法 URI 使用示例
创建 Job POST /createItem jenkinsServer.createJob() /createItem?name=Job 名称
起用 Job POST /job/job 名称/enable jenkinsServer.enableJob() /job/job 名称/enable
禁用 Job POST /job/job 名称/disable jenkinsServer.disableJob /job/job 名称/disable
删除 Job POST /job/job 名称/doDelete jenkinsServer.deleteJob() /job/job 名称/doDelete
执行 Job POST /job/job 名称/build job.build() /job/job 名称/build
停止执行中的 Job POST /job/Job 名称/构建序号/stop build.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


  • 进入 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 命令执行情况


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

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

更多技术文章

相关文章
|
3天前
|
数据采集 存储 Java
Java爬虫获取微店店铺所有商品API接口设计与实现
本文介绍如何使用Java设计并实现一个爬虫程序,以获取微店店铺的所有商品信息。通过HttpClient发送HTTP请求,Jsoup解析HTML页面,提取商品名称、价格、图片链接等数据,并将其存储到本地文件或数据库中。文中详细描述了爬虫的设计思路、代码实现及注意事项,包括反爬虫机制、数据合法性和性能优化。此方法可帮助商家了解竞争对手,为消费者提供更全面的商品比较。
|
7天前
|
缓存 Java 应用服务中间件
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
35 5
|
2月前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
2月前
|
算法 Java API
如何使用Java开发获得淘宝商品描述API接口?
本文详细介绍如何使用Java开发调用淘宝商品描述API接口,涵盖从注册淘宝开放平台账号、阅读平台规则、创建应用并申请接口权限,到安装开发工具、配置开发环境、获取访问令牌,以及具体的Java代码实现和注意事项。通过遵循这些步骤,开发者可以高效地获取商品详情、描述及图片等信息,为项目和业务增添价值。
121 10
|
2月前
|
Java API 开发者
Java中的Lambda表达式与Stream API的协同作用
在本文中,我们将探讨Java 8引入的Lambda表达式和Stream API如何改变我们处理集合和数组的方式。Lambda表达式提供了一种简洁的方法来表达代码块,而Stream API则允许我们对数据流进行高级操作,如过滤、映射和归约。通过结合使用这两种技术,我们可以以声明式的方式编写更简洁、更易于理解和维护的代码。本文将介绍Lambda表达式和Stream API的基本概念,并通过示例展示它们在实际项目中的应用。
|
3月前
|
安全 Java API
Java中的Lambda表达式与Stream API的高效结合####
探索Java编程中Lambda表达式与Stream API如何携手并进,提升数据处理效率,实现代码简洁性与功能性的双重飞跃。 ####
44 0
|
3月前
|
Java API Maven
商汤人像如何对接?Java代码如何写?
商汤人像如何对接?Java代码如何写?
103 5
|
3月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
133 2
|
3月前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
266 3
|
3月前
|
Java API 数据处理
探索Java中的Lambda表达式与Stream API
【10月更文挑战第22天】 在Java编程中,Lambda表达式和Stream API是两个强大的功能,它们极大地简化了代码的编写和提高了开发效率。本文将深入探讨这两个概念的基本用法、优势以及在实际项目中的应用案例,帮助读者更好地理解和运用这些现代Java特性。

热门文章

最新文章