如何在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
相关产品推荐
相关产品推荐

