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 传参是 无法实现的

 

posted on 2018-04-29 16:55  贝克田庄  阅读(1284)  评论(0编辑  收藏  举报

导航