从 CI/CD YAML 引用 Azure Key Vault 机密
Referencing Azure Key Vault secrets from CI/CD YAML
我们有一个多阶段 YAML 管道 CI/CD 到现有的一组 Azure 资源
阶段是
- 建设
- 部署到开发和 运行 测试
- 如果之前成功 - 部署到生产和 运行 测试
我们在部署阶段使用 AzureRmWebAppDeployment
任务,并使用该任务的 AppSettings 参数来指定特定于环境的设置。例如
- task: AzureRmWebAppDeployment@4
displayName: 'Deploy Azure App Service'
inputs:
azureSubscription: '$(azureSubscriptionEndpoint)'
appType: '$(webAppKind)'
WebAppName: 'EXISTING__AZURE_RESOURCENAME-DEV'
Package: '$(Pipeline.Workspace)/**/*.zip'
AppSettings: >
-AzureAd:CallbackPath /signin-oidc
-AzureAd:ClientId [GUID was here]
-AzureAd:Domain [domain was here]
-AzureAd:Instance https://login.microsoftonline.com/
-AzureAd:TenantId [Id was here]
-EmailServer:SMTPPassword SECRETPASSWORD
-EmailServer:SMTPUsername SECRETUSERNAME
我想从 Azure KeyVault 中提取该集合中的两个设置,EmailServer: SMTPUsername
和 EmailServer: SMTPPassword
。我知道如何使用语法
从 Azure 门户引用 KV 机密
@Microsoft.KeyVault(SecretUri=https://our.vault.azure.net/secrets/SendGridPassword/ReferenceGuidHere)
但我如何从 YAML 管道引用值以便在 Azure 中设置它?
正如 Thomas 在此评论中指出的那样,
我可以像这样在 YAML 文件中显式设置值:
-EmailServer:SMTPPassword @Microsoft.KeyVault(SecretUri=https://our.vault.azure.net/secrets/SendGridPassword/ReferenceGuidHere)
您需要将带有 RunAsPreJob 的 AzureKeyVault@1 任务设置为 true,这将使您的密钥保管库值可用作 CI/CD 作业环境变量,以便您可以将其用作 $(KEY-OF-SECRET-VALUE)在工作的其余阶段。
以下 yaml 文件是一个工作示例。
我们为 python 单元测试设置了一组从 Azure key-vault
提供的环境变量
trigger:
batch: true # disable concurrent build for pipeline
branches:
include:
- '*' # CI start for all branches
pool:
vmImage: ubuntu-16.04
stages:
- stage: Test
jobs:
- job: sample_test_stage
steps:
- task: AzureKeyVault@1
inputs:
azureSubscription: 'YOUR SUBSCRIPTION HERE'
KeyVaultName: 'THE-KEY-VAULT-NAME'
SecretsFilter: '*'
RunAsPreJob: true
- task: UsePythonVersion@0
inputs:
versionSpec: '3.7'
- script : python -m unittest discover -v -s tests
displayName: 'Execute python unittest'
env: { MY-ENV-VAL-1: $(SECRET-VALUE-1), MY-ENV-VAL-2: $(SECRET-VALUE-2)}
请注意,有时您需要批准 AzureDevops 和另一个 Azure 服务(如 KeyVault)之间的连接
我们有一个多阶段 YAML 管道 CI/CD 到现有的一组 Azure 资源
阶段是
- 建设
- 部署到开发和 运行 测试
- 如果之前成功 - 部署到生产和 运行 测试
我们在部署阶段使用 AzureRmWebAppDeployment
任务,并使用该任务的 AppSettings 参数来指定特定于环境的设置。例如
- task: AzureRmWebAppDeployment@4
displayName: 'Deploy Azure App Service'
inputs:
azureSubscription: '$(azureSubscriptionEndpoint)'
appType: '$(webAppKind)'
WebAppName: 'EXISTING__AZURE_RESOURCENAME-DEV'
Package: '$(Pipeline.Workspace)/**/*.zip'
AppSettings: >
-AzureAd:CallbackPath /signin-oidc
-AzureAd:ClientId [GUID was here]
-AzureAd:Domain [domain was here]
-AzureAd:Instance https://login.microsoftonline.com/
-AzureAd:TenantId [Id was here]
-EmailServer:SMTPPassword SECRETPASSWORD
-EmailServer:SMTPUsername SECRETUSERNAME
我想从 Azure KeyVault 中提取该集合中的两个设置,EmailServer: SMTPUsername
和 EmailServer: SMTPPassword
。我知道如何使用语法
@Microsoft.KeyVault(SecretUri=https://our.vault.azure.net/secrets/SendGridPassword/ReferenceGuidHere)
但我如何从 YAML 管道引用值以便在 Azure 中设置它?
正如 Thomas 在此评论中指出的那样,
我可以像这样在 YAML 文件中显式设置值:
-EmailServer:SMTPPassword @Microsoft.KeyVault(SecretUri=https://our.vault.azure.net/secrets/SendGridPassword/ReferenceGuidHere)
您需要将带有 RunAsPreJob 的 AzureKeyVault@1 任务设置为 true,这将使您的密钥保管库值可用作 CI/CD 作业环境变量,以便您可以将其用作 $(KEY-OF-SECRET-VALUE)在工作的其余阶段。
以下 yaml 文件是一个工作示例。 我们为 python 单元测试设置了一组从 Azure key-vault
提供的环境变量trigger:
batch: true # disable concurrent build for pipeline
branches:
include:
- '*' # CI start for all branches
pool:
vmImage: ubuntu-16.04
stages:
- stage: Test
jobs:
- job: sample_test_stage
steps:
- task: AzureKeyVault@1
inputs:
azureSubscription: 'YOUR SUBSCRIPTION HERE'
KeyVaultName: 'THE-KEY-VAULT-NAME'
SecretsFilter: '*'
RunAsPreJob: true
- task: UsePythonVersion@0
inputs:
versionSpec: '3.7'
- script : python -m unittest discover -v -s tests
displayName: 'Execute python unittest'
env: { MY-ENV-VAL-1: $(SECRET-VALUE-1), MY-ENV-VAL-2: $(SECRET-VALUE-2)}
请注意,有时您需要批准 AzureDevops 和另一个 Azure 服务(如 KeyVault)之间的连接