关于作业前和作业后脚本
您可以在自托管运行器上自动执行脚本,在作业运行之前或作业运行完成后执行。您可以使用这些脚本支持作业的要求,例如构建或拆除运行器环境,或清理目录。您还可以使用这些脚本跟踪运行器使用情况的遥测数据。
当运行器上设置了特定环境变量时,自定义脚本会自动触发;环境变量必须包含脚本的绝对路径。有关更多信息,请参阅下面的“触发脚本”。
支持以下脚本语言
- Bash: 使用
bash
,可以回退到sh
。通过运行-e {pathtofile}
执行。 - PowerShell: 使用
pwsh
,可以回退到powershell
。通过运行-command \". '{pathtofile}'\"
执行。
编写脚本
您的自定义脚本可以使用以下功能
- 变量: 脚本可以访问默认变量。完整的 Webhook 事件有效负载可以在
GITHUB_EVENT_PATH
中找到。有关更多信息,请参阅 "变量." - 工作流命令: 脚本可以使用工作流命令。有关更多信息,请参阅 "GitHub Actions 的工作流命令". 脚本还可以使用环境文件。有关更多信息,请参阅 环境文件.
您的脚本文件必须使用相关语言的文件扩展名,例如 .sh
或 .ps1
,才能成功运行。
注意: 避免使用您的脚本将敏感信息输出到控制台,因为任何拥有仓库读取权限的人员都可能在 UI 日志中看到输出。
处理退出代码
对于预作业脚本,退出代码 0
表示脚本已成功完成,作业将继续运行。如果存在任何其他退出代码,作业将不会运行,并将被标记为失败。要查看预作业脚本的结果,请检查 Set up runner
条目的日志。有关检查日志的更多信息,请参阅 "使用工作流运行日志."
不支持使用 continue-on-error
设置来运行这些脚本。
触发脚本
自定义脚本必须位于运行器上,但不能存储在 actions-runner
应用程序目录中。脚本在运行运行器服务的服务帐户的安全上下文中执行。
注意: 触发的脚本是同步处理的,因此它们将在运行时阻塞作业执行。
当运行器具有以下环境变量(包含脚本的绝对路径)时,脚本将自动执行
ACTIONS_RUNNER_HOOK_JOB_STARTED
: 当作业被分配给运行器但尚未开始运行时,将触发此环境变量中定义的脚本。ACTIONS_RUNNER_HOOK_JOB_COMPLETED
: 在作业结束时,所有工作流中定义的步骤都运行完毕后,将触发此环境变量中定义的脚本。
要设置这些环境变量,您可以将它们添加到操作系统中,或者将它们添加到自托管运行器应用程序目录(即您下载并解压缩运行器软件的目录)中的名为 .env
的文件中。例如,以下 .env
条目将使运行器在每个作业运行之前自动运行一个脚本,该脚本保存在运行器机器上的 /opt/runner/cleanup_script.sh
中。
ACTIONS_RUNNER_HOOK_JOB_STARTED=/opt/runner/cleanup_script.sh
注意: ACTIONS_RUNNER_HOOK_JOB_COMPLETED
中定义的脚本在作业结束时执行,在作业完成之前执行。这使得它不适合可能中断运行器的用例,例如作为自动扩展实现的一部分删除运行器机器。
故障排除
权限被拒绝
如果您在尝试运行脚本时收到“权限被拒绝”错误,请确保脚本可执行。例如,在 Linux 或 macOS 上的终端中,您可以使用以下命令使文件可执行。
chmod +x PATH/TO/FILE
有关使用工作流运行脚本的信息,请参阅“GitHub Actions 的基本功能”。
没有超时设置
目前,ACTIONS_RUNNER_HOOK_JOB_STARTED
或 ACTIONS_RUNNER_HOOK_JOB_COMPLETED
执行的脚本没有超时设置。因此,您可以考虑在脚本中添加超时处理。
查看工作流运行日志
要确认您的脚本是否正在执行,您可以查看该作业的日志。脚本将列在“设置运行器”或“完成运行器”的单独步骤中,具体取决于哪个环境变量触发了脚本。有关检查日志的更多信息,请参阅“使用工作流运行日志”。