3030import edu .umd .cs .findbugs .annotations .NonNull ;
3131import hudson .Extension ;
3232import hudson .FilePath ;
33+ import hudson .model .ItemGroup ;
3334import hudson .model .Result ;
3435import hudson .model .Run ;
3536import hudson .model .TaskListener ;
4849import jenkins .scm .api .SCMRevision ;
4950import jenkins .scm .api .SCMRevisionAction ;
5051import jenkins .scm .api .SCMSource ;
52+ import jenkins .scm .api .SCMSourceOwner ;
53+ import jenkins .scm .impl .NullSCMSource ;
5154import org .apache .commons .lang .StringUtils ;
5255import org .jenkinsci .plugins .displayurlapi .DisplayURLProvider ;
5356
@@ -105,8 +108,8 @@ private static void createStatus(@NonNull Run<?, ?> build, @NonNull TaskListener
105108 @ NonNull BitbucketApi bitbucket , @ NonNull String key , @ NonNull String hash )
106109 throws IOException , InterruptedException {
107110
108- final SCMSource s = SCMSource . SourceByItem . findSource (build . getParent () );
109- if (!( s instanceof BitbucketSCMSource ) ) {
111+ final BitbucketSCMSource source = findBitbucketSCMSource (build );
112+ if (source == null ) {
110113 return ;
111114 }
112115
@@ -135,7 +138,6 @@ private static void createStatus(@NonNull Run<?, ?> build, @NonNull TaskListener
135138 } else if (Result .UNSTABLE .equals (result )) {
136139 statusDescription = StringUtils .defaultIfBlank (buildDescription , "This commit has test failures." );
137140
138- BitbucketSCMSource source = (BitbucketSCMSource ) s ;
139141 BitbucketSCMSourceContext sourceContext = new BitbucketSCMSourceContext (null , SCMHeadObserver .none ())
140142 .withTraits (source .getTraits ());
141143 if (sourceContext .sendSuccessNotificationForUnstableBuild ()) {
@@ -160,12 +162,19 @@ private static void createStatus(@NonNull Run<?, ?> build, @NonNull TaskListener
160162 status = new BitbucketBuildStatus (hash , statusDescription , state , url , key , name );
161163 new BitbucketChangesetCommentNotifier (bitbucket ).buildStatus (status );
162164 if (result != null ) {
163- listener .getLogger ().println ("[Bitbucket] Build result notified" );
165+ listener .getLogger ().println ("[Bitbucket] Build result notified: " + status . getState () );
164166 }
165167 }
166168
167169 private static @ CheckForNull BitbucketSCMSource findBitbucketSCMSource (Run <?, ?> build ) {
168170 SCMSource s = SCMSource .SourceByItem .findSource (build .getParent ());
171+ if (s instanceof NullSCMSource ) {
172+ // for instance PR merged on Bitbucket since the build has been started
173+ ItemGroup <?> grandFather = build .getParent ().getParent ();
174+ if (grandFather instanceof SCMSourceOwner ) {
175+ s = ((SCMSourceOwner ) grandFather ).getSCMSources ().get (0 );
176+ }
177+ }
169178 return s instanceof BitbucketSCMSource ? (BitbucketSCMSource ) s : null ;
170179 }
171180
0 commit comments