在多个Azure DevOps管道库中使用同一个变量
我遇到了一个问题,却始终想不出解决办法。 我为每个环境准备了一个变量组:
- My_Var_Group_Prod
- My_Var_Group_Dev
在每个变量组里,我有一个名为 "Service_Connection" 的变量,基本上就是一个Azure账户的服务连接。我有一个场景是每个环境可能处于不同的订阅中——这意味着Service_Connection变量的值会不同。
我有一个.yaml管道,用来将我的应用部署到Azure,并使用模板。下面是我使用模板的方式:
- stage: Dev
variables:
- group: My_Var_Group_Dev
jobs:
- template: templates/deploy_API.yml
在该模板中,我有如下任务:
- task: AzureWebApp@1
displayName: 'Deploy API'
inputs:
azureSubscription:'$(Service_Connection)'
appType: 'webAppLinux'
appName: 'my-api-web-app'
package: '$(API_DIRECTORY)/API.zip'
问题在于AzureWebApp任务中的azureSubscription输入似乎是在“构建”时就确定了。因此我甚至无法运行管道,因为它需要该值。
为了解决这个问题,我尝试使用一个全局变量组,在其中为SERVICE_CONNECTION定义了一个默认值,在我的主.yaml中把该组定义为一个变量。但这样它会尝试使用SERVICE_CONNECTION的默认值,而不是My_Var_Group_Dev中的值。(尽管在任务前添加的echo中打印的值是正确的。)
我也尝试将SERVICE_CONNECTION作为管道参数传递,虽然可行,但我希望这些值能够被存储,因此这不是一个有效的解决方案。
我找到的唯一解决办法是使用Bash任务,手动进行部署,通过传入应用注册的信息来进行认证。这样可行,但并不是很像DevOps的风格,而且我在其他地方也需要同样的模式,因此需要找到一个解决方案。
有没有人遇到过这个问题并找到解决办法? 先行感谢。
解决方案
根据你有多少条管道,以及你对服务连接名称的灵活性有多大需求,你其实可以直接把serviceConnection的名称设置在管道变量中:
name: $(Build.DefinitionName)-$(Build.BuildId)
variables:
azureServiceConnection : 'arm-test'
- task: AzureCLI@2
displayName: Test
inputs:
azureSubscription: $(azureServiceConnection)
scriptType: bash
不过你需要为每个管道都设置一次,但好处是它是一个变量,可以在所有“下面的”管道中使用。因此你可以在主管道中设置多个service connections,然后把正确的service connection传递给带模板的管道。如果对你有帮助,请告诉我。