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

如何在GitHub Action中遍历fromJSON解析的数组所有元素?

问题

我正在使用docker/metadata-action,目前可以通过"${{fromJSON(steps.meta.outputs.json).tags[0]}}"访问tags数组的首个元素,但无法获取数组全部元素。尝试fromJSON(steps.meta.outputs.json).tags['*']、fromJSON(steps.meta.outputs.json).tags[@]等方式均失败,现寻求遍历该数组所有元素的最优方法。

当前尝试的Push Image步骤代码:

- name: Push Image
  if: ${{ inputs.registry }}
  run: |
    for tag in ${{ fromJSON(steps.meta.outputs.json).tags[0] }}
    do
      echo tag
    done
  shell: bash

对应的JSON输出示例:

{
  "tags": [
    "azurecr.io/internal/dx-integration-bootstrap:feature-docker-action-bootstrap",
    "azurecr.io/internal/dx-integration-bootstrap:sha-e3416c8"
  ]
}
解决方案

方法一:直接利用action的原生tags输出(最简洁)

docker/metadata-action本身提供了tags输出变量,无需手动解析JSON,该变量会自动以空格分隔所有标签:

- name: Push Image
  if: ${{ inputs.registry }}
  run: |
    for tag in ${{ steps.meta.outputs.tags }}
    do
      echo "Pushing tag: $tag"
      docker push "$tag"
    done
  shell: bash

方法二:展开JSON数组(手动解析场景)

如果必须从JSON输出中提取,可通过join(' ', ...)将数组转为空格分隔的字符串,bash会自动遍历:

- name: Push Image
  if: ${{ inputs.registry }}
  run: |
    for tag in ${{ join(' ', fromJSON(steps.meta.outputs.json).tags) }}
    do
      echo "Pushing tag: $tag"
      docker push "$tag"
    done
  shell: bash

方法三:用jq解析(稳妥防特殊字符)

若担心标签存在特殊字符(符合docker规范的标签不会有,但可做兜底),通过jq逐行提取标签:

- name: Push Image
  if: ${{ inputs.registry }}
  run: |
    echo '${{ steps.meta.outputs.json }}' | jq -r '.tags[]' | while read -r tag
    do
      echo "Pushing tag: $tag"
      docker push "$tag"
    done
  shell: bash

内容的提问来源于stack exchange,提问作者semural

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 15:25:15