跳至主要内容

在作业之前或之后运行脚本

脚本可以在自托管运行器上自动执行,直接在作业之前或之后执行。

关于作业前和作业后脚本

您可以在自托管运行器上自动执行脚本,在作业运行之前或作业运行完成后执行。您可以使用这些脚本支持作业的要求,例如构建或拆除运行器环境,或清理目录。您还可以使用这些脚本跟踪运行器使用情况的遥测数据。

当运行器上设置了特定环境变量时,自定义脚本会自动触发;环境变量必须包含脚本的绝对路径。有关更多信息,请参阅下面的“触发脚本”。

支持以下脚本语言

  • 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_STARTEDACTIONS_RUNNER_HOOK_JOB_COMPLETED 执行的脚本没有超时设置。因此,您可以考虑在脚本中添加超时处理。

查看工作流运行日志

要确认您的脚本是否正在执行,您可以查看该作业的日志。脚本将列在“设置运行器”或“完成运行器”的单独步骤中,具体取决于哪个环境变量触发了脚本。有关检查日志的更多信息,请参阅“使用工作流运行日志”。