访问 GitHub Actions 矩阵中的嵌套 JSON。

3

有以下代码片段:

on:
  push:
    branches:
      - main

jobs:
  step1:
    runs-on: ubuntu-latest
    outputs:
      matrix: ${{ steps.build.outputs.matrix }}
    steps:
    - id: build
      run: echo "matrix=[{\"project\":\"foo\",\"config\":\"Debug\"},{\"project\":\"bar\",\"config\":\"Release\"}]" >> $GITHUB_OUTPUT

  step2:
    needs: step1
    runs-on: ubuntu-latest
    strategy:
      matrix: 
        include: ${{fromJson(needs.step1.outputs.matrix)}}
    steps:
    - run: echo hello

在设置矩阵include: ${{fromJson(needs.step1.outputs.matrix)}}时,是否可以访问单个值,例如project,而不是整个JSON对象?

另外,在JSON格式字符串中存在嵌套的JSON对象时,如何实现此操作?


请同时包含嵌套JSON的示例。为此,您是否尝试使用索引运算符[],然后使用解引用运算符.取消引用属性,例如fromJson(needs.step1.outputs.matrix)[0].project?请参见运算符。(未经测试) - Azeem
@Azeem 使用索引运算符似乎不起作用,因为它不返回序列。在评估作业“test”的“strategy”时出错。.github/workflows/test.yml(第30行,第18列):值“foo”的类型意外,期望类型:Sequence。 - SomeDutchGuy
你需要根据你的实际矩阵进行匹配。你可以使用 format() 创建所需的原始 JSON,然后再次使用 fromJSON 将其转换为有效的 JSON 数组(序列)。 - Azeem
@Azeem 如果你能提供一个解决方案,我有可以接受的答案。 :) - SomeDutchGuy
这是试错的过程。请更新您的问题并提供所有细节。我稍后会尝试查看一下。谢谢! - Azeem
1个回答

3

shell 之外的工作流上下文中,您可以使用 functions,例如 toJSON()fromJSON()join(),以及 operators,例如 .(属性解引用)和 [](索引运算符),结合 object filters 使用。

shell 中,您可以利用函数、运算符和对象过滤器,以及 jq 命令行实用程序,以获得更大的灵活性和复杂的 JSON 操作。

以下是一个示例工作流程:

name: populate_matrix_from_json

on: workflow_dispatch

jobs:
  step1:
    runs-on: ubuntu-latest

    outputs:
      matrix: ${{ steps.setup.outputs.matrix }}

    steps:
    - name: Setup
      id: setup
      env:
        CONFIG: >-
          [
            {
              "project": "foo",
              "config": "Debug",
              "nested": [
                {
                  "val": "val1"
                }
              ]
            },
            {
              "project": "bar",
              "config": "Release",
              "nested": [
                {
                  "val": "val2"
                },
                {
                  "val": "val3"
                }
              ]
            }
          ]
      run: echo "matrix=$(jq -r -c . <<< "$CONFIG")" >> $GITHUB_OUTPUT
    
    - name: Check
      run: jq . <<< '${{ steps.setup.outputs.matrix }}'

  step2:
    needs: step1

    runs-on: ubuntu-latest

    strategy:
      matrix: 
        include: ${{ fromJSON(needs.step1.outputs.matrix) }}

    steps:
    - name: Check
      env:
        MATRIX: ${{ toJSON(matrix) }}
        PROJECT: ${{ fromJSON(toJSON(matrix)).project }}
        CONFIG: ${{ fromJSON(toJSON(matrix)).config }}
        NESTED: ${{ join(fromJSON(toJSON(matrix)).nested.*.val, ', ') }}
      run: |
        echo "MATRIX: $(jq -r -c '.' <<< "$MATRIX")"
        echo "PROJECT: [$PROJECT]"
        echo "CONFIG: [$CONFIG]"
        echo "NESTED: [$NESTED]"

输出step2 - 1):

step2 - 1

输出step2 - 2):

step2 - 2


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接