2017-05-06 55 views
1

我想支持形式的请求:你如何支持'去'使用bitbucket服务器?

go get acme.com/component 

其中component是存储在到位桶Server中的Git项目,可以通过以下方式获得:

git clone http://acme.dev:7600/scm/project/component 

的走1.8客户端不知道如何

https://acme.com/component?go-get=1 
:它确实是这样的HTTPS GET的(按照 https://golang.org/cmd/go/#hdr-Remote_import_paths)来抓取基于所述 go get参数分量

响应,预计含有以下内容的HTTP 200:

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

HAProxy的是有吸引力的,因为到位桶服务器SSL终止过程使用它。它有一个monitor-uri hack,如果它检测到后端正在响应特定的URI,则返回一个HTTP响应,但我认为它不足以灵活处理不同的组件名称。

有没有人知道一种方法来处理这个使用HAProxy或者,也许,像NGinx另一个工具?

+0

没有为github上的一个工具,在源代码中的微小的变化,我认为你可以用它来bitbucket也是如此。 (因为你说另一个工具)https://github.com/niemeyer/gopkg – fzerorubigd

+0

感谢您的建议。建立一个自定义的Web服务器肯定会工作,但我使用一个反向代理的其他一些任务,我试图保持组件的数量。 –

+0

我看到一些nginx的帖子,即http://stackoverflow.com/questions/26347516/using-go-get-on-a-personal-git-repo –

回答

0

为了谈话的目的,并且因为HTTP响应的灵活生成很有用,我试着用nginx尝试一下 - 切换到ssh。配置文件的非标准部分有一个规则,在旅途中的客户端指向到位桶服务器:

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>'; 
    } 
} 
+0

明确引用HAProxy的问题的原始标题,所以我认为迈克尔对答案有合理的主张。也就是说,我认为Nginx可以更好地适应这项任务,因为它可以以一种简单的方式灵活地处理多个项目/组件,这在其范围之内。 –

1

根据您需要如何定制响应,可以仅使用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) 

而且从配置相关线路。我只是使用主机名将请求路由到后端,但您当然可以使用您需要的任何逻辑来触发它。

-- /etc/haproxy.cfg 

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

frontend main-frontend 
    mode http 
    bind :80 
    use_backend example if { hdr(host) -i example.com } 

backend example 
    mode http 
    http-request use-service lua.magic-endpoint 

而且,测试:

$ 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> 

看起来合法的。