我有一个Azure DevOps管道,它执行一个Powershell任务,在提交拉取请求后为每个更改的文件创建工件。但是,我不能返回修改过的/新的文件来创建这些工件。当我在本地测试时,我可以很容易地获取修改后的文件名,但是在管道本身中,返回的结果是空白的:
$changes = git diff --name-only --relative --diff-filter=M origin/master --name-only -- .
完整.yml代码:
trigger:
- master
pool:
vmImage: windows-latest
jobs:
- job: get_changed_files
steps:
- task: PowerShell@2
inputs:
targetType: 'inline'
script: |
$targetfolder = "$(Build.StagingDirectory)" + "/"
function CopyFiles{
param( [string]$source )
$target = $targetfolder + $source
New-Item -Force $target
copy-item $source $target -Force
}
$changes = git diff --name-only --relative --diff-filter=M origin/master --name-only -- .
write-host "test"
$changes
if ($changes -is [string]){ CopyFiles $changes }
else
{
if ($changes -is [array])
{
foreach ($change in $changes){ CopyFiles $change }
}
}
- task: PublishBuildArtifacts@1
inputs:
pathToPublish: $(Build.StagingDirectory)
artifactName: MyChangedFiles
更新:我将我的diff命令切换为以下命令:git diff --name-only --relative --diff-filter=AM HEAD^ HEAD
并确认我的管道现在可以按预期工作。
1条答案
按热度按时间inb24sb21#
发生这种情况的原因是,在Pull Request完成后,您正在针对
master
运行管道。此时,管道正在比较master
和origin/master
,它们总是相等的,所以diff不会找到任何东西。另一种比较的方法是比较你的HEAD提交和它的第一个父提交,像这样:
比较这两个提交只会在你的PR是使用Merge,Semi-Linear Merge,或Squash Merge完成的情况下起作用。
如果你使用一个rebase和快进PR完成策略,你不会从查看分支历史中知道有多少提交是“新的”,所以你需要存储你上次运行管道时的提交ID作为起点。
**旁注:**如果在管道运行之间可以完成多个PR,则可能会遗漏一些更改。克服这一点的一些方式是将流水线运行排队,使得每个运行针对特定提交发生并且没有完成的PR被跳过,或者保存流水线针对其运行的最后一个提交ID,如针对变基和快进完成策略所描述的。