我在源代码中具有这种文件夹结构。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)))
你可以在下面git commands
的powershell任务中直接运行以检查更改的文件。它比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
如果要基于更改的文件夹执行某些特定步骤。你可以定义标志变量,并使用powershell脚本中的日志记录命令将标志设置为true
。然后将条件用于以下步骤。
请参阅以下完整的示例脚本:
##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)))
嗨,您能检查一下我的编辑吗?我对管道进行了更改,现在条件语句中失败了
@priya您必须
stage
在stages
部分下使用。您可以将条件用于步骤。无需使用阶段。见以上更新@priya怎么样了?奏效了吗?
@ lEVI,谢谢..您能告诉我如何在这里添加多个条件吗?我希望发布任务在f1或f2或f3标志变为true时运行。
@priya您可以使用
or
表达式。见上文更新。请点击这里获取更多信息。