package hudson.plugins.jira.pipeline; import java.io.IOException; import java.io.PrintStream; import java.util.List; import java.util.Set; import javax.servlet.ServletException; import hudson.plugins.jira.JiraSession; import hudson.plugins.jira.JiraSite; import hudson.plugins.jira.Messages; import hudson.plugins.jira.model.JiraIssueField; import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.DataBoundSetter; import org.kohsuke.stapler.QueryParameter; import com.atlassian.jira.rest.client.api.RestClientException; import com.google.common.collect.Lists; import hudson.Extension; import hudson.FilePath; import hudson.Launcher; import hudson.Util; import hudson.model.AbstractProject; import hudson.model.Result; import hudson.model.Run; import hudson.model.TaskListener; import hudson.plugins.jira.selector.AbstractIssueSelector; import hudson.tasks.BuildStepDescriptor; import hudson.tasks.Builder; import hudson.util.FormValidation; import jenkins.tasks.SimpleBuildStep; /** * Issue custom fields updater * * @author Dmitry Frolov tekillaz.dev@gmail.com * */ public class IssueFieldUpdateStep extends Builder implements SimpleBuildStep { private AbstractIssueSelector issueSelector; public AbstractIssueSelector getIssueSelector() { return this.issueSelector; } @DataBoundSetter public void setIssueSelector(AbstractIssueSelector issueSelector) { this.issueSelector = issueSelector; } public String fieldId; public String getFieldId() { return this.fieldId; } @DataBoundSetter public void setFieldId(String fieldId) { this.fieldId = fieldId; } public String fieldValue; public String getFieldValue() { return this.fieldValue; } @DataBoundSetter public void setFieldValue(String fieldValue) { this.fieldValue = fieldValue; } @DataBoundConstructor public IssueFieldUpdateStep(AbstractIssueSelector issueSelector, String fieldId, String fieldValue) { this.issueSelector = issueSelector; this.fieldId = fieldId; this.fieldValue = fieldValue; } public String prepareFieldId(String fieldId) { String prepared = fieldId; if (!prepared.startsWith("customfield_")) prepared = "customfield_" + prepared; return prepared; } @Override public void perform(Run<?, ?> run, FilePath workspace, Launcher launcher, TaskListener listener) throws InterruptedException, IOException { PrintStream logger = listener.getLogger(); AbstractIssueSelector selector = issueSelector; if (selector == null) { logger.println("[JIRA][IssueFieldUpdateStep] No issue selector found!"); throw new IOException("[JIRA][IssueFieldUpdateStep] No issue selector found!"); } JiraSite site = JiraSite.get(run.getParent()); if (site == null) { logger.println(Messages.NoJiraSite()); run.setResult(Result.FAILURE); return; } JiraSession session = null; try { session = site.getSession(); } catch (IOException e) { listener.getLogger().println(Messages.FailedToConnect()); e.printStackTrace(listener.getLogger()); } if (session == null) { logger.println(Messages.NoRemoteAccess()); run.setResult(Result.FAILURE); return; } Set<String> issues = selector.findIssueIds(run, site, listener); if (issues.isEmpty()) { logger.println("[JIRA][IssueFieldUpdateStep] Issue list is empty!"); return; } List<JiraIssueField> fields = Lists.newArrayList(); fields.add(new JiraIssueField(prepareFieldId(fieldId), fieldValue)); for (String issue : issues) { submitFields(session, issue, fields, logger); } } public void submitFields(JiraSession session, String issueId, List<JiraIssueField> fields, PrintStream logger) { try { session.addFields(issueId, fields); } catch (RestClientException e) { if (e.getStatusCode().or(0).equals(404)) { logger.println(issueId + " - JIRA issue not found"); } if (e.getStatusCode().or(0).equals(403)) { logger.println(issueId + " - Jenkins JIRA user does not have permissions to comment on this issue"); } if (e.getStatusCode().or(0).equals(401)) { logger.println( issueId + " - Jenkins JIRA authentication problem"); } logger.println(Messages.FailedToUpdateIssue(issueId)); logger.println(e.getLocalizedMessage()); } } @Override public DescriptorImpl getDescriptor() { return (DescriptorImpl) super.getDescriptor(); } @Extension public static class DescriptorImpl extends BuildStepDescriptor<Builder> { public FormValidation doCheckField_id(@QueryParameter String value) throws IOException, ServletException { if (Util.fixNull(value).trim().length() == 0) return FormValidation.warning(Messages.JiraIssueFieldUpdater_NoIssueFieldID()); if (!value.matches("\\d+")) return FormValidation.error(Messages.JiraIssueFieldUpdater_NotAtIssueFieldID()); return FormValidation.ok(); } @Override public boolean isApplicable(Class<? extends AbstractProject> jobType) { return true; } @Override public String getDisplayName() { return Messages.JiraIssueFieldUpdater_DisplayName(); } } }