軟件測(cè)試 | 跨平臺(tái)API對(duì)接
基于 Jenkins 實(shí)現(xiàn)跨平臺(tái) API 對(duì)接簡(jiǎn)介
Jenkins 提供了遠(yuǎn)程訪問(wèn)應(yīng)用編程接口(Remote Access API),能夠通過(guò) Http 協(xié)議遠(yuǎn)程調(diào)用相關(guān)命令操
作 Jenkins 進(jìn)行 Jenkins 視圖、任務(wù)、插件、構(gòu)建信息、任務(wù)日志信息、統(tǒng)計(jì)信息等,非常容易與其配
合更好的完成 CI/CD 工作。
Jenkins API 總共有三種格式,分別為:
XML API
可以使用 xml 方式進(jìn)行 API 的使用,這種方式的優(yōu)勢(shì)在于可以使用強(qiáng)大的 xpath 特性進(jìn)行相關(guān)的訪問(wèn)
控制。如我們下文將要介紹的 Jenkins 客戶端底層就是基于 XML API 實(shí)現(xiàn)的。
JSON API
使用 JSON 方式進(jìn)行操作,因?yàn)?json 基本上已經(jīng)是應(yīng)用之間數(shù)據(jù)交換的準(zhǔn)標(biāo)準(zhǔn)格式之一,這種方式比
較方便 Javascript 或者和其他應(yīng)用的集成。
Python API 可以通過(guò) python-jenkins 庫(kù)對(duì) Jenkins 進(jìn)行控制操作。此庫(kù)對(duì) Jenkins 的 API 進(jìn)行了進(jìn)
一步的包裝,使用起來(lái)更加方便,但是一般需要安裝 python-jenkins,并通過(guò) python 腳本的執(zhí)行
來(lái)達(dá)到集成的方式。
為什么基于 Jenkins API 對(duì)接
頻繁創(chuàng)建 Job 時(shí),降低手工錯(cuò)誤的概率
在工作中,如果需要?jiǎng)?chuàng)建的 Jenkins 的 Job 非常多,而大多又呈現(xiàn)有規(guī)律的方式時(shí),Job 的創(chuàng)建成為了
一個(gè)繁瑣而又需要頻繁操作的任務(wù)。在這種場(chǎng)景下,使用 API 結(jié)合腳本進(jìn)行自動(dòng)化可以提高效率,降低
手工錯(cuò)誤的幾率。
滿足特定條件時(shí)自動(dòng)觸發(fā) Jenkins
如果需要?jiǎng)討B(tài)的創(chuàng)建 Jenkins Job ,如根據(jù)中間結(jié)果在某個(gè)觸發(fā)點(diǎn)自動(dòng)生成,再如生成的 Job 需要使用
的參數(shù)也是動(dòng)態(tài)運(yùn)行階段才能取到值的場(chǎng)景下。
基于 Jenkins 自研產(chǎn)品或工具
如果產(chǎn)品或工具相關(guān)的功能,需要基于 Jenkins 進(jìn)行研發(fā),而且不希望用戶直接使用 Jenkins,僅將
Jenkins 作為背后的執(zhí)行引擎的場(chǎng)景,這種情況下也需要使用 Jenkins API 才能完成。
快速開始
下面我們通過(guò)實(shí)戰(zhàn)學(xué)習(xí)下如何將spring Boot和Jenkins進(jìn)行集成,實(shí)現(xiàn)跨平臺(tái)API對(duì)接
MAVEN
<dependency>
<groupId>com.offbytwo.jenkins</groupId>
<artifactId>jenkins-client</artifactId>
<version>0.3.8</version>
<dependency>
我們先引入 Jenkins-client 用于和 Jenkins 進(jìn)行交互。而 Jenkins-client 的底層實(shí)現(xiàn)其實(shí)就是調(diào)用
Jenkins XML API 來(lái)完成操作 Jenkins 的,如下表部分示例所示。
常用類和方法
JenkinsHttpClient:封裝了調(diào)用 JenkinsAPI 的底層方法 JenkinsHttpClient(URI uri, String
username, String password)
操作API方法示例
JenkinsServer:封裝了調(diào)用 JenkinsAPI 的語(yǔ)義級(jí)別的方法,其本質(zhì)調(diào)用的是 JenkinsHttpClient 類
中的方法,只是根據(jù)操作 Jenkins 的功能進(jìn)行了語(yǔ)義級(jí)別的封裝
JenkinsServer(JenkinsHttpConnection client)
操作API方法示例
Job:Jenkins 中 job 對(duì)應(yīng)的實(shí)體類,有很多實(shí)用的語(yǔ)義級(jí)別的方法,如構(gòu)建等。
Job(String name, String url)
如何獲取創(chuàng)建(更新) JENKINS JOB 的請(qǐng)求參數(shù)數(shù)據(jù)
創(chuàng)建新 Job
進(jìn)入job
將 Job/Job 名稱/ Configure 改為 Job/Job 名稱/ Config.xml 并回車
SPRING BOOT集成JENKINSJOB請(qǐng)求參數(shù)數(shù)據(jù)
在 resources 目錄下,jenkinsDir ,并添加 hogwarts_test_mini_start_test.xml 文件,此時(shí)我們?yōu)榱藴y(cè)
試命令可以正常被執(zhí)行,需要在測(cè)試命令前加 eval 關(guān)鍵字,并將${testCommand}放在英文雙引號(hào)
括內(nèi)部,如圖中紅框部分。
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 {
//調(diào)試使用
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("========== 執(zhí)行開始 ===========");
// 1. 通過(guò) ClassPathResource 獲取 Jenkins 的 JenkinsJob 請(qǐng)求參數(shù)數(shù)據(jù)
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. 根據(jù) Jenkins 信息創(chuàng)建 JenkinsHttpClient 對(duì)象
JenkinsHttpClient jenkinsHttpClient = new JenkinsHttpClient(new
URI(baseUrl),userName,password);
// 4. 根據(jù) Jenkins 客戶端創(chuàng)建 JenkinsServer 對(duì)象
JenkinsServer jenkinsServer = new JenkinsServer(jenkinsHttpClient);
// 5. 創(chuàng)建 Job,如果Job已經(jīng)存在,可以改為更新 Job 方法
jenkinsServer.createJob(jobName,jobConfigXml,true);
// 6. 獲取 Jenkins 服務(wù)器中所有的 Job 信息
Map<String, Job> jobMap = jenkinsServer.getJobs();
// 7. 獲取 Jenkins 服務(wù)器中我們創(chuàng)建的單個(gè) Job 信息
Job job = jobMap.get(jobName);
// 8. 組裝 Jenkins 服務(wù)器的構(gòu)建參數(shù)
Map<String,String> map = new HashMap<>();
map.put("userId",userId);
map.put("remark",remark);
map.put("testCommand",testCommand);
// 9. 構(gòu)建 Jenkins Job
job.build(map,true);
System.out.println("========== 執(zhí)行完畢 ===========");
}
}
創(chuàng)建新job并構(gòu)建成功
構(gòu)建參數(shù)頁(yè)面查看參數(shù)數(shù)據(jù)
構(gòu)建日志頁(yè)面查看pwd命令執(zhí)行情況
思考
1.嘗試更新Jenkins Job配置信息,并在構(gòu)建參數(shù)中新增用戶名稱字段
2.將JenkinsAPI調(diào)用和Spring Boot結(jié)合在一起,通過(guò)postman發(fā)送以下數(shù)據(jù)進(jìn)行Jenkins Job的創(chuàng)建和更新操作
{
"jobName": "hogwarts_test_mini_start_test_100",
"testCommand": "pwd",
"remark": "token",
"userId": "12"
}