Azure DevOps部署ARM模板时int参数被转为字符串的问题
Azure DevOps部署Data Factory ARM模板:int类型参数传递失败问题
问题描述
部署Data Factory ARM模板时,ARM模板中定义了一个int类型的全局参数,但从Azure DevOps变量组传递覆盖参数时,变量总是被自动转成字符串类型,导致流水线因类型不匹配报错。


当前部署任务的YAML配置:
- task: AzureResourceManagerTemplateDeployment@3 displayName: ARM Template Deployment inputs: azureResourceManagerConnection: subscriptionId: resourceGroupName: location: csmFile: csmParametersFile: overrideParameters: > -factoryName ${{ parameters.dataFactoryName }} ${{ parameters.overrideParameters }}
变量组中的变量配置:
已尝试两种无效方法:
无效方法1:直接引用变量组变量
variables: - group: test-group ... jobs: - template: datafactory/create-release.yml@templates parameters: dataFactoryName: asdfasdf overrideParameters: > -default_properties_LogoAssetId_value $(default_properties_LogoAssetId_value_Stage)
无效方法2:尝试用ARM函数强制转换
variables: - group: test-group ... jobs: - template: datafactory/create-release.yml@templates parameters: dataFactoryName: asdfasdf overrideParameters: > -default_properties_LogoAssetId_value "[int(parameters($(default_properties_LogoAssetId_value_Stage)))]"
补充信息:datafactory/create-release.yml模板中overrideParameters被定义为字符串类型,不清楚如何同时传递字符串和int类型的覆盖参数:
parameters: - name: overrideParameters type: string jobs: - deployment: Deploy displayName: Deploy ARM Template environment: Prod pool: vmImage: ubuntu-latest strategy: runOnce: deploy: steps: - template: steps/step-arm-template-deploy.yml parameters: subscriptionId: ${{ parameters.subscriptionId }} targetResourceGroupName: ${{ parameters.targetResourceGroupName }} targetDataFactorylocation: ${{ parameters.targetDataFactorylocation }} targetDataFactoryName: ${{ parameters.targetDataFactoryName }} overrideParameters: ${{ parameters.overrideParameters }}
解决方案
方法1:用Azure DevOps运行时表达式强制转换类型
Azure DevOps变量组的变量默认都是字符串类型,可通过运行时表达式$[int()]显式转换为数值类型后传递:
variables: - group: test-group ... jobs: - template: datafactory/create-release.yml@templates parameters: dataFactoryName: asdfasdf overrideParameters: > -default_properties_LogoAssetId_value $[int('$(default_properties_LogoAssetId_value_Stage)')]
这里用单引号包裹变量是因为变量替换后是字符串形式的数字,int()函数需要接收字符串输入完成转换。
方法2:改用对象类型参数传递多类型参数
如果需要同时传递多种类型的覆盖参数,建议修改模板参数定义为对象类型,避免字符串拼接的类型问题:
- 修改
datafactory/create-release.yml的参数定义:
parameters: - name: dataFactoryName type: string - name: subscriptionId type: string - name: targetResourceGroupName type: string - name: targetDataFactorylocation type: string - name: targetDataFactoryName type: string - name: overrideParams type: object default: {} jobs: - deployment: Deploy displayName: Deploy ARM Template environment: Prod pool: vmImage: ubuntu-latest strategy: runOnce: deploy: steps: - template: steps/step-arm-template-deploy.yml parameters: subscriptionId: ${{ parameters.subscriptionId }} targetResourceGroupName: ${{ parameters.targetResourceGroupName }} targetDataFactorylocation: ${{ parameters.targetDataFactorylocation }} targetDataFactoryName: ${{ parameters.targetDataFactoryName }} overrideParameters: > -factoryName ${{ parameters.dataFactoryName }} ${{ each param in parameters.overrideParams }}: -${{ param.key }} ${{ param.value }}
- 调用模板时传递对象参数,按需转换类型:
variables: - group: test-group ... jobs: - template: datafactory/create-release.yml@templates parameters: dataFactoryName: asdfasdf subscriptionId: 'xxx' targetResourceGroupName: 'xxx' targetDataFactorylocation: 'xxx' targetDataFactoryName: 'xxx' overrideParams: default_properties_LogoAssetId_value: $[int('$(default_properties_LogoAssetId_value_Stage)')] # 字符串类型参数直接传递即可 anotherStringParam: '$(someStringVariable)'
方法3:在ARM参数文件中处理类型转换
如果可以修改ARM参数文件,直接在参数文件中使用int()函数完成类型转换,无需在流水线中处理:
{ "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#", "contentVersion": "1.0.0.0", "parameters": { "default_properties_LogoAssetId_value": { "value": "[int('$(default_properties_LogoAssetId_value_Stage)')]" } } }
部署时无需在overrideParameters中传递该参数,ARM模板会自动完成类型转换。
内容的提问来源于stack exchange,提问作者Kevvv
相关产品推荐
相关产品推荐

