如何在Azure DevOps流水线中下载Trivy扫描输出文件
在Azure DevOps流水线中处理Trivy扫描报告:发布工件或上传至存储账户
你已通过Azure PowerShell任务完成Trivy容器扫描,生成的报告路径为/home/vsts/work/1/s/report-$(Build.BuildId)-$(Build.DefinitionName).json,以下是两种实现需求的具体方案:
方案一:将报告发布为流水线工件
流水线工件可直接在流水线界面下载,只需把报告文件移至$(Build.ArtifactStagingDirectory)(流水线默认的工件暂存目录)后发布即可。
方式1:修改现有PowerShell任务,直接输出到工件暂存目录
调整扫描脚本,让Trivy直接把报告生成到工件暂存目录,省去后续移动步骤:
trivy -v $filename = "report-$(Build.BuildId)-$(Build.DefinitionName).json" # 直接指定输出路径为工件暂存目录 $outputPath = Join-Path $(Build.ArtifactStagingDirectory) $filename trivy image -f json -o $outputPath python:3.4-alpine write-host "扫描报告已生成至:$outputPath" # 可选:验证文件是否存在 echo "工件暂存目录内容:" dir $(Build.ArtifactStagingDirectory)
随后添加发布构建工件任务(YAML示例):
- task: PublishBuildArtifacts@1 inputs: PathtoPublish: '$(Build.ArtifactStagingDirectory)' ArtifactName: 'trivy-scan-reports' publishLocation: 'Container'
执行完成后,可在流水线的「工件」选项卡中找到该报告并下载。
方式2:保留原有扫描逻辑,添加复制文件任务
如果不想改动扫描脚本,可单独添加一个复制任务把生成的报告移到工件暂存目录:
# 复制报告到工件暂存目录 - task: CopyFiles@2 inputs: SourceFolder: '$(Build.SourcesDirectory)' Contents: 'report-$(Build.BuildId)-$(Build.DefinitionName).json' TargetFolder: '$(Build.ArtifactStagingDirectory)' # 发布工件 - task: PublishBuildArtifacts@1 inputs: PathtoPublish: '$(Build.ArtifactStagingDirectory)' ArtifactName: 'trivy-scan-reports'
方案二:上传报告至Azure存储账户
可通过Azure CLI或Azure PowerShell任务将报告上传到存储账户的Blob容器中,前提是流水线使用的服务主体需拥有存储账户的「Blob数据参与者」权限。
使用Azure CLI任务上传(Linux代理示例)
- task: AzureCLI@2 inputs: azureSubscription: '你的Azure服务连接名称' scriptType: 'bash' scriptLocation: 'inlineScript' inlineScript: | az storage blob upload \ --account-name 你的存储账户名 \ --container-name 你的Blob容器名 \ --file /home/vsts/work/1/s/report-$(Build.BuildId)-$(Build.DefinitionName).json \ --name trivy-reports/report-$(Build.BuildId)-$(Build.DefinitionName).json \ --auth-mode login
若使用Windows代理,将
scriptType改为ps,用PowerShell语法执行上述命令即可。
使用Azure PowerShell任务上传
# 通过服务主体连接Azure Connect-AzAccount -ServicePrincipal -TenantId $(TenantId) -ApplicationId $(ApplicationId) -CertificateThumbprint $(CertificateThumbprint) # 定义存储账户和容器信息 $storageAccountName = "你的存储账户名" $containerName = "你的Blob容器名" $blobName = "trivy-reports/report-$(Build.BuildId)-$(Build.DefinitionName).json" $filePath = "/home/vsts/work/1/s/report-$(Build.BuildId)-$(Build.DefinitionName).json" # 上传文件到Blob容器 $storageAccount = Get-AzStorageAccount -ResourceGroupName 你的资源组名 -Name $storageAccountName Set-AzStorageBlobContent -File $filePath -Container $containerName -Blob $blobName -Context $storageAccount.Context
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

