尝试解析 Github Action 中的 JSON 输出

Pur*_*ome 5 command-line-interface jq github-actions

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

这是当前的代码:

  - run: call some https endpoint
Run Code Online (Sandbox Code Playgroud)

然后返回到控制台输出:

{
    "authorizationToken": "<snip>",
    "expiration": "2021-02-26T18:18:38+00:00"
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试提取该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
Run Code Online (Sandbox Code Playgroud) 现在,我什至无法使用“jq”程序从 json 输出中提取身份验证令牌的值:
~  - run: call some https endpoint | echo "jq '.authorizationToken'"~
Run Code Online (Sandbox Code Playgroud)

其中错误:

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

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

这有效:

    - run: call some https endpoint > at.json
    - run: jq '.authorizationToken' at.json
Run Code Online (Sandbox Code Playgroud)

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

接下来,我运行该jq命令,提取该authorizationToken值。这有效!

现在我需要将此值设置为环境变量。阅读有关此的文档,看起来可以完成,但我不确定如何调用jq并将键/值设置到环境变量中。

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

    - run: echo "AUTH_TOKEN=run the jq command here" >> $GITHUB_ENV
Run Code Online (Sandbox Code Playgroud)

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

    - run: echo "AUTH_TOKEN=${{ jq '.authorizationToken' at.json }}" >> $GITHUB_ENV
Run Code Online (Sandbox Code Playgroud)

ITC*_*hap 13

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

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

    - run: echo "$AUTH_TOKEN"
Run Code Online (Sandbox Code Playgroud)

您还可以使用步骤输出:

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

    - run: echo ${{ steps.get-token.outputs.auth_token }}
Run Code Online (Sandbox Code Playgroud)

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

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


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 }}
Run Code Online (Sandbox Code Playgroud)