我有一個 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并確認我的管道現在按預期作業。
uj5u.com熱心網友回復:
發生這種情況的原因是您master在拉取請求完成后運行管道。那時管道正在比較master并且origin/master它們總是相等的,所以差異不會找到任何東西。
進行差異的另一種方法是將您的 HEAD 提交與它的第一個父提交進行比較,如下所示:
git diff HEAD~1 HEAD
# or using @ syntax for HEAD
git diff @~1 @
# or using merge commit syntax
git diff @^ @
僅當您的 PR 使用 Merge、Semi-Linear Merge 或 Squash Merge 完成時,比較這 2 個提交才有效。
如果您使用變基和快進 PR 完成策略,您將不會從查看分支歷史記錄中知道有多少提交是“新的”,因此您需要存盤上次運行時的提交 ID管道作為起點。
旁注:如果可以在管道運行之間完成多個 PR,那么您可能會錯過一些更改。克服這個問題的一些方法是將管道運行排隊,這樣每次運行都會針對特定的提交發生,并且不會跳過已完成的 PR,或者保存運行管道的最后一個提交 ID,如 rebase 和 fast-前進完成戰略。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/485401.html
標籤:混帐 天蓝色的devops 天蓝色管道
