我需要使用密钥库中的证书在构建后对我的 DLL 进行签名。
cproj
包含构建后任务
<Target Name="AzureSignTool" AfterTargets="Build">
<Message Importance="High" Text="Running azuresigntool." />
<Exec Command="azuresigntool sign --azure-key-vault-tenant-id "$(AzureSignTool_TenantId)" -kvu $(AzureSignTool_KeyVaultUrl) -kvi $(AzureSignTool_ClientId) -kvs $(AzureSignTool_ClientSecret) -kvc CodeSigningCert "$(ProjectDir)$(OutDir)$(TargetFileName)"" />
<!-- Parameters provided from pipeline 'library'. -->
</Target>
它在本地工作,参数值是环境变量。
下一步是让它在 Azure DevOps 构建管道中工作。
变量在管道库中设置并使用
添加variables:
- group: azuresigntool
现在在管道中,
azuresigntool
使用参数值运行,但失败,因为客户端地址未经授权并且调用者不是受信任的服务。解决方案(来自https://luke.geek.nz/azure/accessing) -keyvault-azure-devops/)是将构建服务器的IP地址添加到keyvault的防火墙中。
这就是我已经走了多远
steps:
- task: DotNetCoreCLI@2
inputs:
command: 'custom'
custom: 'tool'
arguments: 'install --global azuresigntool'
displayName: Install AzureSignTool
# https://luke.geek.nz/azure/accessing-keyvault-azure-devops/
# This task uses Azure CLI to add the IP address of the Azure DevOps agent to the firewall of an Azure Key Vault.
- task: AzureCLI@2
displayName: Add Agent IP From Key Vault
condition: succeededOrFailed() # This task will run regardless of whether previous tasks have succeeded or failed.
inputs:
azureSubscription: 'Libraries-335d6548-abdc-4fd4-b313-e8c7ab8357c6' #${{ parameters.keyVaultArmSvcConnectionName }} # The Azure subscription that the task should use. The value is taken from the keyVaultArmSvcConnectionName parameter.
scriptType: bash
scriptLocation: inlineScript
inlineScript: |
agentIP=$(curl -s https://checkip.amazonaws.com)
echo "Agent IP: $agentIP"
az keyvault network-rule add --name "prestwoodsoftware" --ip-address "$agentIP" --only-show-errors
- template: BuildTestPack.yml@AzurePipelineTemplates
parameters:
solution: 'Libraries.DllThatNeedsToBeSigned.sln'
# This task uses Azure CLI to remove the IP address of the Azure DevOps agent from the firewall of an Azure Key Vault.
- task: AzureCLI@2
displayName: Remove Agent IP From Key Vault
condition: succeededOrFailed()
inputs:
azureSubscription: 'Libraries-335d6548-abdc-4fd4-b313-e8c7ab8357c6' #${{ parameters.keyVaultArmSvcConnectionName }} # The Azure subscription that the task should use. The value is taken from the keyVaultArmSvcConnectionName parameter.
scriptType: bash
scriptLocation: inlineScript
inlineScript: |
agentIP=$(curl -s https://checkip.amazonaws.com)
echo "Agent IP: $agentIP"
az keyvault network-rule remove --name "prestwoodsoftware" --ip-address "$agentIP" --only-show-errors
我认为问题是让Azure代理授权
az
。这应该如何运作?
不存在
${{ parameters.keyVaultArmSvcConnectionName }}
这样的东西,也不清楚它应该是什么。我试过了
在每种情况下,构建都会失败
存在资源授权问题:“管道无效。作业作业:步骤AzureCLI1输入connectedServiceNameARM引用服务连接
,无法找到。服务连接不存在、已被禁用或尚未获得授权”有关授权详细信息,请参阅https://aka.ms/yamlauthz。whatever-I-put-for-azureSubscription
是否可以在 Azure DevOps 管道中运行
azuresigntool
?怎么办?
${{ parameters.keyVaultArmSvcConnectionName }}
是 DevOps 项目中的 Azure 资源管理器类型服务连接(ARM 服务连接)。
如果您遵循相同的格式
${{ parameters.XXX}}
,则需要在管道 YAML 顶部将服务连接名称定义为 parameter
。
parameters:
- name: keyVaultArmSvcConnectionName
value:YourARMConnservice # your ARM service connection name.
但是您也可以像现在一样在yaml AzureCLI任务中直接输入服务连接名称,这意味着不使用参数。
最后一个错误表示ARM服务连接未创建,或者您无权使用它。
请按照以下步骤操作:
进入项目设置 -> 管道 -> 服务连接,检查 ARM 服务连接是否存在,并确认管道内的名称相同。如果连接不存在,则创建连接。
如果存在,进入失败的构建结果,可以看到一个授权资源的选项。您可以选择此选项并在失败的构建上授权资源。一旦资源获得授权,您就可以开始新的构建。检查doc了解详细信息。
两个 AzureCLi 任务自动检测 DevOps 代理 IP 并将其添加/删除到 Key Vault 白名单,确保代理可以访问 Key Vault。
此外,您在变量组
secret type variables
中定义group: azuresigntool
,请注意它们不会映射为管道中的环境变量,只有非秘密类型变量才会自动映射为环境。您可以考虑直接通过 AzureSignTool
命令使用 script/powershell 任务,而不是构建后任务:
- powershell: '& AzureSignTool sign --azure-key-vault-tenant-id $(AzureSignTool_TenantId) -kvu $(AzureSignTool_KeyVaultUrl) -kvi $(AzureSignTool_ClientId) -kvs $(AzureSignTool_ClientSecret) -kvc CodeSigningCert "$(ProjectDir)$(OutDir)$(TargetFileName)'
displayName: 'Sign the file'