我正在为我正在处理的项目配置 CI 环境,但我遇到了困难。在我在这里描述问题之前,我使用的工具和技术堆栈是:
- Teamcity 8.1.5 作为构建服务器,
- Git 作为源代码版本控制,
- GitFlow 作为 Git 工作流,
- TFS 2013 作为一个协作项目(绑定了 Git 存储库),
- GitVersion 作为标记程序集和发布的工具。
TFS 服务器同时支持:NTLM 和基本身份验证。
场景:
我想使用 GitVersion 工具在每个构建中自动标记源。这就是为什么作为第一个构建步骤,我使用命令添加了命令行步骤:
gitversion.exe "%system.teamcity.build.checkoutDir%" /output "buildserver"
/u "Domain\Username" /p "Pass"
存储库 url 由 GitVersion 自动从[checkout-dir]\.git\config
.
不幸的是,当我运行构建时,我收到一个异常:
LibGit2Sharp.LibGit2SharpException: Request failed with status code: 401
这是构建日志的输出:
[Step 2/5] Starting: C:\ProgramData\chocolatey\bin\gitversion.exe /output buildserver /u Domain\UserName /p password
[Step 2/5] in directory: C:\BuildAgent\work\Playground
[Step 2/5] Working directory: C:\BuildAgent\work\Playground [Step 2/5] Applicable build agent found: 'TeamCity'.
[Step 2/5] One remote found (origin -> 'http://our.tfs.server.lgbs:8080/tfs/project/_git/Playground').
[Step 2/5] Fetching from remote 'origin' using the following refspecs:
+refs/heads/*:refs/remotes/origin/*.
[Step 2/5] An unexpected error occurred:
[Step 2/5] LibGit2Sharp.LibGit2SharpException: Request failed with status code: 401
[Step 2/5] at LibGit2Sharp.Core.Ensure.HandleError(Int32 result)
[Step 2/5] at LibGit2Sharp.Core.Proxy.git_remote_fetch(RemoteSafeHandle remote, Signature signature, String logMessage)
[Step 2/5] at LibGit2Sharp.Network.DoFetch(RemoteSafeHandle remoteHandle, FetchOptions options, Signature signature, String logMessage)
[Step 2/5] at LibGit2Sharp.Network.Fetch(Remote remote, FetchOptions options, Signature signature, String logMessage)
[Step 2/5] at GitVersion.GitHelper.NormalizeGitDirectory(String gitDirectory, Authentication authentication)
而且我无法弄清楚它有什么问题。
当我直接从 Build Agent 机器上的 CMD 运行相同的命令时,它执行得非常好。
我已经尝试过的:
- 验证构建步骤命令在与我在 CMD 中手动尝试的命令相同的身份下运行,
- 将存储库凭据添加到 Windows 凭据存储,
- 使用 /url 开关将 url 直接传递给 GitVersion
- 将用户名作为 url 的一部分传递:
http://Domain\UserName@tfs-server-url\projectname
但失败并出现不同的错误:Malformed URL "http://Domain\UserName@tfs-server-url\projectname"
- 成功调用
git fetch
作为构建步骤(检查凭据是否正常), - 使用谷歌,但我没有发现类似的问题。
有没有人遇到过类似的问题?你会建议做什么?GitVersion 似乎别无选择。恐怕唯一的解决方法是关心手工标记,这不方便,尤其是使用 GitFlow。