我在公司防火墙后面的 Windows Server 2012 机器上安装了 TeamCity,该防火墙需要通过代理服务器进行用户身份验证才能访问互联网。
我想将 TeamCity 连接到托管我们项目的 Bitbucket (git),以便下载代码并在公司网络内构建和部署。
通过 SourceTree(Git Windows 客户端)和命令行单独使用 Git 即可正常工作。我已将代理设置添加到 .gitconfig,它可以通过代理通过 https 顺利连接。
到目前为止一切顺利。但是当我尝试让 TeamCity 与 bitbucket 对话时,我收到一个错误:
连接失败! 列出远程引用失败:java.netConnectException:连接被拒绝:连接 bitbucket.org
我查看了文档,发现如果您想通过代理连接,则需要将凭据传递给运行 TeamCity 的 JVM。由于我在 Windows Server 2012 上,并且 TeamCity 作为服务运行,因此这应该通过设置环境变量来实现,如下所示:
TEAMCITY_SERVER_OPTS
-Dproxyset=true
-Dhttp.proxyHost=11.111.1.11
-Dhttp.proxyPort=8080
-Dhttp.proxyUser=username
-Dhttp.proxyPassword=password
-Dhttp.nonProxyHosts=localhost|127.0.0.1
-Dhttps.proxyHost=11.111.1.11
-Dhttps.proxyPort=8080
-Dhttps.proxyUser=username
-Dhttps.proxyPassword=password
-Dhttps.nonProxyHosts=localhost|127.0.0.1
我创建了一个系统级环境变量并重新启动了服务器,然后出现以下错误:
https://bitbucket.org/teamname/example.git:407 需要代理身份验证(Forefront TMG 需要授权才能完成请求。拒绝访问 Web 代理筛选器。)
所以这给我留下了两种可能性
- 防火墙阻止了该请求,因为它来自 Windows 服务
- 用户名和密码未被传递
团队城市文档不要提及 proxyUser 和 proxyPassword 参数,我在查看了可用的 JVM 代理参数后自己插入了它们。
我已经请我们的一位网络人员检查一下防火墙(不是今天),但与此同时,如果有人有这方面的经验,并且知道我是否遗漏了什么,请告诉我。任何帮助都将不胜感激。
2016 年 2 月 16 日更新
在查看 JetBrains 支持站点时,我发现了以下内容:
您好,我们不支持通过命令行进行代理身份验证。仅通过设置参数是行不通的。
另外,上述选项仅适用于使用 TC 服务器 JVM 执行的 Java 代码。但是,我们经常使用本机客户端访问 VCS:hg、perforce 和 TFS。Git 和 svn 使用 Java 库。
因此看来环境变量方法是死路一条,必须考虑使用 Git 客户端来建立连接。
答案1
因此,如何让 TeamCity 在 NTLM 代理服务器后面工作的答案就是作弊。
最后我安装了一个名为CNTLM 身份验证代理,它位于 TeamCity 和我的 NTLM 代理之间并处理所有请求。
当它工作时,我可以连接到 bitbucket 并触发构建等,这很棒。但我应该提醒一句,在 Windows Server 2012 R2 上,它经常崩溃。我们一开始并没有注意到这一点,但随着我们向 TeamCity 添加应用程序,我们每天都会遇到多次崩溃,需要重新启动 CNTLM 服务。
我现在有了一个新的无身份验证代理设置来解决这个问题。您的情况可能会有所不同。
要将 TeamCity 连接到 CNTLM,您需要添加一个环境变量 TEAMCITY_SERVER_OPTS,其值如下
-Dproxyset=true -Dhttp.proxyHost=localhost -Dhttp.proxyPort=3128 -Dhttp.nonProxyHosts="localhost|127.0.0.1" -Dhttps.proxyHost=localhost -Dhttps.proxyPort=3128 -Dhttps.nonProxyHosts="localhost|127.0.0.1"
安装后,CNTLM 会监听端口 3128。更改/添加此项后,您需要重新启动 TeamCity 服务和代理。