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

org.kuali.maven.mojo.JenkinsHelper Maven / Gradle / Ivy

/**
 * Copyright 2004-2011 The Kuali Foundation
 *
 * Licensed under the Educational Community License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.opensource.org/licenses/ecl2.php
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.kuali.maven.mojo;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.DependencyResolutionRequiredException;
import org.apache.maven.plugin.Mojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.project.MavenProject;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.taskdefs.Java;
import org.apache.tools.ant.types.Commandline.Argument;
import org.apache.tools.ant.types.Path;
import org.codehaus.plexus.util.StringUtils;
import org.kuali.maven.common.AntMavenUtils;
import org.kuali.maven.common.Extractor;
import org.kuali.maven.common.PropertiesUtils;
import org.kuali.maven.common.ResourceUtils;
import org.kuali.maven.mojo.context.AntContext;
import org.kuali.maven.mojo.context.CliContext;
import org.kuali.maven.mojo.context.JobContext;
import org.kuali.maven.mojo.context.MavenContext;
import org.kuali.maven.mojo.context.MojoContext;
import org.kuali.maven.mojo.context.ResultContext;

public class JenkinsHelper {
	private static final String FS = System.getProperty("file.separator");
	public static final String JAVA_RESULT_PROPERTY = "java.result";
	Extractor extractor = new Extractor();
	PropertiesUtils propertiesUtils = new PropertiesUtils();
	ResourceUtils resourceUtils = new ResourceUtils();
	AntMavenUtils antMvnUtils = new AntMavenUtils();

	protected  T getContext(Class type, Mojo mojo) {
		try {
			T context = type.newInstance();
			BeanUtils.copyProperties(context, mojo);
			return context;
		} catch (Exception e) {
			throw new IllegalArgumentException(e);
		}
	}

	protected MojoContext getMojoContext(MavenContext mvnContext, JobContext jobContext, CliContext cliContext) {
		MojoContext context = new MojoContext();
		context.setMvnContext(mvnContext);
		context.setJobContext(jobContext);
		context.setCliContext(cliContext);
		return context;
	}

	public MojoContext getJob(Mojo mojo, String name, String type) throws MojoExecutionException {
		try {
			MavenContext mvnContext = getMavenContext(mojo);
			JobContext jobContext = getJobContext(mvnContext, mojo, name, type);
			FileUtils.touch(jobContext.getLocalFile());
			CliContext cliContext = getCliContext(jobContext, mojo);
			MojoContext context = getMojoContext(mvnContext, jobContext, cliContext);
			AntContext antContext = getAntContext(context);
			context.setAntContext(antContext);

			Task task = getJavaTask(antContext);
			mojo.getLog().info(cliContext.getServer() + " - " + cliContext.getCmd() + " - " + jobContext.getName());
			task.execute();
			int result = new Integer(antContext.getAntProject().getProperty(JAVA_RESULT_PROPERTY));
			antContext.setResult(result);
			ResultContext resultContext = handleResult(context, result, jobContext.getLocalFile());
			String location = jobContext.getLocalFile().getAbsolutePath();
			String content = resourceUtils.read(location);
			jobContext.setResolvedContent(content);
			context.setResultContext(resultContext);
			return context;
		} catch (Exception e) {
			throw new MojoExecutionException("Unexpected error", e);
		}
	}

	protected boolean isEmpty(Collection c) {
		return c == null || c.size() == 0;
	}

	protected boolean isIgnore(int result, List ignoreCodes) {
		if (result == 0) {
			return true;
		}
		for (Integer ignore : ignoreCodes) {
			if (result == ignore) {
				return true;
			}
		}
		return false;
	}

	public void handleResults(List contexts, List ignoreCodes) throws MojoExecutionException {
		List issues = new ArrayList();
		for (MojoContext context : contexts) {
			ResultContext rc = context.getResultContext();
			int returnCode = rc.getReturnCode();
			boolean ignore = isIgnore(returnCode, ignoreCodes);
			if (!ignore) {
				issues.add(context);
			}
		}
		MojoExecutionException e = null;
		for (MojoContext issue : issues) {
			Log log = issue.getMvnContext().getLog();
			ResultContext rc = issue.getResultContext();
			log.error(issue.getJobContext().getName() + " " + rc.getException().getMessage());
			e = rc.getException();
		}
		if (issues.size() > 0) {
			throw new MojoExecutionException("One or more requests had an issue", e);
		}
	}

	public void handleResults(List contexts) throws MojoExecutionException {
		handleResults(contexts, new ArrayList());
	}

	public List getJobs(Mojo mojo, List names, String[] types) throws MojoExecutionException {
		List contexts = new ArrayList();
		if (!isEmpty(names)) {
			for (String name : names) {
				contexts.add(getJob(mojo, name, null));
			}
		} else {
			for (String type : types) {
				contexts.add(getJob(mojo, null, type));
			}
		}
		return contexts;
	}

	protected String[] getArgs(String... args) {
		return args;
	}

	protected ResultContext getResultContext(int result, File resultFile) {
		if (result == 0) {
			return new ResultContext(result, null);
		}
		if (resultFile == null || !resultFile.exists() || resultFile.length() == 0) {
			MojoExecutionException e = new MojoExecutionException("Non-zero result returned from Jenkins CLI: "
					+ result);
			return new ResultContext(result, e);
		}

		try {
			String msg = resourceUtils.read(resultFile.getAbsolutePath());
			MojoExecutionException e = new MojoExecutionException("Non-zero result returned from Jenkins CLI: "
					+ result + "\n" + msg);
			return new ResultContext(result, e);
		} catch (IOException e) {
			MojoExecutionException ee = new MojoExecutionException("Error processing Jenkins CLI error message: "
					+ result, e);
			return new ResultContext(result, ee);
		}
	}

	protected ResultContext handleResult(MojoContext context, int result, File resultFile)
			throws MojoExecutionException {
		ResultContext resultContext = getResultContext(result, resultFile);
		boolean stopOnError = context.getMvnContext().isStopOnError();
		MojoExecutionException e = resultContext.getException();
		if (stopOnError && e != null) {
			throw e;
		} else {
			return resultContext;
		}
	}

	protected List readLines(File file) throws IOException {
		InputStream in = null;
		try {
			in = new FileInputStream(file);
			return IOUtils.readLines(in);
		} finally {
			IOUtils.closeQuietly(in);
		}
	}

	protected Path getPluginClasspath(Project antProject, MavenContext mvnContext) throws MojoExecutionException {
		try {
			MavenProject mvnProject = mvnContext.getProject();
			List pluginArtifacts = mvnContext.getPluginArtifacts();
			Map pathRefs = antMvnUtils.getPathRefs(antProject, mvnProject, pluginArtifacts);
			Path pluginClasspath = pathRefs.get(AntMavenUtils.MVN_PLUGIN_CLASSPATH_KEY);
			return pluginClasspath;
		} catch (DependencyResolutionRequiredException e) {
			throw new MojoExecutionException("Error obtaining classpath", e);
		}
	}

	protected AntContext getAntContext(MojoContext mojoContext) throws MojoExecutionException {
		Project antProject = getAntProject();
		Path classpath = getPluginClasspath(antProject, mojoContext.getMvnContext());

		AntContext context = new AntContext();
		context.setAntProject(antProject);
		context.setClasspath(classpath);
		context.setClassname(mojoContext.getCliContext().getClassname());
		context.setArgs(mojoContext.getCliContext().getArgs());
		if (mojoContext.getJobContext() != null) {
			context.setOutputFile(mojoContext.getJobContext().getLocalFile());
		}
		context.setResultProperty(JenkinsHelper.JAVA_RESULT_PROPERTY);
		return context;
	}

	protected Java getJavaTask(AntContext context) {
		Java task = new Java();
		task.setProject(context.getAntProject());
		task.setClassname(context.getClassname());
		task.setFork(true);
		task.setOutput(context.getOutputFile());
		task.setInput(context.getInputFile());
		task.setResultProperty(context.getResultProperty());
		createArgs(context.getArgs(), task);
		task.setClasspath(context.getClasspath());
		return task;
	}

	protected void createArgs(String[] args, Java task) {
		for (String arg : args) {
			Argument argument = task.createArg();
			argument.setValue(arg);
		}
	}

	/**
	 * 
	 */
	public Project getAntProject() {
		Project antProject = new Project();
		antProject.init();
		return antProject;
	}

	public List pushJobsToJenkins(Mojo mojo, String[] types) throws MojoExecutionException {
		List contexts = new ArrayList();
		for (String type : types) {
			MojoContext context = pushJobToJenkins(mojo, type);
			contexts.add(context);
		}
		return contexts;

	}

	public MojoContext pushJobToJenkins(Mojo mojo, String type) throws MojoExecutionException {
		MojoContext genContext = generate(mojo, type, false);
		MojoContext createContext = new MojoContext();
		createContext.setMvnContext(genContext.getMvnContext());
		createContext.setJobContext(genContext.getJobContext());
		JobContext jobContext = genContext.getJobContext();
		CliContext cliContext = getCliContext(genContext.getJobContext(), mojo);
		createContext.setCliContext(cliContext);
		AntContext antContext = getAntContext(createContext);
		antContext.setInputFile(jobContext.getLocalFile());
		File outputFile = new File(jobContext.getLocalFile().getAbsolutePath() + ".out");
		antContext.setOutputFile(outputFile);
		createContext.setAntContext(antContext);
		Task task = getJavaTask(antContext);
		mojo.getLog().info(cliContext.getServer() + " - " + cliContext.getCmd() + " - " + jobContext.getName());
		task.execute();
		int result = new Integer(antContext.getAntProject().getProperty(JAVA_RESULT_PROPERTY));
		antContext.setResult(result);
		ResultContext resultContext = handleResult(createContext, result, outputFile);
		createContext.setResultContext(resultContext);
		return createContext;
	}

	public List deleteJobs(Mojo mojo, List names, String[] types) throws MojoExecutionException {
		List contexts = new ArrayList();
		if (!isEmpty(names)) {
			for (String name : names) {
				MojoContext context = executeCliJobCommand(mojo, name, null);
				contexts.add(context);
			}
		} else {
			for (String type : types) {
				MojoContext context = executeCliJobCommand(mojo, null, type);
				contexts.add(context);
			}
		}
		return contexts;
	}

	public MojoContext executeCliCommand(Mojo mojo) throws MojoExecutionException {
		try {
			MavenContext mvnContext = getMavenContext(mojo);
			CliContext cliContext = getCliContext(mojo);
			MojoContext context = getMojoContext(mvnContext, null, cliContext);
			AntContext antContext = getAntContext(context);
			File outputFile = new File(mvnContext.getWorkingDir() + FS + cliContext.getClassname() + ".txt");
			FileUtils.touch(outputFile);
			antContext.setOutputFile(outputFile);
			Task task = getJavaTask(antContext);
			mojo.getLog().info(cliContext.getServer() + " - " + cliContext.getCmd());
			task.execute();
			int result = new Integer(antContext.getAntProject().getProperty(JAVA_RESULT_PROPERTY));
			antContext.setResult(result);
			ResultContext resultContext = handleResult(context, result, outputFile);
			context.setResultContext(resultContext);
			return context;
		} catch (IOException e) {
			throw new MojoExecutionException("Unexpected error", e);
		}
	}

	public MojoContext executeCliJobCommand(Mojo mojo, String name, String type) throws MojoExecutionException {
		try {
			MavenContext mvnContext = getMavenContext(mojo);
			JobContext jobContext = getJobContext(mvnContext, mojo, name, type);
			FileUtils.touch(jobContext.getLocalFile());
			CliContext cliContext = getCliContext(jobContext, mojo);
			MojoContext context = getMojoContext(mvnContext, jobContext, cliContext);
			AntContext antContext = getAntContext(context);
			Task task = getJavaTask(antContext);
			mojo.getLog().info(cliContext.getServer() + " - " + cliContext.getCmd() + " - " + jobContext.getName());
			task.execute();
			int result = new Integer(antContext.getAntProject().getProperty(JAVA_RESULT_PROPERTY));
			antContext.setResult(result);
			ResultContext resultContext = handleResult(context, result, jobContext.getLocalFile());
			context.setResultContext(resultContext);
			return context;
		} catch (IOException e) {
			throw new MojoExecutionException("Unexpected error", e);
		}
	}

	public MojoContext generate(Mojo mojo, String type, boolean logFilename) throws MojoExecutionException {
		try {
			MavenContext mvnContext = getMavenContext(mojo);
			JobContext jobContext = getJobContext(mvnContext, mojo, null, type);
			File localFile = jobContext.getLocalFile();
			String localFilePath = localFile.getCanonicalPath();
			if (logFilename) {
				mojo.getLog().info("Generating: " + localFilePath);
			}
			Properties properties = getProperties(mvnContext, jobContext);
			String xml = resourceUtils.read(jobContext.getTemplate());
			String resolvedXml = propertiesUtils.getResolvedValue(xml, properties);
			jobContext.setResolvedContent(resolvedXml);
			jobContext.setUnresolvedContent(xml);
			mvnContext.setProperties(properties);
			MojoContext context = new MojoContext();
			context.setJobContext(jobContext);
			context.setMvnContext(mvnContext);
			resourceUtils.write(localFilePath, resolvedXml);
			return context;
		} catch (IOException e) {
			throw new MojoExecutionException("Unexpected error", e);
		}
	}

	public MojoContext generate(Mojo mojo, String type) throws MojoExecutionException {
		return generate(mojo, type, true);
	}

	public List generate(Mojo mojo, String[] types) throws MojoExecutionException {
		List contexts = new ArrayList();
		for (String type : types) {
			MojoContext context = generate(mojo, type);
			contexts.add(context);
		}
		return contexts;
	}

	protected JobContext getJobContext(MavenContext mvnContext, Mojo mojo, String name, String type) {
		JobContext jobContext = getContext(JobContext.class, mojo);
		jobContext.setType(type);
		String jobName = getJobName(mvnContext, name, type);
		jobContext.setName(jobName);
		String filename = getFilename(mvnContext, jobContext, jobName);
		File localFile = new File(filename);
		jobContext.setLocalFile(localFile);
		return jobContext;
	}

	protected CliContext getCliContext(Mojo mojo) {
		CliContext context = getContext(CliContext.class, mojo);
		String[] args = getArgs("-s", context.getServer(), context.getCmd());
		context.setArgs(args);
		return context;
	}

	protected CliContext getCliContext(JobContext jobContext, Mojo mojo) {
		CliContext context = getContext(CliContext.class, mojo);
		String[] args = getArgs("-s", context.getServer(), context.getCmd(), jobContext.getName());
		context.setArgs(args);
		return context;
	}

	protected MavenContext getMavenContext(Mojo mojo) {
		MavenContext context = getContext(MavenContext.class, mojo);
		MavenProject project = context.getProject();
		String scmType = extractor.getScmType(project.getScm());
		String scmUrl = extractor.getScmUrl(project.getScm());
		String majorVersion = extractor.getMajorVersion(project.getVersion());

		context.setMajorVersion(majorVersion);
		context.setScmType(scmType);
		context.setScmUrl(scmUrl);
		return context;
	}

	protected String getFilename(MavenContext mvnContext, JobContext jobContext, String jobName) {
		StringBuilder sb = new StringBuilder();
		sb.append(jobContext.getWorkingDir());
		sb.append(FS);
		sb.append(jobName);
		sb.append(".xml");
		return sb.toString();
	}

	protected String getJobName(MavenContext mvnContext, String name, String type) {
		if (!StringUtils.isBlank(name)) {
			return name;
		}
		StringBuilder sb = new StringBuilder();
		sb.append(mvnContext.getProject().getArtifactId());
		sb.append("-");
		sb.append(mvnContext.getMajorVersion());
		sb.append("-");
		sb.append(type);
		return sb.toString();
	}

	protected Properties getProperties(MavenContext mvnContext, JobContext jobContext) throws IOException {

		List locations = getLocations(mvnContext, jobContext);
		Properties resourceProperties = propertiesUtils.getProperties(locations);
		Properties jenkinsProperties = getJenkinsProperties(mvnContext, jobContext);
		Properties projectProperties = mvnContext.getProject().getProperties();
		Properties environmentProperties = propertiesUtils.getEnvironmentProperties();
		Properties systemProperties = System.getProperties();

		Properties properties = new Properties();
		properties.putAll(resourceProperties);
		properties.putAll(jenkinsProperties);
		properties.putAll(projectProperties);
		properties.putAll(environmentProperties);
		properties.putAll(systemProperties);
		return properties;
	}

	protected Properties getJenkinsProperties(MavenContext mvnContext, JobContext jobContext) {
		SimpleDateFormat sdf = new SimpleDateFormat(jobContext.getTimestampFormat());
		Date now = new Date(System.currentTimeMillis());
		MavenProject project = mvnContext.getProject();
		Properties properties = new Properties();
		properties.setProperty("jenkins.project.scmType", mvnContext.getScmType());
		properties.setProperty("jenkins.project.scmUrl", mvnContext.getScmUrl());
		properties.setProperty("jenkins.project.majorVersion", mvnContext.getMajorVersion());
		properties.setProperty("jenkins.project.groupId", project.getGroupId());
		properties.setProperty("jenkins.project.artifactId", project.getArtifactId());
		properties.setProperty("jenkins.build.timestamp", sdf.format(now));
		return properties;
	}

	protected List getLocations(MavenContext mvnContext, JobContext jobContext) {
		List locations = new ArrayList();
		locations.add("classpath:org/kuali/jenkins/jobs/properties/common.xml");
		locations.add("classpath:org/kuali/jenkins/jobs/properties/" + mvnContext.getScmType() + ".xml");
		locations.add("classpath:org/kuali/jenkins/jobs/properties/types/" + jobContext.getType() + ".xml");
		return locations;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy