Azure DevOps管道任务中如何正确传递动态生成的JSON变量?
问题分析与解决方案
你遇到的错误本质是跨作业传递JSON变量时格式被破坏,加上原脚本存在语法问题,导致后续任务收到的不是合法JSON。以下是具体修正方案:
核心问题点
- 跨作业传递变量未标记为输出变量,Azure DevOps默认不会将变量传递到后续作业
- 原
jq命令存在引号语法错误,生成的JSON本身格式可能不合法 - 直接传递JSON字符串时,未做转义处理,Azure DevOps会解析特殊字符导致JSON结构损坏
方案一:修正变量传递逻辑(推荐)
修改PayloadCreation作业,将变量标记为输出变量,同时修复jq语法:
jobs: - job: PayloadCreation pool: linux-agent steps: # 先初始化JSON基础结构,避免jq首次执行报错 - bash: | echo '{"artifacts": []}' > artifact.json displayName: 初始化JSON文件 - ${{ each app in apps }}: - bash: | # 修复jq引号拼接问题,生成合法JSON payload=$(jq '.artifacts += [{"name": "${{ app.name }}", "version": "$(Build.BuildId)"}]' artifact.json) echo "$payload" > artifact.json # 标记为输出变量,允许后续作业引用 echo "##vso[task.setvariable variable=payload;isOutput=true]$payload" name: GeneratePayload # 必须给步骤命名,后续通过步骤名引用变量 - job: JobB dependsOn: PayloadCreation variables: # 引用前一个作业的输出变量 transferedPayload: $[ dependencies.PayloadCreation.outputs['GeneratePayload.payload'] ] steps: - task: SericeNow-DevOps-Agent-Artifact-Registration@1 inputs: connectedServiceName: 'test-SC' artifactsPayload: '$(transferedPayload)' # 用单引号包裹,避免解析破坏JSON
方案二:通过工件传递JSON文件(适合复杂JSON)
如果JSON内容较复杂,直接传递变量容易出问题,可以将JSON写入文件,通过管道工件传递:
jobs: - job: PayloadCreation pool: linux-agent steps: - bash: | # 初始化并生成完整JSON文件 echo '{"artifacts": []}' > artifact.json ${{ each app in apps }}: jq '.artifacts += [{"name": "${{ app.name }}", "version": "$(Build.BuildId)"}]' artifact.json > temp.json && mv temp.json artifact.json displayName: 生成artifact.json - publish: $(System.DefaultWorkingDirectory)/artifact.json artifact: payloadArtifact displayName: 发布JSON工件 - job: JobB dependsOn: PayloadCreation steps: - download: current artifact: payloadArtifact displayName: 下载JSON工件 - task: SericeNow-DevOps-Agent-Artifact-Registration@1 inputs: connectedServiceName: 'test-SC' artifactsPayload: '$(cat $(Pipeline.Workspace)/payloadArtifact/artifact.json)'
内容的提问来源于stack exchange,提问作者rsram312
相关产品推荐
相关产品推荐

