zoukankan      html  css  js  c++  java
  • jenkins的api操作

    jenkins-client 实现方式

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

    添加依赖
    <!-- jenkins -->
    <dependency>
        <groupId>com.offbytwo.jenkins</groupId>
        <artifactId>jenkins-client</artifactId>
        <version>0.3.7</version>
    </dependency>
    连接服务器
    public synchronized static JenkinsServer getInstance() {
        if (jenkinsServer == null) {
            try {
                jenkinsServer = new JenkinsServer(new URI(EnvParam.getInstance().getJenkinsURL()), EnvParam.getInstance().getJenkinsUserId(),
                        EnvParam.getInstance().getJenkinsToken());
    
            } catch (URISyntaxException e) {
                e.printStackTrace();
            }
        }
        return jenkinsServer;
    }

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

    BasicCredentialsProvider provider = new BasicCredentialsProvider();
    AuthScope scope = new AuthScope(uri.getHost(), uri.getPort(), "realm");
    UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(username,
            password);
    provider.setCredentials(scope, credentials);
    builder.setDefaultCredentialsProvider(provider);
    builder.addInterceptorFirst(new PreemptiveAuth());
    if (StringUtils.isNotBlank(username)) {
        this.localContext = new BasicHttpContext();
        this.localContext.setAttribute("preemptive-auth", new BasicScheme());
    }
    获取所有的job信息
    JenkinsServer jenkins = getInstance();
    Map<String, Job> jobs = jenkins.getJobs();
    jenkins.getJobs(); 返回的是以jobName为key的map对象
    获取某次构建的日志信息
     public static String getJobLog(int buildNumber, String jobName) throws IOException {
    
        JenkinsServer jenkins = getInstance();
        JobWithDetails job = jenkins.getJob(jobName);
        JobWithDetails details = job.details();
        Build buildByNumber = details.getBuildByNumber(buildNumber);
        BuildWithDetails details2 = buildByNumber.details();
        String outputText = details2.getConsoleOutputText();
        return outputText;
    }
    获取某次构建的开始时间和持续时间
    public static Map<String, Long> getStartTImeAndEndTime(String jobName, int number) throws IOException {
    
        JenkinsServer jenkins = getInstance();
        Map<String, Job> jobs = jenkins.getJobs();
        JobWithDetails job = jobs.get(jobName).details();
        Build buildByNumber = job.getBuildByNumber(number);
        long startTime = buildByNumber.details().getTimestamp();
        long duration = buildByNumber.details().getDuration();
    
        Map<String, Long> data = new HashMap<>();
        data.put("startTime", startTime);
        data.put("duration", duration);
        return data;
    }
    获取最后一次构建是否成功

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

    public static boolean isSuccess(String jobName, int number) throws IOException {
    
            JenkinsServer jenkins = getInstance();
            Map<String, Job> jobs = jenkins.getJobs();
            JobWithDetails job = jobs.get(jobName).details();
            int LastSuccessfulNumber = job.getLastSuccessfulBuild().getNumber();
            int LastUnsuccessfulNumber = job.getLastUnsuccessfulBuild().getNumber();
    
            boolean flag = false;
            if (LastSuccessfulNumber == number) {
                flag = true;
            }
            if (LastUnsuccessfulNumber == number) {
                flag = false;
            }
            return flag;
        }

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

    public static String isSuccess(String jobName, int number) throws IOException {
            JenkinsServer jenkins = getInstance();
            Map<String, Job> jobs = jenkins.getJobs();
            JobWithDetails job = jobs.get(jobName).details();
            Build buildByNumber = job.getBuildByNumber(number);
            BuildWithDetails details = buildByNumber.details();
            return details.getResult().toString();
        }
    判断job是否执行完
    public static boolean isFinished(int number, String jobName) {
            boolean isBuilding = false;
            if (number <= 0) {
                throw new IllegalArgumentException("jodId must greater than 0!");
            }
            try {
                JenkinsServer jenkins = getInstance();
                Map<String, Job> jobs = jenkins.getJobs();
                JobWithDetails job = jobs.get(jobName).details();
                Build buildByNumber = job.getBuildByNumber(number);
                if (null != buildByNumber) {
                    BuildWithDetails details = buildByNumber.details();
                    if (null != details) {
                        isBuilding = details.isBuilding();
                    } else {
                        isBuilding = true;
                    }
                } else {
                    isBuilding = true;
                }
    
                return !isBuilding;
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
            }
            return false;
        }

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

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

  • 相关阅读:
    Taurus.MVC 2.2 开源发布:WebAPI 功能增强(请求跨域及Json转换)
    聊聊程序员如何学习英语单词:写了一个记单词的小程序
    ASP.NET Core 折腾笔记二:自己写个完整的Cache缓存类来支持.NET Core
    关于开启.NET在线提升教育培训的通知!
    彻查手机端浏览博客园出现广告一事!
    ASP.NET Aries 入门开发教程9:业务表单的开发
    ASP.NET Aries 入门开发教程8:树型列表及自定义右键菜单
    ASP.NET Aries 入门开发教程7:DataGrid的行操作(主键操作区)
    ASP.NET Aries 入门开发教程6:列表数据表格的格式化处理及行内编辑
    ASP.NET Aries 入门开发教程5:自定义列表页工具栏区
  • 原文地址:https://www.cnblogs.com/clovejava/p/8971354.html
Copyright © 2011-2022 走看看