30
30
import edu .umd .cs .findbugs .annotations .NonNull ;
31
31
import hudson .Extension ;
32
32
import hudson .FilePath ;
33
+ import hudson .model .ItemGroup ;
33
34
import hudson .model .Result ;
34
35
import hudson .model .Run ;
35
36
import hudson .model .TaskListener ;
48
49
import jenkins .scm .api .SCMRevision ;
49
50
import jenkins .scm .api .SCMRevisionAction ;
50
51
import jenkins .scm .api .SCMSource ;
52
+ import jenkins .scm .api .SCMSourceOwner ;
53
+ import jenkins .scm .impl .NullSCMSource ;
54
+
51
55
import org .apache .commons .lang .StringUtils ;
52
56
import org .jenkinsci .plugins .displayurlapi .DisplayURLProvider ;
53
57
@@ -105,8 +109,8 @@ private static void createStatus(@NonNull Run<?, ?> build, @NonNull TaskListener
105
109
@ NonNull BitbucketApi bitbucket , @ NonNull String key , @ NonNull String hash )
106
110
throws IOException , InterruptedException {
107
111
108
- final SCMSource s = SCMSource . SourceByItem . findSource (build . getParent () );
109
- if (!( s instanceof BitbucketSCMSource ) ) {
112
+ final BitbucketSCMSource source = findBitbucketSCMSource (build );
113
+ if (source == null ) {
110
114
return ;
111
115
}
112
116
@@ -135,7 +139,6 @@ private static void createStatus(@NonNull Run<?, ?> build, @NonNull TaskListener
135
139
} else if (Result .UNSTABLE .equals (result )) {
136
140
statusDescription = StringUtils .defaultIfBlank (buildDescription , "This commit has test failures." );
137
141
138
- BitbucketSCMSource source = (BitbucketSCMSource ) s ;
139
142
BitbucketSCMSourceContext sourceContext = new BitbucketSCMSourceContext (null , SCMHeadObserver .none ())
140
143
.withTraits (source .getTraits ());
141
144
if (sourceContext .sendSuccessNotificationForUnstableBuild ()) {
@@ -160,12 +163,19 @@ private static void createStatus(@NonNull Run<?, ?> build, @NonNull TaskListener
160
163
status = new BitbucketBuildStatus (hash , statusDescription , state , url , key , name );
161
164
new BitbucketChangesetCommentNotifier (bitbucket ).buildStatus (status );
162
165
if (result != null ) {
163
- listener .getLogger ().println ("[Bitbucket] Build result notified" );
166
+ listener .getLogger ().println ("[Bitbucket] Build result notified: " + status . getState () );
164
167
}
165
168
}
166
169
167
170
private static @ CheckForNull BitbucketSCMSource findBitbucketSCMSource (Run <?, ?> build ) {
168
171
SCMSource s = SCMSource .SourceByItem .findSource (build .getParent ());
172
+ if (s instanceof NullSCMSource ) {
173
+ // for instance PR merged on Bitbucket since the build has been started
174
+ ItemGroup <?> grandFather = build .getParent ().getParent ();
175
+ if (grandFather instanceof SCMSourceOwner ) {
176
+ s = ((SCMSourceOwner ) grandFather ).getSCMSources ().get (0 );
177
+ }
178
+ }
169
179
return s instanceof BitbucketSCMSource ? (BitbucketSCMSource ) s : null ;
170
180
}
171
181
0 commit comments