Git 您如何支持';去拿';使用bitbucket服务器?

Git 您如何支持';去拿';使用bitbucket服务器?,git,nginx,go,bitbucket,haproxy,Git,Nginx,Go,Bitbucket,Haproxy,我支持以下表格的要求: go get acme.com/component 其中,组件是存储在Bitbucket服务器中的git项目,可通过以下方式检索: git clone http://acme.dev:7600/scm/project/component go 1.8客户端不知道如何基于go get参数获取组件,因此它执行HTTPS get(根据): 作为响应,它期望HTTP 200包含以下内容: <head> <meta name="go-import" con

我支持以下表格的要求:

go get acme.com/component
其中,
组件
是存储在Bitbucket服务器中的git项目,可通过以下方式检索:

git clone http://acme.dev:7600/scm/project/component
go 1.8客户端不知道如何基于
go get
参数获取组件,因此它执行HTTPS get(根据):

作为响应,它期望HTTP 200包含以下内容:

<head>
  <meta name="go-import" content="acme.com/component git http://acme.dev:7600/scm/project/component">
</head>

HAProxy很有吸引力,因为Bitbucket服务器SSL终止过程使用它。如果它检测到后端正在响应一个特定的uri,那么它就有一个监视器uri hack来返回HTTP响应,但我认为它不够灵活,无法处理不同的组件名称


是否有人知道使用HAProxy或其他工具(如NGinx)处理此问题的方法?

根据您需要如何自定义响应,这可以仅使用HAProxy,使用Lua支持编译。在这里,使用HAProxy 1.6.12和Lua 5.3.4,我获取请求路径,并将其按原样放入响应中,以进行定制——实际上,任何路径都只是被复制进来。如果需要修改,也可以使用
string.gsub()

一个小Lua脚本:

-- /etc/haproxy/lua/custom-response.lua

core.register_service("magic-endpoint", "http", function(applet)
   local response =
         "<head>\r\n" ..
         "  <meta name=\"go-import\" content=\"example.com" .. applet.path ..
         " git http://example.dev:7600/scm/project" .. applet.path ..
         "\">\r\n</head>\r\n";
   applet:set_status(200);
   applet:add_header("Content-Length", string.len(response));
   applet:add_header("Content-Type", "text/whatevs");
   applet:start_response();
   applet:send(response);
end)
以及,测试:

$ curl -v http://example.com/project1
* Hostname was NOT found in DNS cache
*   Trying 127.0.0.1...
* Connected to example.com (127.0.0.1) port 80 (#0)
> GET /project1 HTTP/1.1
> User-Agent: curl/7.35.0
> Host: example.com
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: text/whatevs
< Content-Length: 124
<
<head>
  <meta name="go-import" content="example.com/project1 git http://example.dev:7600/scm/project/project1">
</head>
$curl-vhttp://example.com/project1
*在DNS缓存中找不到主机名
*正在尝试127.0.0.1。。。
*已连接到example.com(127.0.0.1)端口80(#0)
>GET/project1http/1.1
>用户代理:curl/7.35.0
>主持人:example.com
>接受:*/*
>

似乎是合法的。

出于对话的目的,并且由于灵活生成HTTP响应非常有用,我尝试使用nginx,并切换到ssh。配置文件的非标准部分具有将go客户端指向Bitbucket服务器的规则:

location ~ "^(/[^/]+)(/[^/]+)?" {
    if ($arg_go-get = "1") {
        return 200 '<html><head><meta name="go-import" content="acme.com$1$2 git ssh://acme.dev:7999$1$2"></head></html>';
    }
}
location~“^(/[^/]+)(/[^/]+)?”{
如果($arg_go-get=“1”){
返回200'';
}
}

github有一个工具,源代码有一点变化,我想你也可以将它用于bitbucket。(既然你说的是另一个工具)谢谢你的建议。构建自定义web服务器当然可以,但我在许多其他任务中使用反向代理,并且我正在努力减少组件的数量。我看到一些nginx帖子,也就是说,如果我了解您希望做的事情,这可以完全用HAProxy完成。。。但是你能举几个不同的请求和它们各自(不同)的响应的例子吗。。该解决方案需要使用变量的灵活HTTP响应,NGinx可以很容易地做到这一点。HAProxy真的不是为了这个。。它最擅长负载平衡。话虽如此,我会在一两天内尝试用要点来支持它。问题的原始标题明确提到了HAProxy,因此我认为Michael对答案有合理的要求。也就是说,我认为Nginx更适合这个任务,因为它可以以一种简单的方式灵活地处理多个项目/组件,这在它的范围内。
$ curl -v http://example.com/project1
* Hostname was NOT found in DNS cache
*   Trying 127.0.0.1...
* Connected to example.com (127.0.0.1) port 80 (#0)
> GET /project1 HTTP/1.1
> User-Agent: curl/7.35.0
> Host: example.com
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: text/whatevs
< Content-Length: 124
<
<head>
  <meta name="go-import" content="example.com/project1 git http://example.dev:7600/scm/project/project1">
</head>
location ~ "^(/[^/]+)(/[^/]+)?" {
    if ($arg_go-get = "1") {
        return 200 '<html><head><meta name="go-import" content="acme.com$1$2 git ssh://acme.dev:7999$1$2"></head></html>';
    }
}