我有一个步骤,检查自上次提交以来特定文件夹中是否有更改(我设置isOutput=true,因为我在稍后的另一个阶段也需要这样做(:
bash: |
git checkout origin/$(System.PullRequest.SourceBranch)
DIFF_VALUE=$(git diff --name-only HEAD..HEAD~1 -- functions/$(directoryName) | wc -l)
echo Looking for changes in directory: $(directoryName)
if [[ $DIFF_VALUE -eq 0 ]]
then
echo "There are no changes since the previous commit."
echo "##vso[task.setvariable variable=gitDiff;isOutput=true]false"
else
echo "There are changes since the previous commit."
echo "##vso[task.setvariable variable=gitDiff;isOutput=true]true"
fi
name: check_changes
displayName: Check Changes
现在,我想在名为function.yml的文件中包含一些步骤,但我只希望它们在自上次提交以来该文件夹中没有任何更改的情况下运行!由于不可能将条件添加到模板步骤中,我添加了带有参数gitdiffbool的模版(实际上是一个字符串,但这没关系(:
- template: ../steps/ci/function.yml
parameters:
directoryName: $(directoryName)
gitdiffbool: $(check_changes.gitDiff)
我的函数.yml看起来像这样:
parameters:
- name: directoryName
type: string
- name: gitdiffbool
type: string
steps:
- bash: echo "Diff value is ${{ parameters.gitdiffbool }}!"
- ${{ if eq(parameters.gitdiffbool, 'true') }}:
- bash: echo "This step and others after this never run!!!!"
当我运行此程序时,函数.yml中的第一个bash将始终运行并正确显示参数值:Diff值为false或Diff值为true根据我在那个特定目录中是否有更改。但是它不能解析${{ if ... }}
内部的相同参数。无论我怎么尝试,它永远无法比较它是"真"还是"假"。(我试过真、假、真、假,"真"、"假",但没有运气(
为什么它能够正确解析${{ parameters.gitdiffbool }}
,而不能解析${{ if eq(parameters.gitdiffbool, 'true') }}
?如果${{ }}
内部的问题在编译时得到了解决,那么为什么第一个bash能够输出正确的字符串呢?我在这里错过了什么?如何在不需要向函数.yml文件中的所有任务添加条件的情况下解决此问题?
因为这只会在管道运行时获得一个值:
gitdiffbool: $(check_changes.gitDiff)
但这是在编译时检查的,即在管道运行之前:
- ${{ if eq(parameters.gitdiffbool, 'true') }}:
对于在管道开始运行之前已知的值,只能使用${{ }}
语法。这意味着参数和硬编码变量,而不是在管道运行时由任务创建/填充的变量。