GitHub操作:如何将toJSON()结果传递给shell命令

0lvr5msh  于 4个月前  发布在  Git
关注(0)|答案(3)|浏览(94)

所以,我正在使用Github Actions进行端到端的测试。我所看到的设置是让一个作业检索要测试的URL列表,我的第二个作业使用该列表创建一个矩阵并测试它们。我这里的问题是,当我实际运行我的测试脚本时,它必须从命令行完成,因为我使用的是Playwright。因此,我不能直接使用我的矩阵对象;我必须将其输出到JSON文件。问题是,当我将其输出到我的文件时,toJSON会创建无效的漂亮打印的JSON,这会破坏我的脚本。下面是我的代码:

name: <name>

on:
    push:
    workflow_dispatch:

jobs:
    fetch_strategic_urls:
        runs-on: ubuntu-latest
        outputs:
            urls: ${{ steps.req-urls.outputs.urls }}
        steps:
            - name: Request Urls
              id: req-urls
              run: |
                  export RESPONSE=$(
                    curl -X GET -H "Accept: application/json" <api-endpoint>)
                  echo "::set-output name=urls::$RESPONSE"
    run_tests:
        runs-on: ubuntu-latest
        strategy:
            matrix:
                url: ${{needs.fetch_strategic_urls.outputs.urls}}
        needs: fetch_strategic_urls
        steps:
            - ...
            - ...
            - run: |
                  ls
                  echo '${{ toJSON(matrix.url) }}' >> props.json
                  cat props.json
                  npm test
              working-directory: E2E.Tests

字符串
无论我尝试过echo ${{matrix.url}} >> props.json的哪种配置(cat <<'EOF' > props.json ${{matrix.url}},添加和删除引号),它总是生成没有引号的JSON文件,即:{ url: string }而不是{"url": "string"},这是无效的。这显然是相当破坏性的行为。我看到很多人在网上推荐jq,但我不知道如何在这种情况下使用它,因为我怀疑jq是否可以解析GitHub类型的JSON对象,这是我在分片作业时必须使用的。任何帮助都非常感谢!

5m1hhzi4

5m1hhzi41#

直接在命令行中放置JSON文档并不容易。您可以使用env vars。

- shell: bash
  env:
    JSON_DOC: ${{ toJSON(some.var) }}
  run: |
    printf '%s\n' "$JSON_DOC" > foo.json
    cat foo.json
    ...

字符串

z9zf31ra

z9zf31ra2#

Github动作文档在这里有一个解决方案:

name: Context testing
on: push

jobs:
  dump_contexts_to_log:
    runs-on: ubuntu-latest
    steps:
      - name: Dump GitHub context
        id: github_context_step
        run: echo '${{ toJSON(github) }}'

字符串
来自https://docs.github.com/en/actions/learn-github-actions/contexts#example-printing-context-information-to-the-log

vatpfxk5

vatpfxk53#

这不是一个答案,甚至不是一个尝试,更多的是一个地方张贴有关生长激素的行动奇怪。
我想我已经解决了上面的问题:

- name: step-name
  run: | # shell
    echo "${{ toJson(github) }}"

字符串
它工作得很好,直到我合并到main,默认的分支,这时它生成了这个错误:

##[debug]/usr/bin/bash -e /home/runner/work/_temp/11b0a2ad-c8d6-4251-8b4a-6ab18d3de45f.sh
/home/runner/work/_temp/11b0a2ad-c8d6-4251-8b4a-6ab18d3de45f.sh: line 58: syntax error near unexpected token `('
Error: Process completed with exit code 2.


尽管那个冒犯性的语句(${{ toJson(github) }})不在第58行附近。
请注意,这甚至不能作为一个评论:

# echo ${{ toJson(github) }}


因为这仍然会使作业失败,显然是因为github对象中的某些东西,而这些东西只存在于默认的分支中。
我所能想到的是,从toJSON()返回的字符串并不总是正确转义的,因此它破坏了YAML解析器从操作yaml中提取法律的shell脚本的能力。

相关问题