公家号搜刮:TestingStudio 霍格沃兹测试开发的干货都很硬核

本章介绍基于 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软件测试/测试开发 | 跨平台API对接(Java)  第1张

进入 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 号令施行情况软件测试/测试开发 | 跨平台API对接(Java)  第2张

数据耐久化手艺就先讲到那里啦,下面留两个思虑给各人,希望各人能用心操练一下哦~

测验考试更新 Jenkins Job 设置装备摆设信息,并在构建参数中新增用户名称字段将 Jenkins API 挪用和 Spring Boot 连系在一路,通过 postman 发送以下数据停止 Jenkins Job 的创建和更新操做{ "jobName": "hogwarts_test_mini_start_test_100", "testCommand": "pwd", "remark": "token", "userId": "12"}