You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure DevOps管道任务中如何正确传递动态生成的JSON变量?

问题分析与解决方案

你遇到的错误本质是跨作业传递JSON变量时格式被破坏,加上原脚本存在语法问题,导致后续任务收到的不是合法JSON。以下是具体修正方案:

核心问题点

  1. 跨作业传递变量未标记为输出变量,Azure DevOps默认不会将变量传递到后续作业
  2. 原jq命令存在引号语法错误,生成的JSON本身格式可能不合法
  3. 直接传递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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 22:06:35