【发布时间】: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