10

我试图在 Visual Studio Team Services(不是 XAML)上使用新的构建,但无法弄清楚如何在成功构建后标记源。任何的想法?

下面是显示如何在 XAML 中执行的屏幕截图。

在此处输入图像描述

我已经在https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/9613014-allow-label-source-upon-succesful-build-on-visual提出功能请求我实际上是在要求一种解决方法,直到 Microsoft 实施它。

4

5 回答 5

20

我认为 Yves Dierick 在 2015 年 10 月的回答是正确的,但是从那时起 VSTS 屏幕的布局发生了很大变化。在最新版本(截至 2017 年 2 月)中,您可以通过选择 Build Definition 中的 Get Sources 任务,选择右上角的show Advanced Settings然后选择On success单选按钮,为成功的构建添加标签出现的标记源部分。

我花了一段时间才找到它,所以我认为它可能对其他人有帮助。此选项位于“标签来源”下并且根本没有提及“标签”一词,这无济于事。

在此处输入图像描述


2018 年 13 月 3 日更新

他们再次调整了此页面的布局,但如果有的话,让它变得更简单,现在该选项被命名为“标签来源”更有帮助。 用于标记构建的更新选项

于 2017-02-28T11:43:46.943 回答
16

我刚刚注意到该功能现在可以在 build vNext 中使用。它的配置位于构建定义的 Repository 选项卡中。

标签

于 2015-10-08T13:51:54.177 回答
3

对于那些在此线程中运行并寻找 TFS 托管(不是 VSO)解决方案的人,请注意 TFS 2015 更新 1 中提供了对构建标签的支持:https ://www.visualstudio.com/en-us/news/ tfs2015-update1-vs.aspx

我们还没有运行更新 1,所以我无法确认。

编辑:我们现在正在运行更新 1(实际上是 2),标签构建源适用于本地。

于 2016-02-22T23:10:14.347 回答
1

标签源功能在 vNext 版本中不可用。

除了 Label Sources 功能外,Associate Work Items 和 Create Work Item on Build Failure 功能也不可用。

您可以在 Microsoft UserVoice 网站上提交一项关于它的功能请求:https ://visualstudio.uservoice.com/forums/121579-visual-studio/category/30925-team-foundation-server-visual-studio-online

于 2015-09-03T03:27:20.300 回答
0

XAML 构建在构建开始时标记了源,而 vNext 构建似乎在构建结束时标记。我注意到了,因为我在构建过程中修改/签入/标签文件。如果我让 vNext 标记构建,它会将我在签入后应用于文件的标签移动到以前的版本(在 GetSources 中使用的版本)。

但是我在任何日志文件中都没有看到 vNext 的标签。我错过了吗?我将不得不在 vnext 中禁用标签并在我的 msbuild 脚本中执行此操作...

编辑:在 vnext 构建定义中禁用标签并创建一个 msbuild 内联任务来标记工作区的源。现在我可以在构建开始时标记所有源,并为在构建期间修改的文件移动标签:)

如果有人想做类似的事情,这是我的内联任务:

<!--
    TaskName="LabelWorkspaceSources"
    - input: TfexeFullPath is the path to tf.exe
    - input: BaseDirectory is the mapped folder of the software to build
    - input: Label to apply
    - input: Version is the changeset to apply the label to
-->
<UsingTask TaskName="LabelWorkspaceSources" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll">
    <ParameterGroup>
        <TfexeFullPath Required="true" />
        <BaseDirectory Required="true" />
        <Label Required="true" />
        <Version Required="true" />
    </ParameterGroup>
    <Task>
        <Code Type="Fragment" Language="cs">
        <![CDATA[

        //--- get the workspace mapping ---

        System.Diagnostics.Process tfProcess = new System.Diagnostics.Process();
        tfProcess.StartInfo.FileName = TfexeFullPath;
        tfProcess.StartInfo.Arguments = "workfold";
        tfProcess.StartInfo.UseShellExecute = false;
        tfProcess.StartInfo.CreateNoWindow = true;
        tfProcess.StartInfo.RedirectStandardOutput = true;
        tfProcess.StartInfo.WorkingDirectory = BaseDirectory;
        tfProcess.Start();

        string output = tfProcess.StandardOutput.ReadToEnd();

        tfProcess.WaitForExit();

        string workfoldOutput = output.Trim();
        Log.LogMessage(workfoldOutput, MessageImportance.High);

        string[] linesWorkfoldOutput = workfoldOutput.Split(new string[] { System.Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
        List<string> mappedFolders = new List<string>();

        Log.LogMessage("Trying to parse mapped folders.", MessageImportance.High);
        foreach (string line in linesWorkfoldOutput)
        {
            //e.g. $/TPA: C:\TFS_Source\TPA
            if (line.Contains("$/"))
            {
                string[] lineSplit = line.Split(new string[] { ": " }, StringSplitOptions.RemoveEmptyEntries);

                //entry lineSplit[0] now contains the server path, lineSplit[1] contains the local folder
                mappedFolders.Add(lineSplit[1]);
                Log.LogMessage("Found mapped folder: " + lineSplit[1], MessageImportance.High);
            }
        }


        //--- label all the mapped folders ---

        foreach (string mappedFolder in mappedFolders)
        {
            tfProcess = new System.Diagnostics.Process();
            tfProcess.StartInfo.FileName = TfexeFullPath;
            tfProcess.StartInfo.Arguments = "label " + Label + " \"" + mappedFolder + "\" /child:replace /recursive /comment:\"Label created by task LabelWorkspaceSources\" /version:" + Version;
            tfProcess.StartInfo.UseShellExecute = false;
            tfProcess.StartInfo.CreateNoWindow = true;
            tfProcess.StartInfo.RedirectStandardOutput = true;
            tfProcess.StartInfo.WorkingDirectory = mappedFolder;
            tfProcess.Start();

            output = tfProcess.StandardOutput.ReadToEnd();

            tfProcess.WaitForExit();

            Log.LogMessage(tfProcess.StartInfo.Arguments, MessageImportance.High);
            Log.LogMessage(output, MessageImportance.High);
        }
        ]]>
        </Code>
    </Task>
</UsingTask>
于 2017-11-13T09:27:32.130 回答