1
1
package bitbucketpullrequestbuilder .bitbucketpullrequestbuilder ;
2
2
3
- import antlr .ANTLRException ;
3
+ import static com .cloudbees .plugins .credentials .CredentialsMatchers .instanceOf ;
4
+
5
+ import java .io .IOException ;
6
+ import java .net .URISyntaxException ;
7
+ import java .util .ArrayList ;
8
+ import java .util .HashMap ;
9
+ import java .util .List ;
10
+ import java .util .Map ;
11
+ import java .util .concurrent .ExecutorService ;
12
+ import java .util .concurrent .Executors ;
13
+ import java .util .logging .Level ;
14
+ import java .util .logging .Logger ;
15
+
16
+ import javax .annotation .Nonnull ;
17
+ import javax .annotation .Nullable ;
18
+
4
19
import com .cloudbees .plugins .credentials .CredentialsProvider ;
5
20
import com .cloudbees .plugins .credentials .common .StandardListBoxModel ;
6
21
import com .cloudbees .plugins .credentials .common .StandardUsernamePasswordCredentials ;
7
22
import com .cloudbees .plugins .credentials .common .UsernamePasswordCredentials ;
23
+ import com .cloudbees .plugins .credentials .domains .DomainRequirement ;
24
+
25
+ import org .apache .commons .lang .StringUtils ;
26
+ import org .eclipse .jgit .transport .URIish ;
27
+ import org .jenkinsci .Symbol ;
28
+ import org .kohsuke .stapler .DataBoundConstructor ;
29
+ import org .kohsuke .stapler .StaplerRequest ;
30
+
31
+ import antlr .ANTLRException ;
8
32
import hudson .Extension ;
9
- import hudson .model .*;
33
+ import hudson .model .Cause ;
34
+ import hudson .model .CauseAction ;
35
+ import hudson .model .Executor ;
36
+ import hudson .model .Item ;
37
+ import hudson .model .Job ;
38
+ import hudson .model .ParameterDefinition ;
39
+ import hudson .model .ParameterValue ;
40
+ import hudson .model .ParametersAction ;
41
+ import hudson .model .ParametersDefinitionProperty ;
10
42
import hudson .model .Queue ;
43
+ import hudson .model .Result ;
44
+ import hudson .model .Run ;
11
45
import hudson .model .queue .QueueTaskFuture ;
12
46
import hudson .plugins .git .RevisionParameterAction ;
47
+ import hudson .security .ACL ;
13
48
import hudson .triggers .Trigger ;
14
49
import hudson .triggers .TriggerDescriptor ;
15
50
import hudson .util .ListBoxModel ;
16
51
import jenkins .model .Jenkins ;
17
52
import jenkins .model .ParameterizedJobMixIn ;
18
53
import net .sf .json .JSONObject ;
19
- import org .apache .commons .lang .StringUtils ;
20
- import org .eclipse .jgit .transport .URIish ;
21
- import org .jenkinsci .Symbol ;
22
- import org .kohsuke .stapler .DataBoundConstructor ;
23
- import org .kohsuke .stapler .StaplerRequest ;
24
-
25
- import java .io .IOException ;
26
- import java .net .URISyntaxException ;
27
- import java .util .ArrayList ;
28
- import java .util .HashMap ;
29
- import java .util .List ;
30
- import java .util .Map ;
31
- import java .util .logging .Level ;
32
- import java .util .logging .Logger ;
33
- import javax .annotation .Nonnull ;
34
- import javax .annotation .Nullable ;
35
-
36
- import static com .cloudbees .plugins .credentials .CredentialsMatchers .instanceOf ;
37
54
38
55
/**
39
56
* Created by nishio
40
57
*/
41
58
public class BitbucketBuildTrigger extends Trigger <Job <?, ?>> {
42
59
private static final Logger logger = Logger .getLogger (BitbucketBuildTrigger .class .getName ());
60
+ private static final ExecutorService pool = Executors .newFixedThreadPool (5 );
61
+
43
62
private final String projectPath ;
44
63
private final String bitbucketServer ;
45
64
private final String cron ;
@@ -165,6 +184,7 @@ public boolean getApproveIfSuccess() {
165
184
public boolean getCancelOutdatedJobs () {
166
185
return cancelOutdatedJobs ;
167
186
}
187
+
168
188
/**
169
189
* @return a phrase that when entered in a comment will trigger a new build
170
190
*/
@@ -173,38 +193,35 @@ public String getCommentTrigger() {
173
193
}
174
194
175
195
@ Override
176
- public void start (Job <?, ?> project , boolean newInstance ) {
196
+ public void start (Job <?, ?> job , boolean newInstance ) {
197
+ super .start (job , newInstance );
198
+
177
199
try {
178
200
this .bitbucketPullRequestsBuilder = BitbucketPullRequestsBuilder .getBuilder ();
179
- this .bitbucketPullRequestsBuilder .setProject ( project );
201
+ this .bitbucketPullRequestsBuilder .setJob ( job );
180
202
this .bitbucketPullRequestsBuilder .setTrigger (this );
181
203
this .bitbucketPullRequestsBuilder .setupBuilder ();
182
- } catch (IllegalStateException e ) {
204
+ } catch (Exception e ) {
183
205
logger .log (Level .SEVERE , "Can't start trigger" , e );
184
206
return ;
185
207
}
186
- super .start (project , newInstance );
187
208
}
188
209
189
- public static BitbucketBuildTrigger getTrigger (AbstractProject project ) {
190
- Trigger trigger = project .getTrigger (BitbucketBuildTrigger .class );
210
+ public static BitbucketBuildTrigger getTrigger (Job <?, ?> job ) {
211
+ if (!(job instanceof ParameterizedJobMixIn .ParameterizedJob )) {
212
+ return null ;
213
+ }
214
+
215
+ ParameterizedJobMixIn .ParameterizedJob pjob = (ParameterizedJobMixIn .ParameterizedJob ) job ;
216
+
217
+ Trigger <?> trigger = pjob .getTriggers ().get (descriptor );
191
218
return (BitbucketBuildTrigger )trigger ;
192
219
}
193
220
194
221
public BitbucketPullRequestsBuilder getBuilder () {
195
222
return this .bitbucketPullRequestsBuilder ;
196
223
}
197
224
198
- private ParameterizedJobMixIn retrieveScheduleJob (final Job <?, ?> job ) {
199
- // TODO 1.621+ use standard method
200
- return new ParameterizedJobMixIn () {
201
- @ Override
202
- protected Job asJob () {
203
- return job ;
204
- }
205
- };
206
- }
207
-
208
225
public QueueTaskFuture <?> startJob (BitbucketCause cause ) {
209
226
Map <String , ParameterValue > values = this .getDefaultParameters ();
210
227
@@ -213,10 +230,19 @@ public QueueTaskFuture<?> startJob(BitbucketCause cause) {
213
230
abortRunningJobsThatMatch (cause );
214
231
}
215
232
216
- return retrieveScheduleJob (this .job ).scheduleBuild2 (0 ,
217
- new CauseAction (cause ),
218
- new ParametersAction (new ArrayList (values .values ())),
219
- new RevisionParameterAction (cause .getSourceCommitHash (), getBitbucketRepoUrl (cause .getRepositoryOwner (), cause .getRepositoryName ())));
233
+ ParameterizedJobMixIn scheduledJob = new ParameterizedJobMixIn () {
234
+ @ Override
235
+ protected Job asJob () {
236
+ return job ;
237
+ }
238
+ };
239
+
240
+ return scheduledJob .scheduleBuild2 (
241
+ this .getInstance ().getQuietPeriod (),
242
+ new CauseAction (cause ),
243
+ new ParametersAction (new ArrayList <ParameterValue >(values .values ())),
244
+ new RevisionParameterAction (cause .getSourceCommitHash ())
245
+ );
220
246
}
221
247
222
248
private URIish getBitbucketRepoUrl (String repoOwner , String repoName ) {
@@ -252,7 +278,7 @@ private void abortRunningJobsThatMatch(@Nonnull BitbucketCause bitbucketCause) {
252
278
logger .fine ("Looking for running jobs that match PR ID: " + bitbucketCause .getPullRequestId ());
253
279
for (Object o : job .getBuilds ()) {
254
280
if (o instanceof Run ) {
255
- Run build = (Run ) o ;
281
+ Run <?,?> build = (Run <?,?> ) o ;
256
282
if (build .isBuilding () && hasCauseFromTheSamePullRequest (build .getCauses (), bitbucketCause )) {
257
283
logger .fine ("Aborting build: " + build + " since PR is outdated" );
258
284
setBuildDescription (build );
@@ -266,7 +292,7 @@ private void abortRunningJobsThatMatch(@Nonnull BitbucketCause bitbucketCause) {
266
292
}
267
293
}
268
294
269
- private void setBuildDescription (final Run build ) {
295
+ private void setBuildDescription (final Run <?,?> build ) {
270
296
try {
271
297
build .setDescription ("Aborting build by `Bitbucket Pullrequest Builder Plugin`: " + build + " since PR is outdated" );
272
298
} catch (IOException e ) {
@@ -303,13 +329,17 @@ private Map<String, ParameterValue> getDefaultParameters() {
303
329
304
330
@ Override
305
331
public void run () {
306
- Job <?,?> project = this .getBuilder ().getProject ();
307
- if (project instanceof AbstractProject && ((AbstractProject )project ).isDisabled ()) {
308
- logger .fine ("Build Skip." );
309
- } else {
310
- this .bitbucketPullRequestsBuilder .run ();
332
+ Job <?,?> job = this .getBuilder ().getJob ();
333
+ String name = job .getFullName ();
334
+
335
+ if (!job .isBuildable ()) {
336
+ logger .log (Level .FINE , "Build Skip for job - {0}." , name );
337
+ } else {
338
+ logger .log (Level .FINE , "running trigger for the job - {0}" , name );
339
+
340
+ pool .submit (new TriggerRunnable (this .getBuilder ()));
311
341
this .getDescriptor ().save ();
312
- }
342
+ }
313
343
}
314
344
315
345
@ Override
@@ -346,9 +376,31 @@ public boolean configure(StaplerRequest req, JSONObject json) throws FormExcepti
346
376
347
377
public ListBoxModel doFillCredentialsIdItems () {
348
378
return new StandardListBoxModel ()
349
- .withEmptySelection ()
350
- .withMatching (instanceOf (UsernamePasswordCredentials .class ),
351
- CredentialsProvider .lookupCredentials (StandardUsernamePasswordCredentials .class ));
379
+ .withEmptySelection ()
380
+ .withMatching (
381
+ instanceOf (UsernamePasswordCredentials .class ),
382
+ CredentialsProvider .lookupCredentials (
383
+ StandardUsernamePasswordCredentials .class ,
384
+ (Item ) null ,
385
+ ACL .SYSTEM ,
386
+ (DomainRequirement ) null
387
+ )
388
+ );
389
+ }
390
+ }
391
+
392
+ private static final class TriggerRunnable implements Runnable {
393
+ private final BitbucketPullRequestsBuilder builder ;
394
+
395
+ TriggerRunnable (BitbucketPullRequestsBuilder builder ) {
396
+ this .builder = builder ;
397
+ }
398
+
399
+ @ Override
400
+ public void run () {
401
+ synchronized (this ) {
402
+ this .builder .run ();
403
+ }
352
404
}
353
405
}
354
406
}
0 commit comments