【问题标题】:How can we get the "inputs" context from within a javascript GitHub action?我们如何从 javascript GitHub 操作中获取“输入”上下文?
【发布时间】:2022-01-26 20:04:39
【问题描述】:

我正在使用github-script action 为我的工作流程中的某些任务使用一些 javascript。

例如,如果我使用带有workflow_dispatch 触发器的工作流,我可以通过context.payload.inputs 获取其输入。

我正在使用reusable workflows,所以我有一个带有workflow_call 触发器的工作流,然后是另一个通过jobs.<job>.uses 调用该触发器的工作流。

在工作流文件中使用模板时,workflow_dispatch 输入的引用类似于 ${{ github.event.inputs.<input_name> }},但要将输入引用到 workflow_call,我们只需使用 ${{ inputs.<input_name> }}That's all fine when templating the values,那里没有问题,但我想知道如何从 JS 中直接获取 inputs 上下文。我似乎找不到它,也找不到任何示例。

这里有一些 sn-ps 来演示:

workflow_dispatch 示例

---
name: scripty
on:
  workflow_dispatch:
    inputs:
      dummy:
        required: false
        description: dummy
jobs:
  scripty:
    runs-on: ubuntu-latest
    steps:
      - name: script
        id: script
        uses: actions/github-script@v5
        with:
          script: |
            var dummy = context.payload.inputs.dummy
            return {
                context: context,
                github: github,
                env: process.env,
                test1: dummy
            }

      - run: |
          echo <<EOF
          ${{ toJSON(fromJSON(steps.script.outputs.result)) }}
          EOF

这很好用!

workflow_call 工作流(被重用的)

---
name: scripty-called
on:
  workflow_call:
    inputs:
      dummy:
        required: false
        description: dummy
jobs:
  scripty-called:
    runs-on: ubuntu-latest
    steps:
      - name: script
        id: script
        uses: actions/github-script@v5
        with:
          script: |
            //var dummy = context.payload.inputs.dummy
            // ^ this will fail
            return {
                context: context,
                github: github,
                env: process.env
            }

      - run: |
          echo <<EOF
          ${{ toJSON(fromJSON(steps.script.outputs.result)) }}
          EOF

调用工作流程

---
name: scripty-caller
on:
  pull_request:
jobs:
  scripty-caller:
    name: Call scripty
    uses: <my-repo>/.github/workflows/scripty-shared.yml@thisref
    with:
      dummy: '@DUMMY_VALUE@'

现在,我知道在这个示例中,我将脚本嵌入到工作流中,所以我可以将其模板化:

      - name: script
        id: script
        uses: actions/github-script@v5
        with:
          script: |
            var dummy = '${{ inputs.dummy }}'
            return {
                context: context,
                github: github,
                env: process.env
            }

但这感觉不对……如果我想将脚本放入 repo 中的单独文件中,或者如果我想将此 sn-p 升级为真正的基于 JS 的操作,它将无法正常工作。

所以我想知道,如何访问该值?而且,我怎么能在不发布的情况下找到答案?我已经花了好几个小时来挖掘代码、文档和网络帖子,还有更好的地方吗?

【问题讨论】:

  • 当您将脚本放入单独的文件时,您不能在调用运行该文件时提供输入作为参数吗?对于调用 shell 脚本的操作,我就是这样做的。
  • @BenjaminW。是的,我可以,如果它是一个单独的操作,那么我可以使该操作带有一个参数并强制最终用户发送所需的输入(或者如果我需要整个操作,则类似于${{ toJSON(inputs) }}),但这不是一个好的体验。无论如何,我可以肯定地解决这个问题,但我想弄清楚如何可以本地访问这个值,或者如果不能,为什么不呢?
  • @BenjaminW。考虑到它的工作方式和限制,如果调用工作流没有传递到被调用的工作流中的环境,则有点令人惊讶,因此不可能以这种方式传递值。由于被调用的工作流是运行的全部(你不能将它与调用工作流中的其他任务结合起来),这也排除了文件系统等。输入是将值传递到工作流调用的受支持方法。
  • 我的意思是把它放在被调用工作流工作的步骤环境中。

标签: node.js github-actions github-api


【解决方案1】:

我发帖是为了描述我所做的事情,尽管我从未找到我实际问题的答案。不过我不会将此标记为答案,也许有一天会直接回答。

最后,我不得不求助于模板。

我选择做的不是单独模板化每个输入,而是模板inputs 一次,这样我就可以将所有输入作为地图获取,保留类型信息。

var inputs = ${{ toJSON(inputs) }}
var dummy = inputs['dummy']

最初让我失望的是我试图将序列化的 JSON 放入一个字符串,然后在代码中反序列化它,类似于:

// don't do this
var inputsJson = '${{ toJSON(inputs) }}'
var inputs = JSON.parse(inputsJson)

这一直失败,因为 JSON 是多行的等等,我花了很长时间才意识到 JSON 是有效的 JS;我们可以嵌入它并直接使用它/分配它。感觉很奇怪,但效果很好。

【讨论】:

    猜你喜欢
    • 2021-11-22
    • 2021-08-12
    • 2014-04-28
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2023-01-02
    • 2020-06-03
    • 2015-09-24
    相关资源
    最近更新 更多