【问题标题】:TFS vNext Build: GetSources task does not get files from folder with restricted accessTFS vNext Build:GetSources 任务未从访问受限的文件夹中获取文件
【发布时间】:2018-07-05 15:16:23
【问题描述】:

我们目前正在从 XAML 构建迁移到 vNext (TFS2017)。 “正常”构建工作正常,但我们的 LicenseManager 构建不起作用。 包含 LicenseManager 源代码的文件夹只能由特定用户访问。 因此,我配置了一个 vNext 构建代理,其中构建服务在可以访问源代码的帐户上运行(就像我们对 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\1\s\TPA\BuildVNext\1.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\1\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\1\s\TPA\DevTools\internal\BuildHelper\1.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\1\s\TPA\DevTools\internal\ReferenceManager\1.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\1\s\TPA\DevTools\external\MsBuild\ExtensionPack\4.0.9 /collection:http://tfs.:8080/tfs/DefaultCollection/ /loginType:OAuth /login:.,******** /noprompt
tf vc get /version:178702 /recursive /overwrite D:\b\a1\_w\1\s /loginType:OAuth /login:.,******** /noprompt

除“LicenseMgr\dev\main”(访问受限的文件夹)之外的所有文件夹都将被下载。 但是当我打开 VisualStudio 时,选择构建期间创建的工作区,然后选择“获取最新”,它确实下载代码没有任何问题。

任何帮助表示赞赏!

最好的问候 伯恩德

编辑: 我在构建计算机的 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\1\s\TPA\BuildVNext\1.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\1.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\1.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\4.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\1\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\1\s\TPA\BuildVNext\1.7 is already mapped in workspace ws_1_12;Build\beb2741f-e779-4a6f-a20e-033796fec5b7.

D:\b\a1\_w\1\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\1\s>tf vc workfold /map /workspace:ws_1_12 $/TPA/BuildVNext/1.7 D:\b\a1\_w\1\s\TPA\BuildVNext\1.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\1\s>tf vc workfold /map /workspace:ws_1_12 $/TPA/DevTools/internal/BuildHelper/1.6 D:\b\a1\_w\1\s\TPA\DevTools\internal\BuildHelper\1.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\1\s>tf vc workfold /map /workspace:ws_1_12 $/TPA/DevTools/internal/ReferenceManager/1.9 D:\b\a1\_w\1\s\TPA\DevTools\internal\ReferenceManager\1.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\1\s>tf vc workfold /map /workspace:ws_1_12 $/TPA/DevTools/external/MsBuild/ExtensionPack/4.0.9 D:\b\a1\_w\1\s\TPA\DevTools\external\MsBuild\ExtensionPack\4.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\1\s>tf vc workfold /map /workspace:ws_1_12 $/TPA/LicenseMgr/dev/main D:\b\a1\_w\1\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\1\s>tf vc get /version:178749 /recursive /overwrite D:\b\a1\_w\1\s /noprompt 
D:\b\a1\_w\1\s\TPA\LicenseMgr\dev:
Getting main

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

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

因此,原始 GetSources 任务中的 /loginType:OAuth 对我造成了问题。没有 /loginType 的相同命令确实有效!

【问题讨论】:

  • 当您使用 Visual Studio 并选择工作区以获取最新版本时,您实际使用的是哪个帐户?与构建代理上的构建服务帐户是否相同?
  • 是的,运行构建服务的账号是一样的。

标签: security tfs build vnext


【解决方案1】:

似乎问题仍然与权限有关。建议您仔细检查相关帐户权限,并在构建代理上授予其本地管理员权限。

您还可以在构建定义中禁用默认获取源步骤。并使用您自己的脚本来获取源/拉文件,看看您是否遇到相同的情况。怎么做,请关注:Is it able to ignore/disable the first step Get source in vNext Build?

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

【讨论】:

  • 虽然这可能行得通,但它不需要更多的手动工作吗? “构建解决方案”步骤和“发布人工制品”步骤也必须进行调整。 P.S.:该帐户确实具有本地管理员权限。
  • @PainElemental 您可以先忽略构建和发布步骤,只需检查文件是否可以通过这种方式下拉。如果问题与您的构建服务帐户有关,这将缩小范围。另一种方法是使用构建服务账号运行tf命令行直接获取文件,看看是否有效。还要设置 clean workspace = true,每次构建触发时强制它获取所有文件。以上所有内容都只是试图帮助缩小问题范围。
  • 好的,所以我发现将 SyncSources 设置为 false 不是一个选项,因为这样所有变量 'BUILD_SOURCESDIRECTORY'、'BUILD_SOURCEVERSION' 等都没有设置。
  • 我在构建计算机的 d:\ 驱动器中添加了一个简单的批处理脚本,该脚本与 GetSources 任务相同,但未指定 LoginType。这确实有效!当我在构建中的 GetSources 任务之后立即运行此脚本时,它会下载所有源代码!
  • 我无法发表长评论。请在原始问题中查看我的编辑。
【解决方案2】:

终于找到了问题的根源: 在 XAML 构建中,配置为运行构建服务的帐户也用于创建工作区和获取源。 在 vNext 构建中,“项目集合构建服务”用于创建工作区并获取源。 “项目集合构建服务”帐户无权访问 LicenseManager 源代码。

在授予“项目集合构建服务”帐户对 LicenseManager 源代码的访问权限后,一切正常:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-14
    • 2016-06-02
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    • 2020-12-23
    相关资源
    最近更新 更多