Skip to content

Commit b2be679

Browse files
authored
Merge pull request #110 from rhencke/supportWorkflowJobs
Add support for Jenkins Pipeline.
2 parents 95be84f + 6f0fec8 commit b2be679

File tree

6 files changed

+73
-55
lines changed

6 files changed

+73
-55
lines changed
Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package stashpullrequestbuilder.stashpullrequestbuilder;
22

33
import hudson.Extension;
4-
import hudson.model.AbstractBuild;
4+
import hudson.model.Run;
55
import hudson.model.TaskListener;
66
import hudson.model.listeners.RunListener;
77

@@ -12,25 +12,25 @@
1212
* Created by Nathan McCarthy
1313
*/
1414
@Extension
15-
public class StashBuildListener extends RunListener<AbstractBuild> {
15+
public class StashBuildListener extends RunListener<Run<?, ?>> {
1616
private static final Logger logger = Logger.getLogger(StashBuildTrigger.class.getName());
1717

1818
@Override
19-
public void onStarted(AbstractBuild abstractBuild, TaskListener listener) {
19+
public void onStarted(Run<?, ?> run, TaskListener listener) {
2020
logger.info("BuildListener onStarted called.");
21-
StashBuildTrigger trigger = StashBuildTrigger.getTrigger(abstractBuild.getProject());
21+
StashBuildTrigger trigger = StashBuildTrigger.getTrigger(run.getParent());
2222
if (trigger == null) {
2323
return;
2424
}
25-
trigger.getBuilder().getBuilds().onStarted(abstractBuild);
25+
trigger.getBuilder().getBuilds().onStarted(run);
2626
}
2727

2828
@Override
29-
public void onCompleted(AbstractBuild abstractBuild, @Nonnull TaskListener listener) {
30-
StashBuildTrigger trigger = StashBuildTrigger.getTrigger(abstractBuild.getProject());
29+
public void onCompleted(Run<?, ?> run, @Nonnull TaskListener listener) {
30+
StashBuildTrigger trigger = StashBuildTrigger.getTrigger(run.getParent());
3131
if (trigger == null) {
3232
return;
3333
}
34-
trigger.getBuilder().getBuilds().onCompleted(abstractBuild, listener);
34+
trigger.getBuilder().getBuilds().onCompleted(run, listener);
3535
}
3636
}

src/main/java/stashpullrequestbuilder/stashpullrequestbuilder/StashBuildTrigger.java

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@
88
import com.cloudbees.plugins.credentials.domains.URIRequirementBuilder;
99
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
1010
import hudson.Extension;
11-
import hudson.model.AbstractProject;
1211
import hudson.model.Build;
1312
import hudson.model.Cause;
13+
import hudson.model.CauseAction;
1414
import hudson.model.Item;
15+
import hudson.model.Job;
1516
import hudson.model.ParameterDefinition;
1617
import hudson.model.ParameterValue;
1718
import hudson.model.ParametersAction;
@@ -26,7 +27,9 @@
2627
import hudson.triggers.TriggerDescriptor;
2728
import hudson.util.ListBoxModel;
2829
import jenkins.model.Jenkins;
30+
import jenkins.model.ParameterizedJobMixIn;
2931
import net.sf.json.JSONObject;
32+
import org.acegisecurity.Authentication;
3033
import org.apache.commons.lang.StringUtils;
3134
import org.kohsuke.stapler.AncestorInPath;
3235
import org.kohsuke.stapler.DataBoundConstructor;
@@ -47,7 +50,7 @@
4750
* Created by Nathan McCarthy
4851
*/
4952
@SuppressFBWarnings({"WMI_WRONG_MAP_ITERATOR", "NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE"})
50-
public class StashBuildTrigger extends Trigger<AbstractProject<?, ?>> {
53+
public class StashBuildTrigger extends Trigger<Job<?, ?>> {
5154
private static final Logger logger = Logger.getLogger(StashBuildTrigger.class.getName());
5255
private final String projectPath;
5356
private final String cron;
@@ -130,11 +133,15 @@ public String getcredentialsId() {
130133
}
131134

132135
private StandardUsernamePasswordCredentials getCredentials() {
136+
Authentication defaultAuth = null;
137+
if (job instanceof Queue.Task) {
138+
defaultAuth = Tasks.getDefaultAuthenticationOf((Queue.Task)this.job);
139+
}
133140
return CredentialsMatchers.firstOrNull(
134141
CredentialsProvider.lookupCredentials(
135142
StandardUsernamePasswordCredentials.class,
136143
this.job,
137-
Tasks.getDefaultAuthenticationOf(this.job),
144+
defaultAuth,
138145
URIRequirementBuilder.fromUri(stashHost).build()
139146
),
140147
CredentialsMatchers.allOf(CredentialsMatchers.withId(credentialsId)));
@@ -189,21 +196,27 @@ public boolean isCancelOutdatedJobsEnabled() {
189196
}
190197

191198
@Override
192-
public void start(AbstractProject<?, ?> project, boolean newInstance) {
199+
public void start(Job<?, ?> job, boolean newInstance) {
193200
try {
194201
this.stashPullRequestsBuilder = StashPullRequestsBuilder.getBuilder();
195-
this.stashPullRequestsBuilder.setProject(project);
202+
this.stashPullRequestsBuilder.setJob(job);
196203
this.stashPullRequestsBuilder.setTrigger(this);
197204
this.stashPullRequestsBuilder.setupBuilder();
198205
} catch(IllegalStateException e) {
199206
logger.log(Level.SEVERE, "Can't start trigger", e);
200207
return;
201208
}
202-
super.start(project, newInstance);
209+
super.start(job, newInstance);
203210
}
204211

205-
public static StashBuildTrigger getTrigger(AbstractProject project) {
206-
Trigger trigger = project.getTrigger(StashBuildTrigger.class);
212+
public static StashBuildTrigger getTrigger(Job job) {
213+
if (!(job instanceof ParameterizedJobMixIn.ParameterizedJob)) {
214+
return null;
215+
}
216+
217+
ParameterizedJobMixIn.ParameterizedJob pjob = (ParameterizedJobMixIn.ParameterizedJob) job;
218+
219+
Trigger trigger = pjob.getTriggers().get(descriptor);
207220
return (StashBuildTrigger)trigger;
208221
}
209222

@@ -235,9 +248,13 @@ public QueueTaskFuture<?> startJob(StashCause cause) {
235248
cancelPreviousJobsInQueueThatMatch(cause);
236249
abortRunningJobsThatMatch(cause);
237250
}
238-
239-
return this.job.scheduleBuild2(0, cause, new ParametersAction(values));
240-
251+
252+
return new ParameterizedJobMixIn() {
253+
@Override
254+
protected Job asJob() {
255+
return StashBuildTrigger.this.job;
256+
}
257+
}.scheduleBuild2(0, new ParametersAction(values), new CauseAction(cause));
241258
}
242259

243260
private void cancelPreviousJobsInQueueThatMatch(@Nonnull StashCause stashCause) {
@@ -292,10 +309,10 @@ private List<ParameterValue> getDefaultParameters() {
292309

293310
@Override
294311
public void run() {
295-
if(this.getBuilder().getProject().isDisabled()) {
296-
logger.info(format("Build Skip (%s).", getBuilder().getProject().getName()));
312+
if(!this.getBuilder().getJob().isBuildable()) {
313+
logger.info(format("Build Skip (%s).", getBuilder().getJob().getName()));
297314
} else {
298-
logger.info(format("Build started (%s).", getBuilder().getProject().getName()));
315+
logger.info(format("Build started (%s).", getBuilder().getJob().getName()));
299316
this.stashPullRequestsBuilder.run();
300317
}
301318
this.getDescriptor().save();

src/main/java/stashpullrequestbuilder/stashpullrequestbuilder/StashBuilds.java

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package stashpullrequestbuilder.stashpullrequestbuilder;
22

3-
import hudson.model.AbstractBuild;
43
import hudson.model.Cause;
54
import hudson.model.Result;
5+
import hudson.model.Run;
66
import hudson.model.TaskListener;
77
import jenkins.model.JenkinsLocationConfiguration;
88

@@ -23,61 +23,61 @@ public StashBuilds(StashBuildTrigger trigger, StashRepository repository) {
2323
this.repository = repository;
2424
}
2525

26-
public StashCause getCause(AbstractBuild build) {
27-
Cause cause = build.getCause(StashCause.class);
26+
public StashCause getCause(Run run) {
27+
Cause cause = run.getCause(StashCause.class);
2828
if (cause == null || !(cause instanceof StashCause)) {
2929
return null;
3030
}
3131
return (StashCause) cause;
3232
}
3333

34-
public void onStarted(AbstractBuild build) {
35-
StashCause cause = this.getCause(build);
34+
public void onStarted(Run run) {
35+
StashCause cause = this.getCause(run);
3636
if (cause == null) {
3737
return;
3838
}
3939
try {
40-
build.setDescription(cause.getShortDescription());
40+
run.setDescription(cause.getShortDescription());
4141
} catch (IOException e) {
4242
logger.log(Level.SEVERE, "Can't update build description", e);
4343
}
4444
}
4545

46-
public void onCompleted(AbstractBuild build, TaskListener listener) {
47-
StashCause cause = this.getCause(build);
46+
public void onCompleted(Run run, TaskListener listener) {
47+
StashCause cause = this.getCause(run);
4848
if (cause == null) {
4949
return;
5050
}
51-
Result result = build.getResult();
51+
Result result = run.getResult();
5252
JenkinsLocationConfiguration globalConfig = new JenkinsLocationConfiguration();
5353
String rootUrl = globalConfig.getUrl();
5454
String buildUrl = "";
5555
if (rootUrl == null) {
56-
buildUrl = " PLEASE SET JENKINS ROOT URL FROM GLOBAL CONFIGURATION " + build.getUrl();
56+
buildUrl = " PLEASE SET JENKINS ROOT URL FROM GLOBAL CONFIGURATION " + run.getUrl();
5757
}
5858
else {
59-
buildUrl = rootUrl + build.getUrl();
59+
buildUrl = rootUrl + run.getUrl();
6060
}
6161
repository.deletePullRequestComment(cause.getPullRequestId(), cause.getBuildStartCommentId());
6262

6363
String additionalComment = "";
6464

65-
StashPostBuildCommentAction comments = build.getAction(StashPostBuildCommentAction.class);
65+
StashPostBuildCommentAction comments = run.getAction(StashPostBuildCommentAction.class);
6666
if(comments != null) {
6767
String buildComment = result == Result.SUCCESS ? comments.getBuildSuccessfulComment() : comments.getBuildFailedComment();
6868

6969
if(buildComment != null && !buildComment.isEmpty()) {
7070
additionalComment = "\n\n" + buildComment;
7171
}
7272
}
73-
String duration = build.getDurationString();
73+
String duration = run.getDurationString();
7474
repository.postFinishedComment(cause.getPullRequestId(), cause.getSourceCommitHash(),
7575
cause.getDestinationCommitHash(), result, buildUrl,
76-
build.getNumber(), additionalComment, duration);
76+
run.getNumber(), additionalComment, duration);
7777

7878
//Merge PR
79-
StashBuildTrigger trig = StashBuildTrigger.getTrigger(build.getProject());
80-
if(trig.getMergeOnSuccess() && build.getResult() == Result.SUCCESS) {
79+
StashBuildTrigger trig = StashBuildTrigger.getTrigger(run.getParent());
80+
if(trig.getMergeOnSuccess() && run.getResult() == Result.SUCCESS) {
8181
boolean mergeStat = repository.mergePullRequest(cause.getPullRequestId(), cause.getPullRequestVersion());
8282
if(mergeStat == true)
8383
{

src/main/java/stashpullrequestbuilder/stashpullrequestbuilder/StashPostBuildComment.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.util.logging.Level;
1919
import java.util.logging.Logger;
2020

21+
// TODO: Make available in Jenkins Pipeline
2122
public class StashPostBuildComment extends Notifier {
2223
private static final Logger logger = Logger.getLogger(StashBuildTrigger.class.getName());
2324
private String buildSuccessfulComment;

src/main/java/stashpullrequestbuilder/stashpullrequestbuilder/StashPullRequestsBuilder.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
import static java.lang.String.format;
44

5+
import hudson.model.Job;
56
import stashpullrequestbuilder.stashpullrequestbuilder.stash.StashPullRequestResponseValue;
6-
import hudson.model.AbstractProject;
77

88
import java.util.Collection;
99
import java.util.logging.Logger;
@@ -13,7 +13,7 @@
1313
*/
1414
public class StashPullRequestsBuilder {
1515
private static final Logger logger = Logger.getLogger(StashBuildTrigger.class.getName());
16-
private AbstractProject<?, ?> project;
16+
private Job<?, ?> job;
1717
private StashBuildTrigger trigger;
1818
private StashRepository repository;
1919
private StashBuilds builds;
@@ -27,31 +27,31 @@ public void stop() {
2727
}
2828

2929
public void run() {
30-
logger.info(format("Build Start (%s).", project.getName()));
30+
logger.info(format("Build Start (%s).", job.getName()));
3131
this.repository.init();
3232
Collection<StashPullRequestResponseValue> targetPullRequests = this.repository.getTargetPullRequests();
3333
this.repository.addFutureBuildTasks(targetPullRequests);
3434
}
3535

3636
public StashPullRequestsBuilder setupBuilder() {
37-
if (this.project == null || this.trigger == null) {
37+
if (this.job == null || this.trigger == null) {
3838
throw new IllegalStateException();
3939
}
4040
this.repository = new StashRepository(this.trigger.getProjectPath(), this);
4141
this.builds = new StashBuilds(this.trigger, this.repository);
4242
return this;
4343
}
4444

45-
public void setProject(AbstractProject<?, ?> project) {
46-
this.project = project;
45+
public void setJob(Job<?, ?> job) {
46+
this.job = job;
4747
}
4848

4949
public void setTrigger(StashBuildTrigger trigger) {
5050
this.trigger = trigger;
5151
}
5252

53-
public AbstractProject<?, ?> getProject() {
54-
return this.project;
53+
public Job<?, ?> getJob() {
54+
return this.job;
5555
}
5656

5757
public StashBuildTrigger getTrigger() {

src/main/java/stashpullrequestbuilder/stashpullrequestbuilder/StashRepository.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public void init() {
6868
}
6969

7070
public Collection<StashPullRequestResponseValue> getTargetPullRequests() {
71-
logger.info(format("Fetch PullRequests (%s).", builder.getProject().getName()));
71+
logger.info(format("Fetch PullRequests (%s).", builder.getJob().getName()));
7272
List<StashPullRequestResponseValue> pullRequests = client.getPullRequests();
7373
List<StashPullRequestResponseValue> targetPullRequests = new ArrayList<StashPullRequestResponseValue>();
7474
for(StashPullRequestResponseValue pullRequest : pullRequests) {
@@ -80,11 +80,11 @@ public Collection<StashPullRequestResponseValue> getTargetPullRequests() {
8080
}
8181

8282
public String postBuildStartCommentTo(StashPullRequestResponseValue pullRequest) {
83-
String sourceCommit = pullRequest.getFromRef().getLatestCommit();
84-
String destinationCommit = pullRequest.getToRef().getLatestCommit();
85-
String comment = format(BUILD_START_MARKER, builder.getProject().getDisplayName(), sourceCommit, destinationCommit);
86-
StashPullRequestComment commentResponse = this.client.postPullRequestComment(pullRequest.getId(), comment);
87-
return commentResponse.getCommentId().toString();
83+
String sourceCommit = pullRequest.getFromRef().getLatestCommit();
84+
String destinationCommit = pullRequest.getToRef().getLatestCommit();
85+
String comment = format(BUILD_START_MARKER, builder.getJob().getDisplayName(), sourceCommit, destinationCommit);
86+
StashPullRequestComment commentResponse = this.client.postPullRequestComment(pullRequest.getId(), comment);
87+
return commentResponse.getCommentId().toString();
8888
}
8989

9090
public static AbstractMap.SimpleEntry<String,String> getParameter(String content){
@@ -192,7 +192,7 @@ private String getMessageForBuildResult(Result result) {
192192

193193
public void postFinishedComment(String pullRequestId, String sourceCommit, String destinationCommit, Result buildResult, String buildUrl, int buildNumber, String additionalComment, String duration) {
194194
String message = getMessageForBuildResult(buildResult);
195-
String comment = format(BUILD_FINISH_SENTENCE, builder.getProject().getDisplayName(), sourceCommit, destinationCommit, message, buildUrl, buildNumber, duration);
195+
String comment = format(BUILD_FINISH_SENTENCE, builder.getJob().getDisplayName(), sourceCommit, destinationCommit, message, buildUrl, buildNumber, duration);
196196

197197
comment = comment.concat(additionalComment);
198198

@@ -235,7 +235,7 @@ private void deletePreviousBuildFinishedComments(StashPullRequestResponseValue p
235235
continue;
236236
}
237237

238-
String project_build_finished = format(BUILD_FINISH_REGEX, builder.getProject().getDisplayName());
238+
String project_build_finished = format(BUILD_FINISH_REGEX, builder.getJob().getDisplayName());
239239
Matcher finishMatcher = Pattern.compile(project_build_finished, Pattern.CASE_INSENSITIVE).matcher(content);
240240

241241
if (finishMatcher.find()) {
@@ -291,7 +291,7 @@ private boolean isBuildTarget(StashPullRequestResponseValue pullRequest) {
291291
}
292292

293293
//These will match any start or finish message -- need to check commits
294-
String escapedBuildName = Pattern.quote(builder.getProject().getDisplayName());
294+
String escapedBuildName = Pattern.quote(builder.getJob().getDisplayName());
295295
String project_build_start = String.format(BUILD_START_REGEX, escapedBuildName);
296296
String project_build_finished = String.format(BUILD_FINISH_REGEX, escapedBuildName);
297297
Matcher startMatcher = Pattern.compile(project_build_start, Pattern.CASE_INSENSITIVE).matcher(content);

0 commit comments

Comments
 (0)