在 Azure DevOps 管道中使用 azuresigntool

问题描述 投票:0回答:1

我需要使用密钥库中的证书在构建后对我的 DLL 进行签名。

cproj
包含构建后任务

  <Target Name="AzureSignTool" AfterTargets="Build">
    <Message Importance="High" Text="Running azuresigntool." />
    <Exec Command="azuresigntool sign --azure-key-vault-tenant-id &quot;$(AzureSignTool_TenantId)&quot; -kvu $(AzureSignTool_KeyVaultUrl) -kvi $(AzureSignTool_ClientId) -kvs $(AzureSignTool_ClientSecret) -kvc CodeSigningCert &quot;$(ProjectDir)$(OutDir)$(TargetFileName)&quot;" />
    <!-- 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 }}
这样的东西,也不清楚它应该是什么。我试过了

  • 我的 Azure 订阅的 ID,
  • AzureDevOps 中显示的服务连接名称,
  • AAD 中显示的服务连接名称,
  • AAD 中服务连接的 ID。 但这些都不起作用。

在每种情况下,构建都会失败

存在资源授权问题:“管道无效。作业作业:步骤AzureCLI1输入connectedServiceNameARM引用服务连接

whatever-I-put-for-azureSubscription
,无法找到。服务连接不存在、已被禁用或尚未获得授权”有关授权详细信息,请参阅https://aka.ms/yamlauthz

是否可以在 Azure DevOps 管道中运行

azuresigntool
?怎么办?

azure-devops azure-keyvault
1个回答
0
投票

${{ parameters.keyVaultArmSvcConnectionName }}
是 DevOps 项目中的 Azure 资源管理器类型服务连接(ARM 服务连接)。

如果您遵循相同的格式

${{ parameters.XXX}}
,则需要在管道 YAML 顶部将服务连接名称定义为
parameter

parameters:
- name: keyVaultArmSvcConnectionName
  value:YourARMConnservice           # your ARM service connection name.

但是您也可以像现在一样在yaml AzureCLI任务中直接输入服务连接名称,这意味着不使用参数。

最后一个错误表示ARM服务连接未创建,或者您无权使用它。

请按照以下步骤操作:

  1. 进入项目设置 -> 管道 -> 服务连接,检查 ARM 服务连接是否存在,并确认管道内的名称相同。如果连接不存在,则创建连接。

  2. 如果存在,进入失败的构建结果,可以看到一个授权资源的选项。您可以选择此选项并在失败的构建上授权资源。一旦资源获得授权,您就可以开始新的构建。检查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'

请参阅linklink供您参考。

© www.soinside.com 2019 - 2024. All rights reserved.