如何将信息从 TFS 2017 构建中的一个步骤传递到稍后的复制文件步骤
How do I pass information from one step in a TFS 2017 build to a later Copy Files step
好的 - 我已经阅读了所有关于环境变量的内容以及它们如何不能被同一个进程设置和读取(即使这不能被构建的后续步骤读取):
Environment.SetEnvironmentVariable("Major_Build_Number", BaseReleaseNumber, EnvironmentVariableTarget.Machine)
那么有没有人想出一种简单的方法来将信息从一个构建步骤传递到另一个构建步骤?在我的第一步中,我确定了内部版本号(不管你信不信,这是一个相当复杂的过程),我需要将该内部版本号传递给最后一个构建步骤(这是一个复制文件步骤),以便它可以将内部版本复制到以内部版本号命名的文件夹。我试过设置一个环境变量,但不幸的是不能在同一个会话中设置和读取。必须有一个简单的方法来做到这一点。是的,我可以编写 PS 或批处理脚本来执行此操作并将值存储在文件或注册表中,但我更愿意使用“复制文件”任务,但我不知道如何传递该值.
我尝试在构建定义中定义一个变量并将值存储在那里,但我似乎无法在构建定义中设置该值后更改它。
顺便说一句,这是本地安装 - 不是 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 在此之后 运行s.
知道我做错了什么吗?
一般可以使用预定义的变量$(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
:
- 在您的构建定义中添加一个 PowserShell 任务
复制并粘贴以下脚本并将其保存为 *.ps1 文件
$value= "The value of the build number here"
Write-Host "##vso[task.setvariable variable=BuildNumber]$value"
- 签入 PS 文件,然后 运行 PowerShell 任务中的 PS 文件
之后,您可以在任何PowserShell任务.
后面的任务中直接使用变量$BuildNumber
您可以在另一个类似的帖子中参考我的回答:
更新:
您需要 运行 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任务将文件复制到该文件夹。
好的 - 我已经阅读了所有关于环境变量的内容以及它们如何不能被同一个进程设置和读取(即使这不能被构建的后续步骤读取):
Environment.SetEnvironmentVariable("Major_Build_Number", BaseReleaseNumber, EnvironmentVariableTarget.Machine)
那么有没有人想出一种简单的方法来将信息从一个构建步骤传递到另一个构建步骤?在我的第一步中,我确定了内部版本号(不管你信不信,这是一个相当复杂的过程),我需要将该内部版本号传递给最后一个构建步骤(这是一个复制文件步骤),以便它可以将内部版本复制到以内部版本号命名的文件夹。我试过设置一个环境变量,但不幸的是不能在同一个会话中设置和读取。必须有一个简单的方法来做到这一点。是的,我可以编写 PS 或批处理脚本来执行此操作并将值存储在文件或注册表中,但我更愿意使用“复制文件”任务,但我不知道如何传递该值.
我尝试在构建定义中定义一个变量并将值存储在那里,但我似乎无法在构建定义中设置该值后更改它。
顺便说一句,这是本地安装 - 不是 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 在此之后 运行s.
知道我做错了什么吗?
一般可以使用预定义的变量$(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
:
- 在您的构建定义中添加一个 PowserShell 任务
复制并粘贴以下脚本并将其保存为 *.ps1 文件
$value= "The value of the build number here" Write-Host "##vso[task.setvariable variable=BuildNumber]$value"
- 签入 PS 文件,然后 运行 PowerShell 任务中的 PS 文件
之后,您可以在任何PowserShell任务.
后面的任务中直接使用变量$BuildNumber
您可以在另一个类似的帖子中参考我的回答:
更新:
您需要 运行 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任务将文件复制到该文件夹。