如何通过PowerShell脚本根据测试结果列出/取消列出Azure Artifacts包版本
基于Azure DevOps流水线测试结果控制包版本列出状态的实现方案
1. 流水线结构调整
先把现有流水线拆分为三个串行的独立阶段,方便按条件执行后续操作:
- 阶段1:包发布阶段,完成新版本artifact的上传推送
- 阶段2:自动化测试阶段,拉取刚发布的包执行校验逻辑,输出测试是否通过的标记变量
- 阶段3:包状态更新阶段,根据测试结果执行对应操作
2. 测试结果输出配置
在测试阶段的末尾添加一个脚本任务,把测试结果写入流水线的全局输出变量,方便后续阶段读取。以PowerShell任务为例:
# 此处替换为你自己的测试结果读取逻辑,比如读取测试报告的 pass/fail 标记 $testPass = $true # 实际使用时改为从测试结果动态获取 # 写入输出变量,设置isOutput=true允许跨阶段调用 Write-Host "##vso[task.setvariable variable=isTestPass;isOutput=true]$testPass"
给该脚本任务设置引用名(比如testResult),同时给测试阶段设置阶段名(比如TestStage),用于后续变量引用。
3. 状态更新阶段的执行条件配置
在包状态更新阶段下新增两个并行的作业,分别对应测试通过和不通过的场景,分别配置执行条件:
- 公开列出作业的执行条件:
eq(dependencies.TestStage.outputs['testResult.isTestPass'], 'true'),测试通过时才运行 - 取消列出作业的执行条件:
eq(dependencies.TestStage.outputs['testResult.isTestPass'], 'false'),测试不通过时才运行
4. 包状态修改逻辑实现
操作前需要给流水线的内置服务账号授予Artifact源的「参与者」权限,之后可以通过Azure CLI或者Azure DevOps REST API修改包的列出状态:
测试通过时公开列出包
如果是通用包可以直接用az cli命令:
az artifacts universal publish \ --organization https://dev.azure.com/你的组织名称 \ --project 你的项目名称 \ --scope project \ --feed 你的源名称 \ --name 包名 \ --version 刚发布的包版本号 \ --path 本地包路径
测试不通过时取消列出包
调用Azure DevOps REST API修改包的listed属性为false即可,PowerShell示例:
# 直接使用流水线内置的System.AccessToken做鉴权,无需额外配置token $token = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$(System.AccessToken)")) $headers = @{ Authorization = "Basic $token" "Content-Type" = "application/json" } # 接口地址中的ID可以从Artifacts页面的URL中提取 $apiUrl = "https://pkgs.dev.azure.com/你的组织名/_apis/packaging/feeds/源ID/packages/包ID/versions/版本ID?api-version=7.1-preview.1" $body = @{ listed = $false } | ConvertTo-Json Invoke-RestMethod -Uri $apiUrl -Method Patch -Headers $headers -Body $body
5. 可选兜底配置
如果担心测试阶段异常导致无结果输出,可以在状态更新阶段前加人工审批节点,由开发人员确认测试结果后再执行后续操作。
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

