Github Actions - workflow 如何调用另一个 workflow
本文最后更新于 2024年6月8日 20:36
在 Github Actions 中,我们可能会有这样的需求:一个 workflow 执行满足了某个条件后,调用另一个 workflow 完成相应业务。
本文将介绍如何在 Github Actions 的 workflow 中调用另一个 workflow.
Github 官方文档:https://docs.github.com/en/actions/using-workflows/reusing-workflows.
1. 创建一个可重用的 workflow
要创建一个可重用的 workflow,我们需要在被调用的 workflow 文件的 on 字段中指定 workflow_call 事件,如下所示:
1 | |
这样,我们就可以在其他 workflow 中调用这个 workflow 了。
2. 调用 workflow
文档中提到如下信息:
You call a reusable workflow by using the uses keyword. Unlike when you are using actions within a workflow, you call reusable workflows directly within a job, and not from within job steps.
jobs.<job_id>.uses
You reference reusable workflow files using one of the following syntaxes:
{owner}/{repo}/.github/workflows/{filename}@{ref}for reusable workflows in public and private repositories../.github/workflows/{filename}for reusable workflows in the same repository.
也就是说,Github Action 有两种调用 workflow 的方式:
- 调用本仓库的 workflow,使用
./.github/workflows/{filename}../代表Github Action 的默认工作目录。 - 调用其他仓库的 workflow,使用
{owner}/{repo}/.github/workflows/{filename}@{ref}.
文档中好像还提到了 ./.github/actions 这种路径的调用方式,和 ./.github/workflows 类似,感兴趣的可以自行查看文档:Using an action in the same repository as the workflow
示例代码如下:
1 | |
由例子可见:使用 uses: 调用 workflow 时,需要直接在 jobs.<job_id>.uses 调用,而不是在 job 的 steps 中调用。
3. 传递参数
如果你需要在调用 workflow 时传递参数,你可以使用 with 字段,如下所示:
这是调用 workflow 的文件 workflow1.yml:
1 | |
使用 with 字段传递参数,foo 是参数名,bar 是参数值。
这是被调用的 workflow 文件 workflow2.yml:
1 | |
在被调用的 workflow 文件中,在 on.workflow_call.inputs 中定义参数,然后在 jobs 中使用 ${{ inputs.foo }} 获取参数值。
4. 项目实战
我们来看一个实际的例子,如何在一个 workflow 中调用另一个 workflow.
1 | |
这是一个检查更新的 workflow,分为两个 job:check-update 和 update。check-update 用于检查是否有更新,update 用于更新。
当 check-update 检查到有更新时,update 会调用 mobeicanyue/test-font 仓库的 split.yml workflow。
需要注意:
- 你需要在
job中使用uses调用 workflow,而不是在steps中使用。 - 如果你需要在 job 中使用
if判断条件,需要在上一步的环境变量中输出到GITHUB_OUTPUT,然后指定job的outputs,这样才能在if中使用。 - 如果被调用的 workflow 涉及到 push 等操作,你需要在
uses中指定permissions: contents: write。具体权限参考:Assign permissions to jobs.
被调用文件 split.yml 如下:
1 | |
这样,我们就实现了在一个 workflow 中调用另一个 workflow 的功能。