Jenkins Jenkinx

Jenkins 远程调用Java实现方式有两种,一种是REST API,一种是使用 jenkins-client
参考链接:https://www.cnblogs.com/zjsupermanblog/archive/2017/07/26/7238422.html

jenkins-client 实现方式

jenkins-client 底层是使用 HttpClient HttpPost 发送post 请求实现的,是将 REST API 封装了一下

添加依赖
1<!-- jenkins --> 2<dependency> 3 <groupId>com.offbytwo.jenkins</groupId> 4 <artifactId>jenkins-client</artifactId> 5 <version>0.3.7</version> 6</dependency>
连接服务器
1public synchronized static JenkinsServer getInstance() { 2 if (jenkinsServer == null) { 3 try { 4 jenkinsServer = new JenkinsServer(new URI(EnvParam.getInstance().getJenkinsURL()), EnvParam.getInstance().getJenkinsUserId(), 5 EnvParam.getInstance().getJenkinsToken()); 6 7 } catch (URISyntaxException e) { 8 e.printStackTrace(); 9 } 10 } 11 return jenkinsServer; 12} 13

new JenkinsServer() 底层 使用了HttpClient 底层代码如下

1BasicCredentialsProvider provider = new BasicCredentialsProvider(); 2AuthScope scope = new AuthScope(uri.getHost(), uri.getPort(), "realm"); 3UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(username, 4 password); 5provider.setCredentials(scope, credentials); 6builder.setDefaultCredentialsProvider(provider); 7builder.addInterceptorFirst(new PreemptiveAuth()); 8 9 10if (StringUtils.isNotBlank(username)) { 11 this.localContext = new BasicHttpContext(); 12 this.localContext.setAttribute("preemptive-auth", new BasicScheme()); 13}
获取所有的job信息
1JenkinsServer jenkins = getInstance(); 2Map<String, Job> jobs = jenkins.getJobs();

jenkins.getJobs(); 返回的是以jobName为key的map对象

获取某次构建的日志信息
1 public static String getJobLog(int buildNumber, String jobName) throws IOException { 2 3 JenkinsServer jenkins = getInstance(); 4 JobWithDetails job = jenkins.getJob(jobName); 5 JobWithDetails details = job.details(); 6 Build buildByNumber = details.getBuildByNumber(buildNumber); 7 BuildWithDetails details2 = buildByNumber.details(); 8 String outputText = details2.getConsoleOutputText(); 9 return outputText; 10}
获取某次构建的开始时间和持续时间
1public static Map<String, Long> getStartTImeAndEndTime(String jobName, int number) throws IOException { 2 3 JenkinsServer jenkins = getInstance(); 4 Map<String, Job> jobs = jenkins.getJobs(); 5 JobWithDetails job = jobs.get(jobName).details(); 6 Build buildByNumber = job.getBuildByNumber(number); 7 long startTime = buildByNumber.details().getTimestamp(); 8 long duration = buildByNumber.details().getDuration(); 9 10 Map<String, Long> data = new HashMap<>(); 11 data.put("startTime", startTime); 12 data.put("duration", duration); 13 return data; 14}
获取最后一次构建是否成功

number: 构建号 jobName: job 名称 通过获取最后的成功,失败的构建号,来判断是否相等

1public static boolean isSuccess(String jobName, int number) throws IOException { 2 3 JenkinsServer jenkins = getInstance(); 4 Map<String, Job> jobs = jenkins.getJobs(); 5 JobWithDetails job = jobs.get(jobName).details(); 6 int LastSuccessfulNumber = job.getLastSuccessfulBuild().getNumber(); 7 int LastUnsuccessfulNumber = job.getLastUnsuccessfulBuild().getNumber(); 8 9 boolean flag = false; 10 if (LastSuccessfulNumber == number) { 11 flag = true; 12 } 13 if (LastUnsuccessfulNumber == number) { 14 flag = false; 15 } 16 return flag; 17 }

通过获取构建的最终的结果来判断最终的结果
返回结果:SUCCESS, FAILURE

1public static String isSuccess(String jobName, int number) throws IOException { 2 JenkinsServer jenkins = getInstance(); 3 Map<String, Job> jobs = jenkins.getJobs(); 4 JobWithDetails job = jobs.get(jobName).details(); 5 Build buildByNumber = job.getBuildByNumber(number); 6 BuildWithDetails details = buildByNumber.details(); 7 return details.getResult().toString(); 8 }
判断job是否执行完
1public static boolean isFinished(int number, String jobName) { 2 boolean isBuilding = false; 3 if (number <= 0) { 4 throw new IllegalArgumentException("jodId must greater than 0!"); 5 } 6 try { 7 JenkinsServer jenkins = getInstance(); 8 Map<String, Job> jobs = jenkins.getJobs(); 9 JobWithDetails job = jobs.get(jobName).details(); 10 Build buildByNumber = job.getBuildByNumber(number); 11 if (null != buildByNumber) { 12 BuildWithDetails details = buildByNumber.details(); 13 if (null != details) { 14 isBuilding = details.isBuilding(); 15 } else { 16 isBuilding = true; 17 } 18 } else { 19 isBuilding = true; 20 } 21 22 return !isBuilding; 23 } catch (Exception e) { 24 e.printStackTrace(); 25 } finally { 26 } 27 return false; 28 }

通过上面的调用Jenkins-Client 相关的函数,可以获取相关的Jenkins的操作,如 日志,构建时间,job构建时长,构建号,是否成功,是否正在构建等等, 也发现一些问题 如
Jenkins中配置了view,并且view下面还有view,还有view,Jenkins-client 只能获取两层view,第三层的view获取不到

如果Jenkins中使用了build with parameters 插件 在使用 check box 选择多个参数的话,通过Jenkins-client 传参是 无法实现的

REST API 实现方式

Jenkins Web 每个页面 右下角都有一个REST API 点击一下 可以查看JSON API,通过JSONAPI 获取获取Jenkins的相关信息

构建

url: http://IP:PORT/job/${jobName}/buildWithParameters/ params:需要传递的参数

1public static String buildJob(String url, Map<String, String> params) 2 throws ClientProtocolException, IOException { 3 URI uri = URI.create(url); 4 HttpHost host = new HttpHost(uri.getHost(), uri.getPort(), uri.getScheme()); 5 CredentialsProvider credsProvider = new BasicCredentialsProvider(); 6 credsProvider.setCredentials(new AuthScope(uri.getHost(), uri.getPort()), 7 new UsernamePasswordCredentials("username", "password")); 8 // Create AuthCache instance 9 AuthCache authCache = new BasicAuthCache(); 10 // Generate BASIC scheme object and add it to the local auth cache 11 BasicScheme basicAuth = new BasicScheme(); 12 authCache.put(host, basicAuth); 13 CloseableHttpClient httpClient = HttpClients.custom() 14 .setDefaultCredentialsProvider(credsProvider).build(); 15 HttpPost httpPost = new HttpPost(uri); 16 17 //遍历map 将其中的数据转化为表单数据 18 if (null != params && !params.isEmpty()) { 19 ArrayList<BasicNameValuePair> pairs = new ArrayList<BasicNameValuePair>();//用于存放表单数据. 20 for (Map.Entry<String, String> entry : params.entrySet()) { 21 pairs.add(new BasicNameValuePair(entry.getKey(), entry.getValue())); 22 } 23 UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(pairs); 24 httpPost.setEntity(urlEncodedFormEntity); 25 } 26 // Add AuthCache to the execution context 27 HttpClientContext localContext = HttpClientContext.create(); 28 localContext.setAuthCache(authCache); 29 30 HttpResponse response = httpClient.execute(host, httpPost, localContext); 31 String result = EntityUtils.toString(response.getEntity()); 32 return result; 33}

REST API 实现方式都是通过调用Jenkins提供的接口发送post请求,具体的接口信息,如下面的CURL命令所示

CURL 方式调用

无参构建任务

curl -X POST http://IP:PORT/jenkins/job/${jobName}/build --user admin:admin

不设置参数/使用默认参数

curl -X POST http://IP:PORT/jenkins/job/${jobName}/buildWithParameters  --user admin:admin

设置参数

1curl -X POST http://localhost:8080/jenkins/job/commandTest/buildWithParameters 2-d port=80 --data-urlencode json=‘"{\"parameter\": [{\"name\": \"port\", \"value\": \"80\"}]}”‘

设置多个参数

curl -X POST http://localhost:8080/jenkins/job/commandTest/buildWithParameters -d param1=value1&param2=value --user admin:admin

删除job

curl -X POST http://localhost:8080/jenkins/job/${jobName}/doDelete --user admin:admin

查询job的状态

1curl --silent http://localhost:8080/jenkins/job/${jobName}/lastBuild/api/json 2 3获取最后一次成功 4curl --silent http://localhost:8080/jenkins/job/zdyy-yijijiakai-log-deploy/lastStableBuild/buildNumber --user admin:admin 5 6获取最后一次构建失败构建号 7curl --silent http://localhost:8080/jenkins/job/zdyy-yijijiakai-log-deploy/lastFailedBuild/buildNumber --user admin:admin 8 9获取最后一次构建成功 10curl --silent http://localhost:8080/jenkins/job/zdyy-yijijiakai-log-deploy/lastSuccessfulBuild/buildNumber --user admin:admin 11

获取job的相关信息 包括参数信息,每次构建信息等, 数据以JOSN返回

curl -X POST  http://localhost:8080/jenkins/job/CSGL-deploy/api/json?pretty=true

获取某一次构建的具体信息

curl -X POST http://localhost:8080/jenkins/job/${jobName}/${buildNumber}/api/json?pretty=true

获取job中的某些字段信息

curl -X POST http://localhost:8080/jenkins/job/${jobName}/api/json?pretty=true&tree=${获取的字段名称}

禁用job

curl -X POST  http://localhost:8080/jenkins/job/${jobName}/disable

启用job

curl -X POST  http://localhost:8080/job/${jobName}/enable 

获取job config 文件

curl -X POST  http://localhost:8080/job/${jobName}/config.xml
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

Jenkins Jenkinx - HelloWorld