簡體   English   中英

如何在 Azure DevOps 管道任務中傳遞 Json 變量作為輸入

[英]How to pass Json variable as inputs in Azure DevOps pipeline task

我在管道運行期間根據少量管道參數和預定義的環境變量動態形成 JSON,並嘗試將此 JSON 作為后續管道任務的輸入傳遞。

   jobs:
     - job: PayloadCreation
       pool: linux-agent (or windows)
       steps:
        - ${{ each app in apps }}:
            - bash: |
                payload=$(jq .artifact += [{"name": "${{ app.name}}, "version":"$(Build.BuildId)"}]' artifact.json)
                echo $payload > artifact.json
                echo "##vso[task.setvariable variable=payload]$payload"

我得到了artifact.json的 output 以及變量 $payload 如下 -

"artifacts": [
  {
    "name":"service-a",
    "version":"1.0.0"
  },
  {
    "name":"service-b",
    "version": "1.0.1"
  }
 ]
}

隨后,我嘗試使用此 JSON 變量將其作為輸入傳遞給以下作業,但無法這樣做。

 - job: JobB
   steps:
     - task: SericeNow-DevOps-Agent-Artifact-Registration@1
       inputs:
         connectedServiceName: 'test-SC'
         artifactsPayload: $(payload)

它無法讀取 JSON 作為輸入變量。 我收到以下錯誤 - Artifact Registration could not be sent due to the exception: Unexpected token $ in JSON at position 0

有沒有其他方法可以將 JSON 作為輸入變量傳遞?

默認情況下,作業之間的變量不可用。 JobB中,未定義$(payload)變量。

設置變量時,需要提供isOutput : echo "##vso[task.setvariable variable=payload;isOutput=true]$payload"

引用變量時,需要使用適當的運行時表達式:

variables:
  payload: $[ dependencies.PayloadCreation.outputs['payload'] ]

參考: https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=yaml%2Cbatch#share-variables-across-pipelines

https://docs.microsoft.com/en-us/azure/devops/pipelines/scripts/logging-commands?view=azure-devops&tabs=bash#setvariable-initialize-or-modify-the-value-of-a-多變的

有沒有其他方法可以將 JSON 作為輸入變量傳遞?

嚴格來說,沒有。 DevOps pipeline 概念下的變量不支持 JSON object。

為什么沒有?

https://docs.microsoft.com/en-us/azure/devops/pipelines/process/expressions?view=azure-devops#variables

變量總是字符串。

但這並不意味着您不能傳遞 JSON 信息,如果您願意,傳遞字符串是唯一的方法。

任務是自己設計的嗎?

將字符串 object 轉換為 JSON object 並不難:

//convert string object to json object

var str = `
{
"artifacts": [
    {
      "name":"service-a",
      "version":"1.0.0"
    },
    {
      "name":"service-b",
      "version": "1.0.1"
    }
   ]
  }
`;
var obj = JSON.parse(str);
console.log(obj.artifacts[0].name);
console.log(obj.artifacts[0].version);

不確定您的任務設計如何,但丹尼爾傳遞變量的方法是正確的。

將字符串 object 轉換為 JSON object 后,您可以在擴展任務代碼中進行操作。

這里我添加日志命令的其他相關信息:

設置變量

變量級別

順便說一句,在您的問題中,json 是

"artifacts": [
  {
    "name":"service-a",
    "version":"1.0.0"
  },
  {
    "name":"service-b",
    "version": "1.0.1"
  }
 ]
}

不應該是這樣嗎?

{
"artifacts": [
  {
    "name":"service-a",
    "version":"1.0.0"
  },
  {
    "name":"service-b",
    "version": "1.0.1"
  }
 ]
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM