package hudson.plugins.jira; import hudson.EnvVars; import hudson.Extension; import hudson.FilePath; import hudson.Launcher; import hudson.model.AbstractBuild; import hudson.model.AbstractProject; import hudson.model.BuildListener; import hudson.model.Job; import hudson.model.Result; import hudson.model.Run; import hudson.model.TaskListener; import hudson.tasks.BuildStepMonitor; import hudson.tasks.BuildWrapperDescriptor; import jenkins.tasks.SimpleBuildWrapper; import org.kohsuke.stapler.DataBoundConstructor; import java.io.IOException; import java.util.HashMap; import java.util.Map; import static org.apache.commons.lang.StringUtils.defaultIfEmpty; import static org.apache.commons.lang.StringUtils.isEmpty; public class JiraCreateReleaseNotes extends SimpleBuildWrapper { @Extension public final static class Descriptor extends BuildWrapperDescriptor { @Override public String getDisplayName() { return "Generate Release Notes"; } @Override public boolean isApplicable(final AbstractProject<?, ?> item) { return true; } } public static final String DEFAULT_FILTER = "status in (Resolved, Closed)"; public static final String DEFAULT_ENVVAR_NAME = "RELEASE_NOTES"; private String jiraEnvironmentVariable; private String jiraProjectKey; private String jiraRelease; private String jiraFilter; // not in use anymore, as it always resets the given filter with the DEFAULT_FILTER public JiraCreateReleaseNotes(final String jiraProjectKey, final String jiraRelease, final String jiraEnvironmentVariable) { this(jiraProjectKey, jiraRelease, jiraEnvironmentVariable, DEFAULT_FILTER); } @DataBoundConstructor public JiraCreateReleaseNotes(final String jiraProjectKey, final String jiraRelease, final String jiraEnvironmentVariable, final String jiraFilter) { this.jiraRelease = jiraRelease; this.jiraProjectKey = jiraProjectKey; this.jiraEnvironmentVariable = defaultIfEmpty(jiraEnvironmentVariable, DEFAULT_ENVVAR_NAME); this.jiraFilter = defaultIfEmpty(jiraFilter, DEFAULT_FILTER); } public String getJiraEnvironmentVariable() { return jiraEnvironmentVariable; } public String getJiraFilter() { return jiraFilter; } public String getJiraProjectKey() { return jiraProjectKey; } public String getJiraRelease() { return jiraRelease; } public BuildStepMonitor getRequiredMonitorService() { return BuildStepMonitor.BUILD; } public void setJiraEnvironmentVariable(final String jiraEnvironmentVariable) { this.jiraEnvironmentVariable = jiraEnvironmentVariable; } public void setJiraFilter(final String jiraFilter) { this.jiraFilter = jiraFilter; } public void setJiraProjectKey(final String jiraProjectKey) { this.jiraProjectKey = jiraProjectKey; } public void setJiraRelease(final String jiraRelease) { this.jiraRelease = jiraRelease; } JiraSite getSiteForProject(Job<?, ?> project) { return JiraSite.get(project); } @Override public void setUp(Context context, Run<?, ?> run, FilePath workspace, Launcher launcher, TaskListener listener, EnvVars initialEnvironment) throws IOException, InterruptedException { final JiraSite site = getSiteForProject(run.getParent()); String realRelease = null; String realProjectKey = null; String releaseNotes = "No Release Notes"; String realFilter = DEFAULT_FILTER; try { realRelease = run.getEnvironment(listener).expand(jiraRelease); realProjectKey = run.getEnvironment(listener).expand(jiraProjectKey); realFilter = run.getEnvironment(listener).expand(jiraFilter); if (isEmpty(realRelease)) { throw new IllegalArgumentException("No version specified"); } if (isEmpty(realProjectKey)) { throw new IllegalArgumentException("No project specified"); } if ((realRelease != null) && !realRelease.isEmpty()) { releaseNotes = site.getReleaseNotesForFixVersion(realProjectKey, realRelease, realFilter); } else { listener.getLogger().printf("No release version found, skipping Release Notes generation\n"); } } catch (Exception e) { e.printStackTrace(listener.fatalError("Unable to generate release notes for JIRA version %s/%s: %s", realRelease, realProjectKey, e )); if(listener instanceof BuildListener) ((BuildListener)listener).finished(Result.FAILURE); } final Map<String, String> envMap = new HashMap<String, String>(); envMap.put(jiraEnvironmentVariable, releaseNotes); context.getEnv().putAll(envMap); } }