TFS vNext Build:GetSources 任务无法从访问受限的文件夹中获取文件

TFS vNext Build: GetSources task does not get files from folder with restricted access

我们目前正在从 XAML 构建迁移到 vNext (TFS2017)。 "normal" 构建工作正常,但我们的 LicenseManager 构建不起作用。 包含 LicenseManager 源代码的文件夹只能由特定用户访问。 所以我配置了一个 vNext 构建代理,其中构建服务 运行s 在一个可以访问源代码的帐户上(就像我们对 xaml 构建所做的那样)。 我使用 Capabilities and Demands 强制在该代理上构建 LicenseManager。

但是GetSources 任务不会下载LicenseManager 的源代码。 这些是 GetSources 任务使用的命令:

tf vc workspace /new /location:local /permission:Public ws_1_12 /collection:http://tfs:8080/tfs/DefaultCollection/ /loginType:OAuth /login:.,******** /noprompt
tf vc workfold /unmap /workspace:ws_1_12 $/ /collection:http://tfs:8080/tfs/DefaultCollection/ /loginType:OAuth /login:.,******** /noprompt
tf vc workfold /map /workspace:ws_1_12 $/TPA/BuildVNext/1.7 D:\b\a1\_w\s\TPA\BuildVNext.7 /collection:http://tfs:8080/tfs/DefaultCollection/ /loginType:OAuth /login:.,******** /noprompt
tf vc workfold /map /workspace:ws_1_12 $/TPA/LicenseMgr/dev/main D:\b\a1\_w\s\TPA\LicenseMgr\dev\main /collection:http://tfs:8080/tfs/DefaultCollection/ /loginType:OAuth /login:.,******** /noprompt
tf vc workfold /map /workspace:ws_1_12 $/TPA/DevTools/internal/BuildHelper/1.6 D:\b\a1\_w\s\TPA\DevTools\internal\BuildHelper.6 /collection:http://tfs:8080/tfs/DefaultCollection/ /loginType:OAuth /login:.,******** /noprompt
tf vc workfold /map /workspace:ws_1_12 $/TPA/DevTools/internal/ReferenceManager/1.9 D:\b\a1\_w\s\TPA\DevTools\internal\ReferenceManager.9 /collection:http://tfs:8080/tfs/DefaultCollection/ /loginType:OAuth /login:.,******** /noprompt
tf vc workfold /map /workspace:ws_1_12 $/TPA/DevTools/external/MsBuild/ExtensionPack/4.0.9 D:\b\a1\_w\s\TPA\DevTools\external\MsBuild\ExtensionPack.0.9 /collection:http://tfs.:8080/tfs/DefaultCollection/ /loginType:OAuth /login:.,******** /noprompt
tf vc get /version:178702 /recursive /overwrite D:\b\a1\_w\s /loginType:OAuth /login:.,******** /noprompt

下载除 'LicenseMgr\dev\main'(访问受限的文件夹)之外的所有文件夹。 但是当我打开 VisualStudio 时,select 在构建过程中创建的工作区和 select "Get Latest",它下载代码没有任何问题。

感谢任何帮助!

最好的问候 伯恩德

编辑: 我在构建计算机的 d: 驱动器中添加了一个简单的批处理脚本,并在 GetSources 任务完成后 运行 该脚本。这确实下载了所有源!!!

这是脚本:

tf vc workspace /new /location:local /permission:Public %BUILD_REPOSITORY_TFVC_WORKSPACE% /collection:http://tfs.net:8080/tfs/DefaultCollection/ /noprompt
tf vc workfold /unmap /workspace:%BUILD_REPOSITORY_TFVC_WORKSPACE% $/ /collection:http://tfs.net:8080/tfs/DefaultCollection/ /noprompt
tf vc workfold /map /workspace:%BUILD_REPOSITORY_TFVC_WORKSPACE% $/TPA/BuildVNext/1.7 D:\b\a1\_w\s\TPA\BuildVNext.7 /collection:http://tfs.net:8080/tfs/DefaultCollection/ /noprompt
tf vc workfold /map /workspace:%BUILD_REPOSITORY_TFVC_WORKSPACE% $/TPA/DevTools/internal/BuildHelper/1.6 %BUILD_SOURCESDIRECTORY%\TPA\DevTools\internal\BuildHelper.6 /collection:http://tfs.net:8080/tfs/DefaultCollection/ /noprompt
tf vc workfold /map /workspace:%BUILD_REPOSITORY_TFVC_WORKSPACE% $/TPA/DevTools/internal/ReferenceManager/1.9 %BUILD_SOURCESDIRECTORY%\TPA\DevTools\internal\ReferenceManager.9 /collection:http://tfs.net:8080/tfs/DefaultCollection/ /noprompt
tf vc workfold /map /workspace:%BUILD_REPOSITORY_TFVC_WORKSPACE% $/TPA/DevTools/external/MsBuild/ExtensionPack/4.0.9 %BUILD_SOURCESDIRECTORY%\TPA\DevTools\external\MsBuild\ExtensionPack.0.9 /collection:http://tfs.net:8080/tfs/DefaultCollection/ /noprompt
tf vc workfold /map /workspace:%BUILD_REPOSITORY_TFVC_WORKSPACE% $/TPA/LicenseMgr/dev/main %BUILD_SOURCESDIRECTORY%\TPA\LicenseMgr\dev\main /collection:http://tfs.net:8080/tfs/DefaultCollection/ /noprompt
tf vc get /version:%BUILD_SOURCEVERSION% /recursive /overwrite %BUILD_SOURCESDIRECTORY% /noprompt

正如我所说,这确实下载了所有源,但请查看错误消息,尤其是工作区的帐户信息:

D:\b\a1\_w\s>tf vc workspace /new /location:local /permission:Public ws_1_12 /collection:http://tfs.net:8080/tfs/DefaultCollection/ /noprompt 
The path D:\b\a1\_w\s\TPA\BuildVNext.7 is already mapped in workspace ws_1_12;Build\beb2741f-e779-4a6f-a20e-033796fec5b7.

D:\b\a1\_w\s>tf vc workfold /unmap /workspace:ws_1_12 $/ /collection:/collection:http://tfs.net:8080/tfs/DefaultCollection//noprompt 
TF14061: The workspace ws_1_12;Build_LicenseMgr does not exist.

D:\b\a1\_w\s>tf vc workfold /map /workspace:ws_1_12 $/TPA/BuildVNext/1.7 D:\b\a1\_w\s\TPA\BuildVNext.7 /collection:/collection:http://tfs.net:8080/tfs/DefaultCollection/ /noprompt 
TF14061: The workspace ws_1_12;Build_LicenseMgr does not exist.

D:\b\a1\_w\s>tf vc workfold /map /workspace:ws_1_12 $/TPA/DevTools/internal/BuildHelper/1.6 D:\b\a1\_w\s\TPA\DevTools\internal\BuildHelper.6 /collection:/collection:http://tfs.net:8080/tfs/DefaultCollection/ /noprompt 
TF14061: The workspace ws_1_12;Build_LicenseMgr does not exist.

D:\b\a1\_w\s>tf vc workfold /map /workspace:ws_1_12 $/TPA/DevTools/internal/ReferenceManager/1.9 D:\b\a1\_w\s\TPA\DevTools\internal\ReferenceManager.9 /collection:/collection:http://tfs.net:8080/tfs/DefaultCollection/ /noprompt 
TF14061: The workspace ws_1_12;Build_LicenseMgr does not exist.

D:\b\a1\_w\s>tf vc workfold /map /workspace:ws_1_12 $/TPA/DevTools/external/MsBuild/ExtensionPack/4.0.9 D:\b\a1\_w\s\TPA\DevTools\external\MsBuild\ExtensionPack.0.9 /collection:/collection:http://tfs.net:8080/tfs/DefaultCollection/ /noprompt 
TF14061: The workspace ws_1_12;Build_LicenseMgr does not exist.

D:\b\a1\_w\s>tf vc workfold /map /workspace:ws_1_12 $/TPA/LicenseMgr/dev/main D:\b\a1\_w\s\TPA\LicenseMgr\dev\main /collection:/collection:http://tfs.net:8080/tfs/DefaultCollection/ /noprompt 
TF14061: The workspace ws_1_12;Build_LicenseMgr does not exist.

D:\b\a1\_w\s>tf vc get /version:178749 /recursive /overwrite D:\b\a1\_w\s /noprompt 
D:\b\a1\_w\s\TPA\LicenseMgr\dev:
Getting main

编辑2: 为了使我的构建工作,我只需要在批处理脚本中的一行:

tf vc get /version:%BUILD_SOURCEVERSION% /recursive /overwrite %BUILD_SOURCESDIRECTORY% /noprompt

原来 GetSources 任务中的 /loginType:OAuth 是我的问题所在。没有 /loginType 的相同命令也有效!

看来问题还是和权限有关。建议您仔细检查相关帐户权限,并在构建代理上为其授予本地管理员权限。

您还可以禁用构建定义中的默认获取源步骤。并用自己的脚本做get source/pull files 看是否得到同样的情况。如何使用,请关注:

编写一个 powershell 脚本来执行整个获取源选项,并使用具有足够权限的帐户来下载受限的 LicenseManager 文件夹。

终于找到问题根源了: 在 XAML 中构建配置为 运行 的帐户,构建服务还用于创建工作区和获取源代码。 在 vNext 构建中,"Project Collection Build Service" 用于创建工作区和获取源代码。 "Project Collection Build Service" 帐户无权访问 LicenseManager 源代码。

在授予 "Project Collection Build Service" 帐户对 LicenseManager 源代码的访问权限后,一切正常:)