Azure Pipeline跨作业调用其他作业下载的pfx证书报错解决方案
问题原因与结论
Azure Pipeline 原生支持跨作业共享文件,你遇到的error certificate not found报错核心原因是:每个Pipeline作业默认运行在独立的代理执行环境中,作业执行结束后,工作目录下的所有本地临时文件(包括你通过az cli下载的pfx证书)会被自动清理,后序作业无法直接读取前序作业在本地生成的文件,不是功能不支持,是缺少跨作业传递文件的显式配置。
实现步骤
不需要额外借助第三方存储中转,直接用Pipeline原生的工件发布/下载能力即可,分两步修改:
1. 在keyvault.yml作业中发布证书为管道工件
在现有az cli下载证书的命令执行完成、确认pfx文件已成功落地到${pfx_path}路径后,新增发布工件的步骤:
# 紧跟在az storage blob download命令步骤之后 - task: PublishPipelineArtifact@1 inputs: targetPath: '$(pfx_path)' # 填写实际存储pfx文件的完整路径,支持单文件或目录 artifact: 'pfx-cert' # 自定义工件名称,后续下载步骤要和这个值一致 publishLocation: 'pipeline'
2. 在infrastructure.yml作业中下载证书工件
在执行az cli上传证书的命令之前,先新增下载工件的步骤,把前序作业发布的证书拉取到当前作业的工作目录:
# 放在az storage blob upload命令步骤之前 - task: DownloadPipelineArtifact@2 inputs: buildType: 'current' artifactName: 'pfx-cert' # 和上一步发布时填写的artifact名称完全一致 targetPath: '$(Pipeline.Workspace)/cert-temp' # 自定义当前作业存放证书的目录路径
下载步骤执行完成后,把上传命令里的${pfx_path}变量值修改为实际下载后的证书完整路径(比如$(Pipeline.Workspace)/cert-temp/你的证书文件名.pfx),再执行上传操作就不会报找不到文件的错误。
配置校验点
- 确认infrastructure作业已配置对keyvault作业的依赖(当前已经设置keyvault优先执行,只要确认
dependsOn配置覆盖了keyvault对应的作业名即可,避免作业并行执行导致下载工件失败) - 路径配置完成后,可以在下载步骤和上传步骤之间加一行
ls $(Pipeline.Workspace)/cert-temp打印目录内容,确认pfx文件确实存在、文件名匹配,避免路径拼写错误。 - 管道工件存储是Pipeline自带的临时存储,作业运行结束后会自动清理,不会产生额外的存储成本,安全性也有保障。
内容的提问来源于stack exchange,提问作者Aditya Purusharthi
相关产品推荐
相关产品推荐

