跳至主要内容

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

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

关于作业前和作业后脚本

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

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

支持以下脚本语言

  • Bash:使用bash,并且可以回退到sh。通过运行-e {pathtofile}执行。

  • PowerShell:使用pwsh,并可以回退到powershell。通过运行-command \". '{pathtofile}'\"执行。

编写脚本

您的自定义脚本可以使用以下功能

  • 变量:脚本可以访问默认变量。完整的 Webhook 事件有效负载可以在GITHUB_EVENT_PATH中找到。有关更多信息,请参阅“在变量中存储信息”。
  • 工作流命令:脚本可以使用工作流命令。有关更多信息,请参阅“GitHub Actions 的工作流命令”。脚本还可以使用环境文件。有关更多信息,请参阅环境文件

您的脚本文件必须使用相关语言的文件扩展名(例如.sh.ps1),才能成功运行。

注意

避免使用您的脚本将敏感信息输出到控制台,因为任何具有存储库读取权限的人员都可能能够在 UI 日志中看到输出。

处理退出代码

对于作业前脚本,退出代码0表示脚本已成功完成,然后作业将继续运行。如果存在任何其他退出代码,则作业将不会运行,并将标记为失败。要查看作业前脚本的结果,请检查设置运行器条目的日志。有关检查日志的更多信息,请参阅“使用工作流运行日志”。

这些脚本不支持使用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

有关使用工作流运行脚本的信息,请参阅“将脚本添加到您的工作流”。

没有超时设置

当前没有可用于由ACTIONS_RUNNER_HOOK_JOB_STARTEDACTIONS_RUNNER_HOOK_JOB_COMPLETED执行的脚本的超时设置。因此,您可以考虑将超时处理添加到您的脚本中。

查看工作流运行日志

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