你如何支持' go get'使用bitbucket服务器?

时间:2017-05-06 14:56:29

标签: git nginx go bitbucket haproxy

我想支持表格的要求:

go get acme.com/component

其中component是存储在Bitbucket Server中的git项目,可通过以下方式检索:

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

go 1.8客户端不知道如何根据go get参数获取组件,因此它会执行HTTPS获取(根据https://golang.org/cmd/go/#hdr-Remote_import_paths):

https://acme.com/component?go-get=1

作为回应,它需要一个包含以下内容的HTTP 200:

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

HAProxy很有吸引力,因为Bitbucket Server SSL终止程序使用它。它有一个monitor-uri hack,如果它检测到后端正在响应特定的URI,则返回HTTP响应,但我认为它不够灵活,无法处理不同的组件名称。

有没有人知道使用HAProxy处理此问题的方法,或者可能是NGinx等其他工具?

2 个答案:

答案 0 :(得分:1)

根据您需要自定义响应的方式,只能使用通过Lua支持编译的HAProxy。在这里,使用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)

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

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

似乎合法。

答案 1 :(得分:0)

出于对话的目的,并且因为灵活生成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>';
    }
}