【问题标题】:How do I pass information from one step in a TFS 2017 build to a later Copy Files step如何将信息从 TFS 2017 构建中的一个步骤传递到后面的复制文件步骤
【发布时间】:2018-03-15 13:17:12
【问题描述】:

好的 - 我已经阅读了有关环境变量的所有内容以及它们如何无法通过同一进程设置和读取(即使在构建的后续步骤中也无法读取):

Environment.SetEnvironmentVariable("Major_Build_Number", BaseReleaseNumber, EnvironmentVariableTarget.Machine)

那么有没有人想出一种简单的方法来将信息从一个构建步骤传递到另一个构建步骤?在我的第一步中,我确定了内部版本号(这是一个相当复杂的过程,信不信由你),我需要将该内部版本号传递给最后一个构建步骤(这是一个复制文件步骤),以便它可以将构建复制到以内部版本号命名的文件夹。我试过设置一个环境变量,但不幸的是不能从同一个会话中设置和读取。必须有一个简单的方法来做到这一点。是的,我可以编写一个 PS 或批处理脚本来执行此操作并将值存储在文件或注册表中,但我更喜欢使用 Copy Files 任务,但我不知道如何传递该值。

我尝试在构建定义中定义一个变量并将值存储在那里,但在构建定义中设置后我似乎无法更改该值。

顺便说一句,这是本地安装 - 不是 VSTS。

有人有什么想法吗?

感谢安迪您的回复。所以我在 SetBuildNumberENVVar.ps1 中尝试了这个

param([Int32]$MajorBuildNumber=0,[Int32]$MinorBuildNumber=0)

Write-Host "##vso[task.setvariable variable=MajorBuildNumber]$MajorBuildNumber"
Write-Host "##vso[task.setvariable variable=MinorBuildNumber]$MinorBuildNumber"

然后我从命令行运行它:

c:\powershell .\SetBuildNumberENVVar.ps1 23 45

然后尝试回显变量:

echo %MajorBuildNumber%
%MajorBuildNumber%

如您所见,它似乎不起作用。我从 C# 脚本中尝试过这个:

int.TryParse("$(MajorBuildNumber)", out mbn);

运行后 mbn = 0。

知道我做错了什么吗?

【问题讨论】:

    标签: environment-variables tfsbuild


    【解决方案1】:

    一般你可以使用预定义的变量$(Build.BuildNumber)来命名文件夹,它可以在整个构建过程中直接使用。详情请见Predefined variables

    如果您按照您所说的自定义内部版本号变量:“I determine the build number (this is a fairly complex process believe it or not)”。然后你可以通过Logging Command:##vso[task.setvariable]value:

    1. 在构建定义中添加 PowserShell 任务
    2. 复制并粘贴下面的脚本并将其保存为 *.ps1 文件

      $value= "The value of the build number here" Write-Host "##vso[task.setvariable variable=BuildNumber]$value"

    3. 签入 PS 文件,然后在 PowerShell 任务中运行 PS 文件

    之后,您可以在PowserShell 任务之后的任何任务中直接使用变量$BuildNumber

    您可以在另一个类似的帖子中参考我的答案:Custom TFS Enviroment Variable doesn't read $(Date)


    更新:

    您需要在 TFS 构建过程中运行 PowerShell 脚本。

    见下例:

    我创建了两个 PS 脚本,一个用于设置变量以传递值,另一个用于使用变量创建一个以传递的值命名的文件夹:

    PS1:PassBuildNumber

    param([Int32]$MajorBuildNumber=0,[Int32]$MinorBuildNumber=0)
    
    Write-Host "##vso[task.setvariable variable=MajorBuildNumber]$MajorBuildNumber"
    Write-Host "##vso[task.setvariable variable=MinorBuildNumber]$MinorBuildNumber"
    

    PS2 : 使用变量

    Write-Host "The Major build number is:" $env:MajorBuildNumber
    Write-Host "The Minor build number is:" $env:MinorBuildNumber
    
    $foldername = $env:MajorBuildNumber + "." + $env:MinorBuildNumber
    Write-Host "foldername:" $foldername
    
    $path = "\\myshare\DirA\$foldername"
    Write-Host "path:" $path
    
    New-Item -Path $path -ItemType directory # Create a folder
    Write-Host "##vso[task.setvariable variable=path]$path"  # Set path as a variable to be used in Copy Task
    

    然后您可以使用Copy Files 任务将文件复制到该文件夹​​。

    【讨论】:

    • 谢谢安迪。我无法格式化评论,因此我将用新问题编辑我的帖子,因为这似乎不起作用。请看看我的新 cmets,如果有机会,请告诉我我做错了什么。
    • @Ben_G 日志记录命令仅在 TFS/VSTS 构建/发布过程中可用。这意味着您需要在 TFS 中运行 powershell 脚本(本地命令行不可用)。只需完全按照我在上面答案中提到的步骤操作即可。
    • 所以我不能在构建开始时在 C# 程序中设置变量?我倾向于只将值写入 C# 程序中的文件,然后稍后在另一个 C# 程序或 PowerShell 脚本中读取它们。
    • @Ben_G 没有检查,但最简单的方法是使用我在上面的答案中提供的日志记录命令。设置变量后,您可以在后续步骤中使用 C# 程序或构建期间的 PowerShell 脚本中的变量。无论这里是 guide to set environment variables with C#,您都可以检查一下。
    • 嘿@Andy Li-MSFT - 所以我一直在工作,直到出现错误时的New_Item:New-Item:访问被拒绝。我可以从命令行运行 New-Item,我什至以运行 TFS Build 的服务登录,我也可以从那里的命令行运行它。知道发生了什么吗?我通过使用传入 -Credential 的 New-PSDrive 使其工作,然后使用该新映射驱动器创建文件夹,但这需要我在脚本中硬编码 ID 和密码,而我不想这样做。我将为此创建单独的帖子。
    猜你喜欢
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    • 2016-02-11
    • 1970-01-01
    • 2020-07-15
    相关资源
    最近更新 更多