PageRenderTime 41ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/src/main/groovy/com/ceilfors/jenkins/plugins/jiratrigger/JiraTrigger.groovy

https://gitlab.com/CORP-RESELLER/jira-trigger-plugin
Groovy | 146 lines | 116 code | 27 blank | 3 comment | 10 complexity | 126d37101e11ccfae82eff399dddf6ee MD5 | raw file
  1. package com.ceilfors.jenkins.plugins.jiratrigger
  2. import com.atlassian.jira.rest.client.api.AddressableEntity
  3. import com.atlassian.jira.rest.client.api.domain.Issue
  4. import com.ceilfors.jenkins.plugins.jiratrigger.jira.JiraClient
  5. import com.ceilfors.jenkins.plugins.jiratrigger.parameter.IssueAttributePathParameterMapping
  6. import com.ceilfors.jenkins.plugins.jiratrigger.parameter.ParameterMapping
  7. import com.ceilfors.jenkins.plugins.jiratrigger.parameter.ParameterResolver
  8. import groovy.util.logging.Log
  9. import hudson.model.*
  10. import hudson.triggers.Trigger
  11. import hudson.triggers.TriggerDescriptor
  12. import jenkins.model.Jenkins
  13. import org.kohsuke.stapler.DataBoundSetter
  14. import javax.inject.Inject
  15. import java.util.concurrent.CopyOnWriteArrayList
  16. import java.util.logging.Level
  17. /**
  18. * @author ceilfors
  19. */
  20. @Log
  21. abstract class JiraTrigger<T> extends Trigger<AbstractProject> {
  22. int quietPeriod
  23. @DataBoundSetter
  24. String jqlFilter = ""
  25. @DataBoundSetter
  26. List<ParameterMapping> parameterMappings = []
  27. final boolean run(Issue issue, T t) {
  28. log.fine("[${job.fullName}] - Processing ${issue.key} - ${getId(t)}")
  29. if (!filter(issue, t)) {
  30. return false
  31. }
  32. if (jqlFilter) {
  33. if (!jiraTriggerDescriptor.jiraClient.validateIssueKey(issue.key, jqlFilter)) {
  34. log.fine("[${job.fullName}] - Not scheduling build: The issue ${issue.key} doesn't match with the jqlFilter [$jqlFilter]")
  35. return false
  36. }
  37. }
  38. List<Action> actions = []
  39. if (parameterMappings) {
  40. actions << new ParametersAction(collectParameterValues(issue))
  41. }
  42. actions << new JiraIssueEnvironmentContributingAction(issue: issue)
  43. log.fine("[${job.fullName}] - Scheduling build for ${issue.key} - ${getId(t)}")
  44. return job.scheduleBuild(quietPeriod, getCause(issue, t), *actions)
  45. }
  46. @Override
  47. void start(AbstractProject project, boolean newInstance) {
  48. super.start(project, newInstance)
  49. jiraTriggerDescriptor.addTrigger(this)
  50. }
  51. @Override
  52. void stop() {
  53. super.stop()
  54. jiraTriggerDescriptor.removeTrigger(this)
  55. }
  56. AbstractProject getJob() {
  57. super.job
  58. }
  59. abstract boolean filter(Issue issue, T t)
  60. protected List<ParameterValue> collectParameterValues(Issue issue) {
  61. return parameterMappings.collect {
  62. if (it instanceof IssueAttributePathParameterMapping) {
  63. try {
  64. return jiraTriggerDescriptor.parameterResolver.resolve(issue, it)
  65. } catch (JiraTriggerException e) {
  66. log.log(Level.WARNING, "Can't resolve attribute ${it.issueAttributePath} from JIRA issue. Example: description, key, status.name. Read help for more information.", e)
  67. return null
  68. }
  69. } else {
  70. throw new UnsupportedOperationException("Unsupported parameter mapping ${it.class}")
  71. }
  72. } - null
  73. }
  74. private String getId(T t) {
  75. if (t instanceof AddressableEntity) {
  76. return (t as AddressableEntity).self
  77. } else {
  78. return t.toString()
  79. }
  80. }
  81. JiraTriggerDescriptor getJiraTriggerDescriptor() {
  82. return super.getDescriptor() as JiraTriggerDescriptor
  83. }
  84. abstract Cause getCause(Issue issue, T t)
  85. @Log
  86. static abstract class JiraTriggerDescriptor extends TriggerDescriptor {
  87. @Inject
  88. protected Jenkins jenkins
  89. @Inject
  90. protected JiraClient jiraClient
  91. @Inject
  92. protected ParameterResolver parameterResolver
  93. private transient final List<JiraTrigger> triggers = new CopyOnWriteArrayList<>()
  94. public boolean isApplicable(Item item) {
  95. return item instanceof AbstractProject
  96. }
  97. @SuppressWarnings("GroovyUnusedDeclaration") // Jenkins jelly
  98. public List<ParameterMapping.ParameterMappingDescriptor> getParameterMappingDescriptors() {
  99. return jenkins.getDescriptorList(ParameterMapping)
  100. }
  101. protected void addTrigger(JiraTrigger jiraTrigger) {
  102. triggers.add(jiraTrigger)
  103. log.finest("Added [${jiraTrigger.job.fullName}]:[${jiraTrigger.class.simpleName}] to triggers list")
  104. }
  105. protected void removeTrigger(JiraTrigger jiraTrigger) {
  106. def result = triggers.remove(jiraTrigger)
  107. if (result) {
  108. log.finest("Removed [${jiraTrigger.job.fullName}]:[${jiraTrigger.class.simpleName}] from triggers list")
  109. } else {
  110. log.warning(
  111. "Bug! Failed to remove [${jiraTrigger.job.fullName}]:[${jiraTrigger.class.simpleName}] from triggers list. " +
  112. "The job might accidentally be triggered by JIRA. Restart Jenkins to recover.")
  113. }
  114. }
  115. List<JiraTrigger> allTriggers() {
  116. return Collections.unmodifiableList(triggers)
  117. }
  118. }
  119. }