【问题标题】:bitbucket api PostRepositoryHook is not invoked on pull request merged合并拉取请求时未调用 bitbucket api PostRepositoryHook
【发布时间】:2018-05-04 00:25:10
【问题描述】:

我正在使用PostRepositoryHook 开发插件来监听开发者所做的所有推送。在测试期间,我意识到当我使用命令行运行git push 命令对其进行测试时它确实有效。但是,当我做 PR 并合并我的 PR 时它不起作用。

以下是代码详细信息。

// LoggingPostRepositoryHook.java

import com.atlassian.bitbucket.hook.repository.PostRepositoryHook;
import com.atlassian.bitbucket.hook.repository.PostRepositoryHookContext;
import com.atlassian.bitbucket.hook.repository.RepositoryHookRequest;
import com.atlassian.bitbucket.hook.repository.SynchronousPreferred;


import javax.annotation.Nonnull;

/**
 * Example hook that logs what changes have been made to a set of refs
 */
@SynchronousPreferred(asyncSupported = false)
public class LoggingPostRepositoryHook implements PostRepositoryHook<RepositoryHookRequest> {

    @Override
    public void postUpdate(@Nonnull PostRepositoryHookContext context,
                           @Nonnull RepositoryHookRequest hookRequest) {

        String message = hookRequest.getRepository().getProject()+" "+ hookRequest.getRepository().getName();
        PostMessage postMessage = new PostMessage();
        postMessage.send(message);
        hookRequest.getScmHookDetails().ifPresent(scmDetails -> {
            hookRequest.getRefChanges().forEach(refChange -> {
                scmDetails.out().println("Thank you for pusing code! "+ message);
            });
        });


    }
}

// atlassian-plugin.xml
<repository-hook key="logging-hook" name="Logging Post Hook"
                   i18n-name-key="hook.guide.logginghook.name"
                   configurable="false"
                   class="com.myapp.impl.LoggingPostRepositoryHook">
    <description key="hook.guide.logginghook.description" />
  </repository-hook>


// PostMessage.java
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClientBuilder;

public class PostMessage {
    public void send(String message) {

        HttpClient httpClient = HttpClientBuilder.create().build(); //Use this instead

        try {

            HttpPost request = new HttpPost("http://localhost:3008/git-hooks");
            StringEntity params =new StringEntity("details={\"message\":\""+message+"\"} ");
            request.addHeader("content-type", "application/x-www-form-urlencoded");
            request.setEntity(params);
            HttpResponse response = httpClient.execute(request);

            //handle response here...

        }catch (Exception ex) {

            //handle exception here
            System.out.println(ex);

        }
    }
}

请帮忙。

【问题讨论】:

  • 你怎么知道那个钩子不起作用?
  • 我将message 发送到REST API 进行测试。当我使用命令行git push 进行测试时,我确实看到了REST API 收到的消息。但是,当我对 PR 合并进行相同测试时,我看不到 REST API 收到的任何消息。
  • PostMessage postMessage = new PostMessage(); postMessage.send(message); 这负责发送示例消息。

标签: bitbucket bitbucket-server bitbucket-api


【解决方案1】:

在阅读了有关 bitbucket api 的更多信息后,我意识到 @SynchronousPreferred(asyncSupported = false) 是不必要的,一旦我将其删除,现在 RepositoryHookRequest 适用于所有三个类别

  1. 推送回购
  2. 在线编辑
  3. PR 合并 >> 这个触发器有两个,一个用于 PR 合并和第二个用于推送目标存储库

以下是代码供参考。

import com.atlassian.bitbucket.hook.repository.PostRepositoryHook;
import com.atlassian.bitbucket.hook.repository.PostRepositoryHookContext;
import com.atlassian.bitbucket.hook.repository.RepositoryHookRequest;

import javax.annotation.Nonnull;

public class PostCommitGlobalHook implements PostRepositoryHook<RepositoryHookRequest> {
    @Override
    public void postUpdate(@Nonnull PostRepositoryHookContext context,
                           @Nonnull RepositoryHookRequest hookRequest) {
        // Pass request to handler
        PostHookHandler handler = new PostHookHandler();
        handler.handleRequest(hookRequest);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    相关资源
    最近更新 更多