写点什么

软件测试 | 跨平台 API 对接

  • 2023-03-03
    北京
  • 本文字数:2509 字

    阅读完需:约 8 分钟

基于 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 的,如下表部分示例所示。

常用类和方法

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

username, String password)

操作 API 方法示例

  • JenkinsServer:封装了调用 JenkinsAPI 的语义级别的方法,其本质调用的是 JenkinsHttpClient 类

中的方法,只是根据操作 Jenkins 的功能进行了语义级别的封装

JenkinsServer(JenkinsHttpConnection client)

操作 API 方法示例


  • Job:Jenkins 中 job 对应的实体类,有很多实用的语义级别的方法,如构建等。

Job(String name, String url)

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

  • 创建新 Job

  • 进入 job

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

SPRING BOOT 集成 JENKINSJOB 请求参数数据

  • 在 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,StringtestCommand) throws IOException, URISyntaxException {System.out.println("========== 执行开始 ===========");// 1. 通过 ClassPathResource 获取 Jenkins 的 JenkinsJob 请求参数数据ClassPathResource classPathResource = newClassPathResource("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(newURI(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 Jobjob.build(map,true);System.out.println("========== 执行完毕 ===========");}}
复制代码
  • 创建新 job 并构建成功

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

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

思考

1.尝试更新 Jenkins Job 配置信息,并在构建参数中新增用户名称字段

2.将 JenkinsAPI 调用和 Spring Boot 结合在一起,通过 postman 发送以下数据进行 Jenkins Job 的创建和更新操作

{"jobName": "hogwarts_test_mini_start_test_100","testCommand": "pwd","remark": "token","userId": "12"}
复制代码

搜索微信公众号:TestingStudio 霍格沃兹的干货都很硬核

用户头像

社区:ceshiren.com 微信:ceshiren2023 2022-08-29 加入

微信公众号:霍格沃兹测试开发 提供性能测试、自动化测试、测试开发等资料、实事更新一线互联网大厂测试岗位内推需求,共享测试行业动态及资讯,更可零距离接触众多业内大佬

评论

发布
暂无评论
软件测试 | 跨平台API对接_测试_测吧(北京)科技有限公司_InfoQ写作社区