从 GitHub REST API 文档来看,我们似乎能够创建
repository_dispatch
事件,但不能创建 workflow_dispatch
事件。在 GitHub GraphQL API 中,我找不到如何调度事件。
是否可以使用 API 触发
workflow_dispatch
事件?
是的,可以,手动、通过 Github API或使用 GH CLI。
Actions
选项卡。)基本上,一旦您在选项卡上选择工作流程,如果工作流程实现具有 workflow_dispatch 触发器,则选项
Run workflow
将出现在窗口的右侧部分,如下所示:
在Github官方文档上,有一个服务可以创建工作流调度事件
这是一个卷曲示例:
curl \
-X POST \
-H "Accept: application/vnd.github.v3+json" \
https://api.github.com/repos/octocat/hello-world/actions/workflows/42/dispatches \
-d '{"ref":"main"}'
请注意,您也可以通过此 API 发送工作流程
inputs
。
您还可以在本文中找到更多关于此的参考资料。
还有另一个 Github API 服务来触发repository_dispatch 事件。
您还可以使用
GH CLI 工具通过以下命令触发
workflow_dispatch
事件:
gh workflow run [<workflow-id> | <workflow-name>] [flags]
为给定工作流创建workflow_dispatch事件。
此命令将触发 GitHub Actions 运行给定的工作流程文件。给定的工作流文件必须支持工作流调度“on”触发器才能以这种方式运行。
参考.
如果您希望通过终端命令行触发这些
workflow_dispatch
事件(和 repository_dispatch
事件),您可以使用 Python 中的自动化。可以在这个类中找到实现。
您还可以通过
GH CLI工具触发
workflow_dispatch
:gh workflow run
文档。
例如:
gh workflow run <WORKFLOW_ID> -f param_1=foo
gh workflow list
获取工作流程ID。或者您也可以使用工作流程文件名而不是工作流程 ID。
例如:
gh workflow run staging.yml -f param_1=foo
工作流程ID也可以是工作流程文件名
curl \
-X POST \
-H "Accept: application/vnd.github.v3+json" \
https://api.github.com/repos/<USER>/<REPO>/actions/workflows/build.yaml/dispatches \
-d '{"ref":"main"}'
这是触发 GitHub 工作流程的 python 代码示例。
您可以通过
gh workflow list
获取工作流ID,参见:https://stackoverflow.com/a/71972073/1661491
github_token
是经典的个人令牌,请参阅:https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token
workflow_ref
是分支或标签。
import requests
import json
parameter_dict = ...
github_token = ...
workflow_ref = ...
workflow_id = ...
org = ...
repo_name = ..
inputs_str = json.dumps(parameter_dict)
response = requests.post(
f"https://api.github.com/repos/{org}/{repo_name}/actions/workflows/{workflow_id}/dispatches",
headers={"Authorization": f"Bearer {github_token}"},
data=f'{{"ref": "{workflow_ref}", "inputs": {inputs_str}}}'
)
if response.status_code >= 400:
raise ValueError(f"Failed to trigger workflow: {response.status_code} {response.text}")