繁体   English   中英

Azure DevOps 用 KeyVault 中的值替换部分变量

[英]Azure DevOps replace part of variable with value from KeyVault

我有一个 Azure Devops 管道,它试图用 Azure KeyVault 中的值替换部分字符串变量值。

给定一个值为this-is-my-secret的 KeyVault 机密kvSecret ,我想要另一个值为this-is-your-secret变量foo

jobs:
- job: WebApp
  pool:
    vmImage: 'windows-latest'
  variables:
    foo: $[replace(variables['kvSecret'], 'my', 'your')]

  steps:
  - task: AzureKeyVault@2
    inputs:
      azureSubscription: 'foo'
      KeyVaultName: 'myKeyVault'
      RunAsPreJob: true

由于日志记录被屏蔽,我通过写入文件进行了测试:

  - task: PowerShell@2
    inputs:
      targetType: 'inline'
      script: |
        New-Item $(build.artifactstagingdirectory)\test.txt
        Set-Content $(build.artifactstagingdirectory)\test.txt '$(foo)'

  - task: PublishBuildArtifacts@1
    inputs:
      pathToPublish: '$(Build.ArtifactStagingDirectory)'

不过,output 是this-is-my-secret

我已经测试了您的 YAML 定义,变量 foo 应该为空。

出现此问题的原因是替换表达式将在编译时扩展。

管道运行时将下载 Key Vault 中的变量。

因此,在进行替换操作时,kvSecret 变量为空,foo 变量也为空。

为了解决这个问题,您需要在 Agent Job 中添加一个脚本来执行替换操作。

这是一个例子:

jobs:
- job: WebApp
  pool:
    vmImage: 'windows-latest'
    
  steps:
  - task: AzureKeyVault@2
    inputs:
      azureSubscription: 'xx'
      KeyVaultName: 'xx'
      SecretsFilter: '*'
      RunAsPreJob: true

  - task: PowerShell@2
    inputs:
      targetType: 'inline'
      script: |
        $newvalue = "$(kvSecret)" -replace "my", "your"
        echo $newvalue 
        echo "##vso[task.setvariable variable=foo]$newvalue"
        
  - task: PowerShell@2
    inputs:
      targetType: 'inline'
      script: |
        echo "$(foo)"
        New-Item $(build.artifactstagingdirectory)\test.txt
        Set-Content $(build.artifactstagingdirectory)\test.txt -value '$(foo)'
  - task: PublishBuildArtifacts@1
    inputs:
      pathToPublish: '$(Build.ArtifactStagingDirectory)'

结果:

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM