自托管运行器
如果您需要比 GitHub 托管运行器提供的更高控制权限(例如硬件、操作系统、软件和网络访问),您可以选择自行托管运行器。自托管运行器可以安装在物理机器、虚拟机或容器中,且可以运行在本地或任何公共云环境中。
自托管运行器允许您轻松迁移其他构建环境。如果您已经有了自动化构建,您只需要在机器上安装运行器,您的代码应该就可以开始构建。但是,如果您的构建机器仍然是那些手动维护的、可能位于开发者桌子旁的传统机器,那么这并不是一个永久的解决方案。请记住,构建和托管一个动态可扩展的环境需要专业知识和成本,不论它是在云端还是本地托管。因此,如果您可以使用托管运行器,它始终是更简单的选择。然而,如果您需要自托管解决方案,请确保将其构建为一个弹性可扩展的解决方案。
托管您自己的运行器可以让您从 GitHub Enterprise Cloud 中安全地构建和部署到您的本地环境。这使您能够以混合模式运行 GitHub——即您可以将 GitHub Enterprise 与托管运行器一起使用,用于基本的自动化和部署到云环境,但可以使用自托管运行器来构建或部署托管在本地的应用程序。这比运行 GitHub Enterprise Server 和自己管理所有构建和部署环境的解决方案更便宜、更简单。 |
如果您依赖硬件来测试您的软件(例如在进行硬件-in-the-loop 测试时),就无法避免使用自托管运行器。这是因为无法将硬件连接到 GitHub 托管运行器上。
运行器软件
该运行器是开源的,可以在 GitHub 上找到。它支持 Linux、macOS 和 Windows 上的 x64 处理器架构。它还支持 ARM64 和 ARM32 架构,但仅限于 Linux。该运行器支持许多操作系统,包括 Ubuntu、Red Hat Enterprise Linux 7 或更高版本、Debian 9 或更高版本、Windows 7/8/10 和 Windows Server、macOS 10.13 或更高版本等。完整的支持列表可以参考文档: Self-hosted Runners 支持的架构和操作系统。
该运行器会自动更新,因此您无需手动进行更新。
运行器与 GitHub 之间的通信
运行器软件通过端口 443 使用 HTTPS 长轮询的方式向 GitHub 进行轮询,采用出站连接。它会打开一个连接,保持 50 秒,如果没有收到响应,连接会超时。
您必须确保机器具有适当的网络访问权限,能够访问以下 URL:
github.com
api.github.com
*.actions.githubusercontent.com
github-releases.githubusercontent.com
github-registry-files.githubusercontent.com
codeload.github.com
*.pkg.github.com
pkg-cache.githubusercontent.com
pkg-containers.githubusercontent.com
pkg-containers-az.githubusercontent.com
*.blob.core.windows.net
您不需要在防火墙上打开任何入站端口,所有通信都通过客户端进行。如果您使用 GitHub 组织或企业账户的 IP 地址允许列表,您必须将自托管运行器的 IP 地址范围添加到该允许列表中。
在代理服务器后使用自托管运行器
如果您需要在代理服务器后运行自托管运行器,这是可以做到的。但请注意,这可能会引发许多问题。运行器本身可以正常通信,但包管理、容器注册表以及运行器执行的所有需要访问资源的操作都会产生额外的负担。如果可以避免使用代理服务器,建议您这样做。但如果您必须在代理服务器后运行工作流,可以使用以下环境变量来配置运行器:
-
https_proxy:包含用于 HTTPS(端口 443)流量的代理 URL。您还可以包含基本身份验证(例如
https://user:password@proxy.local
)。 -
http_proxy:包含用于 HTTP(端口 80)流量的代理 URL。您也可以包含基本身份验证(例如
http://user:password@proxy.local
)。 -
no_proxy:包含需要绕过代理服务器的主机的逗号分隔列表。
如果您更改了环境变量,必须重新启动运行器以使更改生效。
除了使用环境变量外,还可以使用 .env
文件作为替代方法。在运行器的应用程序文件夹中保存一个名为 .env
的文件。之后,语法与环境变量相同:
https_proxy=http://proxy.local:8081
no_proxy=example.com,myserver.local:443
接下来,让我们看看如何将自托管运行器添加到 GitHub。
将自托管运行器添加到 GitHub
您可以在 GitHub 的不同级别添加运行器:仓库级别、组织级别和企业级别。如果您在仓库级别添加运行器,它们将专门用于该单个仓库。组织级别的运行器可以处理组织中多个仓库的作业,而企业级别的运行器可以分配给企业中多个组织。
安装运行器并将其注册到您的 GitHub 实例非常简单。只需前往您想要添加运行器的级别下的 Settings | Actions | Runners。然后,选择操作系统和处理器架构(见图 7.1):

这将生成一个脚本,该脚本执行以下操作:
-
下载并解压运行器
-
使用相应的值配置运行器
-
启动运行器
脚本的第一部分始终创建一个名为 actions-runner
的文件夹,并将工作目录更改为该文件夹:
$ mkdir actions-runner && cd actions-runner
在 Linux 和 macOS 上,使用 curl
命令下载最新的运行器包;在 Windows 上,使用 Invoke-WebRequest
:
# Linux 和 macOS:
$ curl -o actions-runner-<ver>.tar.gz -L https://github.com/actions/runner/releases/download/<ver>/actions-runner-<ver>.tar.gz
# Windows:
$ Invoke-WebRequest -Uri https://github.com/actions/runner/releases/download/<ver>/actions-runner-<ver>.zip -OutFile actions-runner-<ver>.zip
出于安全原因,下载的包的哈希值会进行验证,以确保包没有被篡改:
# Linux 和 macOS:
$ echo "<hash> actions-runner-<ver>.tar.gz" | shasum -a 256 -c
# Windows:
$ if((Get-FileHash -Path actions-runner-<ver>.zip -Algorithm SHA256).Hash.ToUpper() -ne '<hash>'.ToUpper()){ throw 'Computed checksum did not match' }
然后,从 ZIP/TAR 文件中提取运行器:
# Linux 和 macOS:
$ tar xzf ./actions-runner-<ver>.tar.gz
# Windows:
$ Add-Type -AssemblyName System.IO.Compression.FileSystem ;
[System.IO.Compression.ZipFile]::ExtractToDirectory("$PWD/actions-runner-<ver>.zip", "$PWD")
配置是通过 config.sh
/ config.cmd
脚本完成的,URL 和令牌由 GitHub 自动为您创建:
# Linux 和 macOS:
$ ./config.sh --url https://github.com/org --token token
# Windows:
$ ./config.cmd --url https://github.com/org --token token
配置时会询问运行器组(默认是 Default 组)、运行器名称(默认是机器名)以及附加标签。默认标签用于描述自托管状态、操作系统和处理器架构(例如,self-hosted、Linux 和 X64)。默认工作文件夹是 _work
,不应更改。在 Windows 上,您还可以选择将运行器作为服务运行。在 Linux 和 macOS 上,您需要在配置之后使用另一个脚本来安装服务:
$ sudo ./svc.sh install
$ sudo ./svc.sh start
如果您不想将运行器作为服务运行,可以使用以下命令以交互方式运行:
$ ./run.sh
$ ./run.cmd
如果运行器已启动并运行,您可以在 Settings | Actions | Runners 中看到它,显示其状态和标签(见图 7.2)。

现在让我们学习如何从 GitHub 中移除这些自托管运行器。
移除自托管运行器
如果你想重新配置或移除 GitHub 中的运行器,你需要使用带有 remove
选项的配置脚本。如果你点击运行器的名称打开其详细信息,你会看到一个 “移除” 按钮(见图 7.2)。点击此按钮后,它会为你生成脚本和令牌。

对于不同的操作系统,脚本如下所示:
# Linux and macOS
./config.sh remove --token <token>
# Windows
./config.cmd remove --token <token>
在销毁机器之前,务必先移除运行器!如果你忘记这么做,你仍然可以在 “移除” 对话框中使用 “强制移除此运行器” 按钮。但这应该只作为最后的手段。