尝试在 Github 操作中解析 JSON 输出

Trying to parse JSON output in a Github Action

我正在尝试在 GitHub 操作中提取 HTTP 请求的值,然后在另一个步骤中使用该值。

这是当前代码:

  - run: call some https endpoint

并且 returns 到控制台输出:

{
    "authorizationToken": "<snip>",
    "expiration": "2021-02-26T18:18:38+00:00"
}

我正在尝试提取 authorizationToken 值,然后在下一步中使用它,例如

  -name: Get auth token
   run: call some https endpoint
   
  -name: set something which uses the token
   run: set blah --token $token_from_previous_step
现在,我什至无法使用 jq 程序从 json 输出中获取身份验证令牌的值:
~  - run: call some https endpoint | echo "jq '.authorizationToken'"~

哪些错误:

jq '.authorizationToken'
Exception ignored in: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'>
BrokenPipeError: [Errno 32] Broken pipe

我现在可以提取 key/value ..但不确定如何将其设置为环境变量,以便在其他步骤中使用。

这个有效:

    - run: call some https endpoint > at.json
    - run: jq '.authorizationToken' at.json

以便从该 https 端点结果中获取 json 输出并将结果保存到名为 at.json 的文件中(即上面的 json 文本)。

接下来,我然后 运行 jq 命令,提取 authorizationToken 值。哪个有效!

现在我需要将这个值设置为环境变量。 Reading the docs on this, it looks like it can be done,但我不确定如何调用 jq 并将 key/value 设置为环境变量。

我觉得我需要做这样的事情:

    - run: echo "AUTH_TOKEN=run the jq command here" >> $GITHUB_ENV

类似这样的事情(完全失败):

    - run: echo "AUTH_TOKEN=${{ jq '.authorizationToken' at.json }}" >> $GITHUB_ENV
  • 我需要使用 >> $GITHUB_ENV 来设置环境变量。
  • 我需要获得 运行 一组内联命令行程序的正确语法。
    - run: call some https endpoint > at.json
    - run: echo "AUTH_TOKEN= $(jq '.authorizationToken' at.json)" >> $GITHUB_ENV
    - run: echo "${{ env.AUTH_TOKEN }}"

上述解决方案的详细信息:

  • 第 1 行:一些通过 HTTPS 调用一些外部服务的命令。响应负载为 JSON。 json 数据然后直接存储到名为 at.json.
  • 的文件中
  • 第 2 行:以 <key>=<value> 格式显示一些文本。然后将此文本附加到github环境变量'list/text/whatever'。现在 -> 这是关键 => 计算此 key/value 的 value 部分,运行 位 $( .. ) 内的一些命令(或命令)。所以对我来说,我正在 运行ning jq 命令并从文件 at.json 中的 json 文本中提取 authorizationToken 的值。呸!
  • 第 3 行:将我的环境变量的值转储到日志输出。 (是的,是的.. 这都是不安全的。我这样做是为了测试。)

就是这样!

我将在这里添加更多解决方案。就像您自己发现的那样,您可以将其作为环境变量传递:

steps:
  - run: |
      token=$( callEndpoint | jq '.authorizationToken' )
      echo "AUTH_TOKEN=$token" >> "$GITHUB_ENV"

    - run: echo "$AUTH_TOKEN"

你也可以使用步进输出:

steps:
  - id: get-token
    run: |
      token=$( callEndpoint | jq '.authorizationToken' )
      echo "::set-output name=auth_token::$token"

    - run: echo ${{ steps.get-token.outputs.auth_token }}

这两种解决方案都适用于在同一作业的步骤之间传递值

如果需要在不同作业的步骤之间传递值,可以使用作业输出:


jobs:
  job-a:
    runs-on: ubuntu-latest
    outputs:
      auth_token: ${{ steps.get-token.outputs.auth_token }}
    steps:
      - id: get-token
        run: |
          token=$( callEndpoint | jq '.authorizationToken' )
          echo "::set-output name=auth_token::$token"

  job-b:
    runs-on: ubuntu-latest
    needs: job-a
    steps:
      - run: echo ${{ needs.job-a.outputs.auth_token }}