更改项目文件并签入更改的 VSTS 任务

VSTS Task that changes project files and checks in the changes

在 TFS 2015 中,我们创建了一个 vNext (VSTS) 任务,它会找到一个选定的文件,替换一个标记(版本号是它开始的地方)写出对文件的更改,然后检查文件对变化的性质发表评论。它在构建过程中通过自动化完成了这一切。

我们即将升级到 DevOps 2020,2015 年的 TFS 管理工具已被弃用,这本身就很好,但是,我们仍然需要在构建过程中自动执行这些文件更改,包括签入注意变化的性质。

老任务惨败,直接移植过来。我已将该过程重写为 C# 控制台应用程序项目,并计划在 PowerShell 脚本期间调用它,但我遇到了该计划的许多障碍。

到目前为止我做了什么。

  1. 我已经为 VSTS 任务编写了一个 task.json,它接受传递给 PowerShell 脚本的参数。

  2. 我编写了一个 PowerShell 脚本,它调用 C# 控制台应用程序来定位和更改任务指定的文件中的标记。修改文件内容后,覆盖原文件

我似乎有两个问题,到目前为止,我无法解决。

  1. 我希望(如果任务参数指示)将管道环境变量 $env:BUILD_BUILDNUMBER 更改为 C# 代码中的新值。我正在使用以下使用第三个参数的 C# 命令,期望这将允许管道查看它对变量所做的更改:Environment.SetEnvironmentVariable("BUILD_BUILDNUMBER", buildNumber, EnvironmentVariableTarget.Machine ); (我也尝试过不带参数以及用户和进程,但无济于事。)变量不会 'set' 让管道在控制台应用程序之外看到。
  2. 我需要检查在步骤 2 中从 C# 代码所做的更改,并通过简短注释返回到代码存储库。管道确实调用 tf 的初始 'Get',但我没有取得同样的成功。我发现,如果我在构建机器上调用 VS2019 的 tf.exe 副本或 'externals' 中的代理副本,无论是从 C# 还是从后来的 PowerShell 脚本,我都会得到“##[error]Unable to确定工作区。您可以通过 运行ning 'tf workspaces /collection:TeamProjectCollectionUrl' 更正此问题”不用说,后面对 运行 tf 工作区的说明无济于事。

我希望这些事情有简单的解决方案。我已经搜索过,但没有找到 API 调用 DevOps 2020 来检查代码。也许那不存在。至于环境变量,我对为什么 EnvironmentVariableTarget.Machine 不起作用有点疑惑。我怀疑它与未调用的 ##vso[] 方法有关,但我不确定如何从控制台应用程序传递我的发现(成功也需要 return 0,否则失败, ) 到可以更轻松地更改变量的 PowerShell 脚本。

如果对此有任何好主意,我将非常感谢您提供的见解。我从事这项工作已有一段时间了,但我不确定要完成这项工作还需要考虑什么。

使用 TFVC 而不是 Git,以及许多其他小的遗留技术项目,使得使用新工具更难理解,就像在这种情况下一样。

所以我的第一个问题项目,在构建开始之前更新构建任务中的环境构建号。我能够通过我的 C# 代码设置变量,方法是打开一个 PowerShell 进程,该进程采用一个参数来使用 PowerShell 中的 ##vso[Build.UpdateBuildNumber] 函数更新变量。执行此操作的 C# 代码如下所示:

        var ps = @$"C:\Windows\System32\WindowsPowerShell\v1.0\PowerShell.exe";
        var script = $@"SetEnvironmentBuildNumber.ps1";
        if (File.Exists( script )){
            if ( File.Exists( ps ) )
            {
                await Task.Run( () =>
                {
                    var scriptWithArguments = string.Concat( Path.Combine( Directory.GetCurrentDirectory(), script ), " -newBuildNumber ", newBuildNumber);
                    Process.Start( ps, scriptWithArguments );

                } );
            }
            else
            {
                Console.WriteLine( $"PowerShell File Not found at: {ps}" );
            }
        }
        else
        {
            Console.WriteLine( $"The current directory is: {Directory.GetCurrentDirectory()}");
            Console.WriteLine($"Script File Not found at: {script}");
        }

SetEnvronemntBuildNumber.ps1 中的 PowerShell 脚本如下所示:

[CmdletBinding()]
param(
[string][Parameter(Mandatory=$true)]$newBuildNumber
)
Write-Host( "Setting the new build number - " + $newBuildNumber )
Write-Host( "##vso[Build.UpdateBuildNumber]$newBuildNumber" )

事实证明,这个练习帮助我理解了 Undetermined Workspace,我的问题 #2。

如果您查看我的 C# 代码的 if 语句,您会注意到检查当前工作目录的目录。发现我的新任务将当前工作目录更改为我的任务位置而不是管道的工作目录让我有理由暂停。

尽管如此,我脱离了 C# 代码,回到了我的 PowerShell 脚本,但我不是在查看解决方案的目录,而是在查看任务目录。如果我从此视图调用 tf,则没有源代码,因此无法确定 WorkSpace。

解决方案很简单,可以说有一个管道系统环境变量可以让我回到家。如下调用 PS Set-Location,就在我调用 tf vc 签入之前...允许 tf 找到工作区并保存我的更改。

Set-Location $env:System_DefaultWorkingDirectory

这就是它所需要的全部,所有这些调整都足够无辜,但如果没有任何 DevOps 管道方式的正式培训,诊断起来非常麻烦。我期待更多 'fun' 与 DevOps,当我们试图弄清楚如何从 TFVC 到达 Git 时......我相信并非我们所有的遗产都会看到如此重大的变化。

感谢您的建议,我希望这可以帮助其他受困于遗留世界并试图摆脱困境的可怜人。