【问题标题】:Pipeline variable is not getting evaluated correctly管道变量未得到正确评估
【发布时间】:2023-01-20 05:58:52
【问题描述】:

我已经使用 UI 界面为我的管道定义了一个管道变量:

我正在我的管道azure-pipelines.yml 中使用该变量:

name: MyRepo.Deployment.$(date:yy)$(DayOfYear)$(rev:.r)
...
jobs:
  - job:
    steps:
...
      - template: azure-pipelines.yml@Common-YAML
        parameters:
          ...
          enable_datasync_job: ${{ eq(variables.enable_datasync_job, 'true') }}

然后该变量被传递给需要 boolean 的模板。 问题是,当我运行管道并且扩展 azure-pipelines.yml@Common-YAML 模板时,enable_datasync_job 的值始终是 False

我在这里错过了什么?是因为我的管道和模板共享相同的变量/参数名称吗?

【问题讨论】:

  • 您是否尝试使用此表达式 ${{ eq(variables.enable_datasync_job, 'true') }}enable_datasync_job 的值覆盖为 true
  • 对,那是正确的

标签: azure-devops azure-pipelines


【解决方案1】:

假设 enable_datasync_job 在 UI 中定义为 false

选项1

要覆盖在 UI 中定义的上述变量,您可以将此 bash task 添加到您的管道

- bash: |
    echo $(ENABLE_DATASYNC_JOB) # outputs as false
    echo "##vso[task.setvariable variable=enable_datasync_job;]true" # override
- bash: |
    echo $(ENABLE_DATASYNC_JOB) # outputs as true

由于您的模板接受布尔类型的参数,因此您会得到类似下面的内容

# template.yml
parameters:
- name: enable_datasync_job
  type: boolean

steps:
- bash: |
    echo $(ENABLE_DATASYNC_JOB) 

还有你的主要 yml 文件

# azure-pipelines.yml
steps:
  - bash: |
      echo "##vso[task.setvariable variable=enable_datasync_job;]true" # override
  - template: template.yml
    parameters:
      enable_datasync_job: $(enable_datasync_job) # fail

但是上面的 azure-pipelines.yml 将失败,因为将字符串类型转换为布尔值。查看此SO post了解更多详情

/azure-pipelines.yml (Line: 11, Col: 28): The 'enable_datasync_job' parameter value '$(enable_datasync_job)' is not a valid Boolean.

根据上面的帖子,你可以在你的template.yml中将参数的数据类型更改为字符串

parameters:
- name: enable_datasync_job
  type: string

选项 1 的最终结果

# template.yml
parameters:
- name: enable_datasync_job
  type: string

steps:
- bash: |
    echo $(ENABLE_DATASYNC_JOB) #outputs true
# azure-pipelines.yml
steps:
  - bash: |
      echo "##vso[task.setvariable variable=enable_datasync_job;]true" # override
  - template: template.yml
    parameters:
      enable_datasync_job: $(enable_datasync_job)

选项 2

如果您只想将值 true 传递给您的模板而不覆盖管道变量,您可以像这样引用您传递的值

# template.yml
parameters:
- name: enable_datasync_job
  type: boolean

steps:
- bash: |
    echo ${{ parameters.enable_datasync_job }} # outputs true
    echo $(ENABLE_DATASYNC_JOB) # outputs false
# azure-pipelines.yml
steps:
  - template: template.yml
    parameters:
      enable_datasync_job: true

它为您返回 False 的原因是因为您在将值传递给参数时使用了此表达式

${{ eq(variables.enable_datasync_job, 'true') }}

根据documentationeq函数

如果参数相等则计算 True

您尝试评估 UI 变量是否等于 true 而不是设置它

您在上面使用的表达式将始终返回 False,因为 false(UI 变量值)不等于 true(在表达式中设置)

【讨论】:

    猜你喜欢
    • 2022-01-19
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    相关资源
    最近更新 更多