All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.capitalone.dashboard.collector.JenkinsCodeQualityCollectorTask Maven / Gradle / Ivy

package com.capitalone.dashboard.collector;

import com.capitalone.dashboard.jenkins.JenkinsJob;
import com.capitalone.dashboard.jenkins.JenkinsPredicate;
import com.capitalone.dashboard.jenkins.JenkinsSettings;
import com.capitalone.dashboard.jenkins.model.JenkinsCodeQualityJob;
import com.capitalone.dashboard.model.quality.*;
import com.capitalone.dashboard.repository.JenkinsCodeQualityCollectorRepository;
import com.capitalone.dashboard.repository.JenkinsCodeQualityJobRepository;
import com.capitalone.dashboard.utils.CodeQualityService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

@Component
public class JenkinsCodeQualityCollectorTask extends CollectorTask {

    private static final String DESCRIPTION_FORMAT = "%s (%s)";

    private JenkinsCodeQualityCollectorRepository collectorRepository;
    private JenkinsCodeQualityJobRepository jobRepository;
    private JenkinsSettings settings;
    private JenkinsClient jenkinsClient;
    private CodeQualityService codeQualityService;

    @Autowired
    public JenkinsCodeQualityCollectorTask(TaskScheduler taskScheduler, JenkinsCodeQualityCollectorRepository repository,
                                           JenkinsCodeQualityJobRepository jobRepository, JenkinsSettings settings,
                                           JenkinsClient jenkinsClient, CodeQualityService codeQualityService) {
        super(taskScheduler, "JenkinsCodeQuality");
        this.collectorRepository = repository;
        this.jobRepository = jobRepository;
        this.settings = settings;
        this.jenkinsClient = jenkinsClient;
        this.codeQualityService = codeQualityService;
    }

    public JenkinsCodeQualityCollector getCollector() {
        return JenkinsCodeQualityCollector.prototype(this.settings.getServers());
    }

    @Override
    public JenkinsCodeQualityCollectorRepository getCollectorRepository() {
        return this.collectorRepository;
    }

    @Override
    public String getCron() {
        return this.settings.getCron();
    }

    @Override
    public void collect(JenkinsCodeQualityCollector collector) {
        final List buildServers = collector.getBuildServers();
        final List jobs = this.jenkinsClient.getJobs(buildServers);
        if (null == jobs) {
            return;
        }

        List allJobsOnServer = jobs.stream().flatMap(JenkinsJob::streamJobs).collect(Collectors.toList());
        this.cleanupPreviousJobsFromRepo(collector, allJobsOnServer);


        List matchingJobPatterns = new ArrayList<>();
        Map artifactTypePatternMap = new HashMap<>();
        this.settings.getArtifactRegex().forEach(
                (key, uncompiledPatternList) -> uncompiledPatternList.stream().forEach(
                        unCompiledPattern -> {
                            Pattern compiledPattern = Pattern.compile(unCompiledPattern);
                            matchingJobPatterns.add(compiledPattern);
                            artifactTypePatternMap.put(key, compiledPattern);
                        }
                )
        );

        List interestingJobs = jobs.stream().flatMap(JenkinsJob::streamJobs).filter(JenkinsPredicate.artifactInJobContaining(matchingJobPatterns)).collect(Collectors.toList());

        this.createAnyNewJobs(collector, interestingJobs);

        List allJobs = this.jobRepository.findAllByCollectorId(collector.getId());
        int storedJobs =0;
        if (null != allJobs) {
            final Map jenkinsCodeQualityJobMap = allJobs.stream().collect(Collectors.toMap(JenkinsCodeQualityJob::getJenkinsServer, Function.identity()));

            for (JenkinsJob job : interestingJobs) {
                List allTypes = new ArrayList<>();
                artifactTypePatternMap.forEach((type, pattern) -> {
                            switch (type) {
                                case junit:
                                    allTypes.addAll(this.jenkinsClient.getLatestArtifacts(JunitXmlReport.class, job, pattern));
                                    break;
                                case findbugs:
                                    allTypes.addAll(this.jenkinsClient.getLatestArtifacts(FindBugsXmlReport.class, job, pattern));
                                    break;
                                case jacoco:
                                    allTypes.addAll(this.jenkinsClient.getLatestArtifacts(JacocoXmlReport.class,job,pattern));
                                    break;
                                case pmd:
                                    allTypes.addAll(this.jenkinsClient.getLatestArtifacts(PmdReport.class,job,pattern));
                                    break;
                                case checkstyle:
                                    allTypes.addAll(this.jenkinsClient.getLatestArtifacts(CheckstyleReport.class,job,pattern));
                                    break;
                                default:
                                    this.log("not collecting data for "+type+ " yet");
                                    break;
                            }
                        }
                );
                boolean stored = this.codeQualityService.storeJob(job, jenkinsCodeQualityJobMap.get(job.getUrl()), allTypes);
                if (stored) {
                    storedJobs++;
                }
            }
        }

        log("examined jobs",System.currentTimeMillis(),null==allJobs?0:allJobs.size());
        log("new data",System.currentTimeMillis(),storedJobs);
        log("Finished",System.currentTimeMillis());

    }

    private void cleanupPreviousJobsFromRepo(JenkinsCodeQualityCollector collector, List jobs) {
        List configuredServers = jobs.stream().map(job -> job.getUrl()).collect(Collectors.toList());
        List allRepoJobs = new ArrayList(this.jobRepository.findAllByCollectorId(collector.getId()));
        List jobsToKeep = allRepoJobs.stream().filter(
            job ->
                configuredServers.contains(job.getJenkinsServer())
        ).collect(Collectors.toList());
        allRepoJobs.removeAll(jobsToKeep);
        allRepoJobs.forEach(job -> {
            this.jobRepository.delete(job);
        });
    }

    private void createAnyNewJobs(JenkinsCodeQualityCollector collector, List buildServerJobs) {
        List allRepoJobs = new ArrayList<>(this.jobRepository.findAllByCollectorId(collector.getId()));

        List newJobs = new ArrayList<>(buildServerJobs).stream().filter(jenkinsJob ->
                !allRepoJobs.stream().anyMatch(
                        repoJob ->
                                repoJob.getJenkinsServer().equals(jenkinsJob.getUrl())
                )
        ).collect(Collectors.toList());

        newJobs.forEach(job -> {
            JenkinsCodeQualityJob newJob = JenkinsCodeQualityJob.newBuilder().
                    collectorId(collector.getId()).jobName(job.getName()).jenkinsServer(job.getUrl()).
                    description(String.format(DESCRIPTION_FORMAT, job.getName(), job.getUrl())).build();
            this.jobRepository.save(newJob);
        });
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy