如何使用 Azure devops 管道仅获取更改的文件
How to get only changed files using Azure devops pipelines
我在源代码中有这样的文件夹结构。
f1
f2
f3
f4
我在我的管道中添加了 gitcopy diff 任务,该任务列出并复制修改到目标文件夹的文件。
现在,我想有一个条件循环作为 powershell 脚本,只压缩那些修改了具有特定名称的文件的文件夹,例如,如果修改了来自 f1 的文件..我想执行特定的步骤等等..我怎么能做一个循环?
编辑:我用这种方式编写了我的管道。但是它在发布步骤中失败并出现所列错误。
亚姆:
触发器:
none
pool:
vmImage: 'windows-latest'
variables:
FR1PHPPRDAPP1VFlag: false
FR1PHPPRDAPP4VFlag: false
FR1PHPPRDAPP5VFlag: false
FR1PHPPRDSRE1VFlag: false
FR1PHPPRDAPP7VFlag: false
stages:
-stage: Zipping modified folders
steps:
- powershell: |
## get the changed files
$files=$(git diff HEAD HEAD~ --name-only)
$temp=$files -split ' '
$count=$temp.Length
echo "Total changed $count files"
For ($i=0; $i -lt $temp.Length; $i++)
{
$name=$temp[$i]
echo "this is $name file"
if ($name -like 'FR1PHPPRDAPP1V/*')
{
cd $(Build.ArtifactStagingDirectory)
mkdir Output -force
Compress-Archive -Path $(system.defaultworkingdirectory)/FR1PHPPRDAPP1V -DestinationPath $(Build.ArtifactStagingDirectory)/Output/APP1V.zip
##set the flag variable FR1PHPPRDAPP1VFlag to true
Write-Host "##vso[task.setvariable variable=FR1PHPPRDAPP1VFlag]true"
}
if ($name -like 'FR1PHPPRDAPP4V/*')
{
cd $(Build.ArtifactStagingDirectory)
mkdir Output -force
##achive folder FR1PHPPRDAPP4V if it is changed.
Compress-Archive -Path $(system.defaultworkingdirectory)/FR1PHPPRDAPP4V -DestinationPath $(Build.ArtifactStagingDirectory)/Output/APP4V.zip
##set the flag variable FR1PHPPRDAPP4VFlag to true
Write-Host "##vso[task.setvariable variable=FR1PHPPRDAPP4VFlag]True"
}
if ($name -like 'FR1PHPPRDAPP5V/*')
{
cd $(Build.ArtifactStagingDirectory)
mkdir Output -force
##achive folder FR1PHPPRDAPP5V if it is changed.
Compress-Archive -Path $(system.defaultworkingdirectory)/FR1PHPPRDAPP5V -DestinationPath $(Build.ArtifactStagingDirectory)/Output/APP5V.zip
##set the flag variable FR1PHPPRDAPP5VFlag to true
Write-Host "##vso[task.setvariable variable=FR1PHPPRDAPP5VFlag]True"
}
if ($name -like 'FR1PHPPRDSRE1V/*')
{
cd $(Build.ArtifactStagingDirectory)
mkdir Output -force
##achive folder FR1PHPPRDSRE1V if it is changed.
Compress-Archive -Path $(system.defaultworkingdirectory)/FR1PHPPRDSRE1V -DestinationPath $(Build.ArtifactStagingDirectory)/Output/SRE1V.zip
##set the flag variable FR1PHPPRDSRE1VFlag to true
Write-Host "##vso[task.setvariable variable=FR1PHPPRDSRE1VFlag]True"
}
if ($name -like 'FR1PHPPRDAPP7V/*')
{
cd $(Build.ArtifactStagingDirectory)
mkdir Output -force
##achive folder FR1PHPPRDAPP7V if it is changed.
Compress-Archive -Path $(system.defaultworkingdirectory)/FR1PHPPRDAPP7V -DestinationPath $(Build.ArtifactStagingDirectory)/Output/APP7V.zip
##set the flag variable FR1PHPPRDAPP7VFlag to true
Write-Host "##vso[task.setvariable variable=FR1PHPPRDAPP7VFlag]True"
}
}
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)/Output'
ArtifactName: 'scripts-f2p'
publishLocation: 'Container'
condition: and(succeeded(), or(eq(variables.FR1PHPPRDAPP1VFlag, true),eq(variables.FR1PHPPRDAPP4VFlag, true),eq(variables.FR1PHPPRDAPP5VFlag, true),eq(variables.FR1PHPPRDSRE1VFlag, true),eq(variables.FR1PHPPRDAPP7VFlag, true)))
没有现成的解决方案。但是您可以使用 REST API Commits - Get Changes 调用来检查:
GET https://dev.azure.com/fabrikam/_apis/git/repositories/278d5cd2-584d-4b63-824a-2ba458937249/commits/be67f8871a4d2c75f13a51c1d3c30ac0d74d4ef4/changes?top=2&skip=10&api-version=5.0
{
"changeCounts": {
"Add": 456
},
"changes": [
{
"item": {
"gitObjectType": "blob",
"path": "/MyWebSite/MyWebSite/favicon.ico",
"url": "https://dev.azure.com/fabrikam/_apis/git/repositories/278d5cd2-584d-4b63-824a-2ba458937249/items/MyWebSite/MyWebSite/favicon.ico?versionType=Commit"
},
"changeType": "add"
},
{
"item": {
"gitObjectType": "tree",
"path": "/MyWebSite/MyWebSite/fonts",
"isFolder": true,
"url": "https://dev.azure.com/fabrikam/_apis/git/repositories/278d5cd2-584d-4b63-824a-2ba458937249/items/MyWebSite/MyWebSite/fonts?versionType=Commit"
},
"changeType": "add"
}
]
}
如果您使用 gitcopy diff task
并且您没有展平目标文件夹,您应该使用命令行分析您的目标文件夹 - powershell/bashh - 并基于此设置变量。
$f1Changed = ((Get-ChildItem -Path .\destination\f1\ | Measure-Object).Count -gt 0)
然后您可以分析此响应并检查更改的内容。基于此,您可以使用 logging command:
设置变量
Write-Host "##vso[task.setvariable variable=f1changed;]$f1Changed"
然后在此处的步骤中使用此变量来压缩此特定文件夹。
condition: and(succeeded(), eq(variables.f1changed, true))
你可以在powershell任务git commands
下面直接运行查看修改后的文件。它比 Rest api.
容易得多
git diff-tree --no-commit-id --name-only -r $(Build.SourceVersion)
当您获得更改的文件时,您可以使用 Compress-Archive
命令直接在 powershell 任务中使用 zip 更改的文件夹:参见下面的示例:
Compress-Archive -Path C:\f1 -DestinationPath f1.zip
如果您希望根据更改后的文件夹执行某些特定步骤。您可以定义标志变量并使用 logging commands in the powershell scripts to set the flags to true
. And then use the condtions 进行以下步骤。
请参阅下面的完整示例脚本:
##set flag variables to indicate if the folder is changed.
variables:
f1Flag: false
f2Flag: false
f3Flag: false
steps:
- powershell: |
## get the changed files
$files=$(git diff-tree --no-commit-id --name-only -r $(Build.SourceVersion))
$temp=$files -split ' '
$count=$temp.Length
echo "Total changed $count files"
For ($i=0; $i -lt $temp.Length; $i++)
{
$name=$temp[$i]
echo "this is $name file"
if ($name -like 'f1/*') #if f1 is a subfolder under a folder use "- like '*/f1/*'"
{
##achive folder f1 if it is changed.
##Compress-Archive -Path $(system.defaultworkingdirectory)/f1 -DestinationPath $(Build.ArtifactStagingDirectory)/f1.zip
##set the flag variable f1Flag to true
Write-Host "##vso[task.setvariable variable=f2Flag]true"
}
if ($name -like 'f2/*')
{
##achive folder f2 if it is changed.
##Compress-Archive -Path $(system.defaultworkingdirectory)/f2 -DestinationPath $(Build.ArtifactStagingDirectory)/f2.zip
##set the flag variable f2Flag to true
Write-Host "##vso[task.setvariable variable=f2Flag]True"
}
}
## create a temp folder to hold the changed files
New-Item -ItemType directory -Path $(system.defaultworkingdirectory)\temp
foreach($file in $temp){
if(Test-Path -path $file){
Copy-Item -Path $file -Destination $(system.defaultworkingdirectory)\temp
}
}
## zip the temp folder which only have the changed files
Compress-Archive -Path $(system.defaultworkingdirectory)\temp\* -DestinationPath $(Build.ArtifactStagingDirectory)\changedfiles.zip
然后您可以像 Krzysztof 提到的那样,将条件用于某些特定步骤
condition: and(succeeded(), or(eq(variables.f1Flag, true),eq(variables.f2Flag, true),eq(variables.f3Flag, true)))
有关详细信息,请参阅 的答案。
更新:
steps:
- powershell: |
#get the changed files
....
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)/Output'
ArtifactName: 'drop'
publishLocation: 'Container'
condtion: and(succeeded(), or(eq(variables.f1Flag, true),eq(variables.f2Flag, true),eq(variables.f3Flag, true)))
我在源代码中有这样的文件夹结构。 f1 f2 f3 f4
我在我的管道中添加了 gitcopy diff 任务,该任务列出并复制修改到目标文件夹的文件。 现在,我想有一个条件循环作为 powershell 脚本,只压缩那些修改了具有特定名称的文件的文件夹,例如,如果修改了来自 f1 的文件..我想执行特定的步骤等等..我怎么能做一个循环? 编辑:我用这种方式编写了我的管道。但是它在发布步骤中失败并出现所列错误。
亚姆: 触发器:
none
pool:
vmImage: 'windows-latest'
variables:
FR1PHPPRDAPP1VFlag: false
FR1PHPPRDAPP4VFlag: false
FR1PHPPRDAPP5VFlag: false
FR1PHPPRDSRE1VFlag: false
FR1PHPPRDAPP7VFlag: false
stages:
-stage: Zipping modified folders
steps:
- powershell: |
## get the changed files
$files=$(git diff HEAD HEAD~ --name-only)
$temp=$files -split ' '
$count=$temp.Length
echo "Total changed $count files"
For ($i=0; $i -lt $temp.Length; $i++)
{
$name=$temp[$i]
echo "this is $name file"
if ($name -like 'FR1PHPPRDAPP1V/*')
{
cd $(Build.ArtifactStagingDirectory)
mkdir Output -force
Compress-Archive -Path $(system.defaultworkingdirectory)/FR1PHPPRDAPP1V -DestinationPath $(Build.ArtifactStagingDirectory)/Output/APP1V.zip
##set the flag variable FR1PHPPRDAPP1VFlag to true
Write-Host "##vso[task.setvariable variable=FR1PHPPRDAPP1VFlag]true"
}
if ($name -like 'FR1PHPPRDAPP4V/*')
{
cd $(Build.ArtifactStagingDirectory)
mkdir Output -force
##achive folder FR1PHPPRDAPP4V if it is changed.
Compress-Archive -Path $(system.defaultworkingdirectory)/FR1PHPPRDAPP4V -DestinationPath $(Build.ArtifactStagingDirectory)/Output/APP4V.zip
##set the flag variable FR1PHPPRDAPP4VFlag to true
Write-Host "##vso[task.setvariable variable=FR1PHPPRDAPP4VFlag]True"
}
if ($name -like 'FR1PHPPRDAPP5V/*')
{
cd $(Build.ArtifactStagingDirectory)
mkdir Output -force
##achive folder FR1PHPPRDAPP5V if it is changed.
Compress-Archive -Path $(system.defaultworkingdirectory)/FR1PHPPRDAPP5V -DestinationPath $(Build.ArtifactStagingDirectory)/Output/APP5V.zip
##set the flag variable FR1PHPPRDAPP5VFlag to true
Write-Host "##vso[task.setvariable variable=FR1PHPPRDAPP5VFlag]True"
}
if ($name -like 'FR1PHPPRDSRE1V/*')
{
cd $(Build.ArtifactStagingDirectory)
mkdir Output -force
##achive folder FR1PHPPRDSRE1V if it is changed.
Compress-Archive -Path $(system.defaultworkingdirectory)/FR1PHPPRDSRE1V -DestinationPath $(Build.ArtifactStagingDirectory)/Output/SRE1V.zip
##set the flag variable FR1PHPPRDSRE1VFlag to true
Write-Host "##vso[task.setvariable variable=FR1PHPPRDSRE1VFlag]True"
}
if ($name -like 'FR1PHPPRDAPP7V/*')
{
cd $(Build.ArtifactStagingDirectory)
mkdir Output -force
##achive folder FR1PHPPRDAPP7V if it is changed.
Compress-Archive -Path $(system.defaultworkingdirectory)/FR1PHPPRDAPP7V -DestinationPath $(Build.ArtifactStagingDirectory)/Output/APP7V.zip
##set the flag variable FR1PHPPRDAPP7VFlag to true
Write-Host "##vso[task.setvariable variable=FR1PHPPRDAPP7VFlag]True"
}
}
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)/Output'
ArtifactName: 'scripts-f2p'
publishLocation: 'Container'
condition: and(succeeded(), or(eq(variables.FR1PHPPRDAPP1VFlag, true),eq(variables.FR1PHPPRDAPP4VFlag, true),eq(variables.FR1PHPPRDAPP5VFlag, true),eq(variables.FR1PHPPRDSRE1VFlag, true),eq(variables.FR1PHPPRDAPP7VFlag, true)))
没有现成的解决方案。但是您可以使用 REST API Commits - Get Changes 调用来检查:
GET https://dev.azure.com/fabrikam/_apis/git/repositories/278d5cd2-584d-4b63-824a-2ba458937249/commits/be67f8871a4d2c75f13a51c1d3c30ac0d74d4ef4/changes?top=2&skip=10&api-version=5.0
{
"changeCounts": {
"Add": 456
},
"changes": [
{
"item": {
"gitObjectType": "blob",
"path": "/MyWebSite/MyWebSite/favicon.ico",
"url": "https://dev.azure.com/fabrikam/_apis/git/repositories/278d5cd2-584d-4b63-824a-2ba458937249/items/MyWebSite/MyWebSite/favicon.ico?versionType=Commit"
},
"changeType": "add"
},
{
"item": {
"gitObjectType": "tree",
"path": "/MyWebSite/MyWebSite/fonts",
"isFolder": true,
"url": "https://dev.azure.com/fabrikam/_apis/git/repositories/278d5cd2-584d-4b63-824a-2ba458937249/items/MyWebSite/MyWebSite/fonts?versionType=Commit"
},
"changeType": "add"
}
]
}
如果您使用 gitcopy diff task
并且您没有展平目标文件夹,您应该使用命令行分析您的目标文件夹 - powershell/bashh - 并基于此设置变量。
$f1Changed = ((Get-ChildItem -Path .\destination\f1\ | Measure-Object).Count -gt 0)
然后您可以分析此响应并检查更改的内容。基于此,您可以使用 logging command:
设置变量Write-Host "##vso[task.setvariable variable=f1changed;]$f1Changed"
然后在此处的步骤中使用此变量来压缩此特定文件夹。
condition: and(succeeded(), eq(variables.f1changed, true))
你可以在powershell任务git commands
下面直接运行查看修改后的文件。它比 Rest api.
git diff-tree --no-commit-id --name-only -r $(Build.SourceVersion)
当您获得更改的文件时,您可以使用 Compress-Archive
命令直接在 powershell 任务中使用 zip 更改的文件夹:参见下面的示例:
Compress-Archive -Path C:\f1 -DestinationPath f1.zip
如果您希望根据更改后的文件夹执行某些特定步骤。您可以定义标志变量并使用 logging commands in the powershell scripts to set the flags to true
. And then use the condtions 进行以下步骤。
请参阅下面的完整示例脚本:
##set flag variables to indicate if the folder is changed.
variables:
f1Flag: false
f2Flag: false
f3Flag: false
steps:
- powershell: |
## get the changed files
$files=$(git diff-tree --no-commit-id --name-only -r $(Build.SourceVersion))
$temp=$files -split ' '
$count=$temp.Length
echo "Total changed $count files"
For ($i=0; $i -lt $temp.Length; $i++)
{
$name=$temp[$i]
echo "this is $name file"
if ($name -like 'f1/*') #if f1 is a subfolder under a folder use "- like '*/f1/*'"
{
##achive folder f1 if it is changed.
##Compress-Archive -Path $(system.defaultworkingdirectory)/f1 -DestinationPath $(Build.ArtifactStagingDirectory)/f1.zip
##set the flag variable f1Flag to true
Write-Host "##vso[task.setvariable variable=f2Flag]true"
}
if ($name -like 'f2/*')
{
##achive folder f2 if it is changed.
##Compress-Archive -Path $(system.defaultworkingdirectory)/f2 -DestinationPath $(Build.ArtifactStagingDirectory)/f2.zip
##set the flag variable f2Flag to true
Write-Host "##vso[task.setvariable variable=f2Flag]True"
}
}
## create a temp folder to hold the changed files
New-Item -ItemType directory -Path $(system.defaultworkingdirectory)\temp
foreach($file in $temp){
if(Test-Path -path $file){
Copy-Item -Path $file -Destination $(system.defaultworkingdirectory)\temp
}
}
## zip the temp folder which only have the changed files
Compress-Archive -Path $(system.defaultworkingdirectory)\temp\* -DestinationPath $(Build.ArtifactStagingDirectory)\changedfiles.zip
然后您可以像 Krzysztof 提到的那样,将条件用于某些特定步骤
condition: and(succeeded(), or(eq(variables.f1Flag, true),eq(variables.f2Flag, true),eq(variables.f3Flag, true)))
有关详细信息,请参阅
更新:
steps:
- powershell: |
#get the changed files
....
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)/Output'
ArtifactName: 'drop'
publishLocation: 'Container'
condtion: and(succeeded(), or(eq(variables.f1Flag, true),eq(variables.f2Flag, true),eq(variables.f3Flag, true)))