您如何支持 'go get' 使用 bitbucket 服务器?
How do you support 'go get' using bitbucket server?
我愿意支持以下形式的请求:
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 终止程序使用它。如果它检测到后端正在响应特定的 URI,它会对 return HTTP 响应进行 monitor-uri hack,但我认为它不够灵活,无法处理不同的组件名称。
有谁知道使用 HAProxy 或其他工具(例如 NGinx)来处理此问题的方法吗?
根据您需要自定义响应的方式,这可以仅使用 HAProxy,并在 Lua 支持下编译。在这里,使用带有 Lua 5.3.4 的 HAProxy 1.6.12,我采用请求路径并将其按原样放入响应中,以进行自定义——基本上任何路径都只是被复制进来。如果需要修改,也可以使用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>
似乎是合法的。
出于对话的目的,并且因为灵活生成 HTTP 响应很有用,我尝试使用 nginx - 切换到 ssh。配置文件的非标准部分有一条规则将go客户端指向Bitbucket服务器:
location ~ "^(/[^/]+)(/[^/]+)?" {
if ($arg_go-get = "1") {
return 200 '<html><head><meta name="go-import" content="acme.com git ssh://acme.dev:7999"></head></html>';
}
}
我愿意支持以下形式的请求:
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 终止程序使用它。如果它检测到后端正在响应特定的 URI,它会对 return HTTP 响应进行 monitor-uri hack,但我认为它不够灵活,无法处理不同的组件名称。
有谁知道使用 HAProxy 或其他工具(例如 NGinx)来处理此问题的方法吗?
根据您需要自定义响应的方式,这可以仅使用 HAProxy,并在 Lua 支持下编译。在这里,使用带有 Lua 5.3.4 的 HAProxy 1.6.12,我采用请求路径并将其按原样放入响应中,以进行自定义——基本上任何路径都只是被复制进来。如果需要修改,也可以使用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>
似乎是合法的。
出于对话的目的,并且因为灵活生成 HTTP 响应很有用,我尝试使用 nginx - 切换到 ssh。配置文件的非标准部分有一条规则将go客户端指向Bitbucket服务器:
location ~ "^(/[^/]+)(/[^/]+)?" {
if ($arg_go-get = "1") {
return 200 '<html><head><meta name="go-import" content="acme.com git ssh://acme.dev:7999"></head></html>';
}
}