1+1=10

扬长避短 vs 取长补短

基于GitHub Actions 的 Self Hosted Runner 搭建小记

如何在自己电脑中搭建Runners,以便于让Github Actions来调用?个人觉得很有意义的东西,但是网上相关介绍很少,看来要么是太简单了,要么是不实用

先准备两台主机,一台Windows10,一台Ubuntu22.04,不需要公网IP(Runner主动连接GitHub,所以主机在NAT内部,没有公网IP是没问题的)。

按文档走

官方有详细文档 Adding self-hosted runners - GitHub Docs ,只需要照着走一遍...

创建仓库

创建一个 private 仓库(public仓库会暴露个人搭建的 Runner,不安全)

仓库名:dbzhang800/test-self-hosted-runner

设置仓库

依次点击:

Settings => Actions => Runners => New self-hosted runner

在这儿,可以选择Runner运行的系统:

  • macOS
  • Linux
  • Windows

选中后,它在页面上会给出对应平台所需要的操作指令(很详细,照做即可),主要做两件事情:

  • 下载并解压 Runner 程序: actions-runner-xxxx.tar.gz
  • 解压后执行config脚本

Ubuntu下安装配置Runner

手边是台Ubuntu22.04主机,先用它试试看。

按Github给出的指令,逐条输入。

首先,下载当前最新版的actions-runner-xxxx.tar.gz程序,并解压

$ mkdir actions-runner && cd actions-runner
$ curl -o actions-runner-linux-x64-2.311.0.tar.gz -L https://github.com/actions/runner/releases/download/v2.311.0/actions-runner-linux-x64-2.311.0.tar.gz
$ tar xzf ./actions-runner-linux-x64-2.311.0.tar.gz

然后,执行config脚本进行配置

$ ./config.sh --url https://github.com/dbzhang800/test-self-hosted-runner --token ******

配置过程中,它会连接到GitHub,并会提示输入Runner group名字(默认即可),Runner名字(我叫它db-ubuntu2204),工作文件夹名字(默认_work)。

配置完成后,在仓库的Setttings中即可看到自己的Runner,如下图所示(Offline状态):

github-self-hosted-runner-dbubuntu2204

要激活它,只需要运行如下命令(变为Idle状态):

$ ./run.sh

Windows下安装配置Runner

流程和上面一样,按官方建议,使用管理员权限,并将目录设置为C:\actions-runner。

配置过程中,它会连接到GitHub,并会提示输入Runner group名字(默认即可),Runner名字(我叫它db-windows10),工作文件夹名字(默认_work)。

配置完成后,在仓库的Setttings中即可看到自己的Runner,如下图所示(Offline状态):

github-self-hosted-runner-dbwindows10

执行如下命令,激活它

./run.cmd

测试

在Github后台,可以看到Runner处于Idle状态,在Runner控制台,可以看到如下输出

2023-11-13 06:49:30Z: Listening for Jobs

表明Runner配置成功。要证明其工作,还是需要在仓库中添加workflow....

workflow使用自己的Runner(Ubuntu)

在开始创建的仓库中,添加workflow文件:.github/workflows/self-hosted-ubuntu.yml

name: Self Hosted Runners Test

on: [push]

jobs:
  build:

    runs-on: [self-hosted, Linux]

    steps:
      - uses: actions/checkout@v3
      - name: Display Python version
        run: python -c "import sys; print(sys.version)"

考虑到连接Github速度实在太慢,只试试代码拉取,并执行系统python的命令。

我的Windows和Linux上都安装有Python3.x,且在环境变量PATH中。

测试结果

网速还是太感人了,连一个actions都没下载成功:

Action 'https://api.github.com/repos/actions/checkout/tarball/f43a0e5ff2bd294095638e18286ca9a3d1956744' download has timed out. Error: The request was canceled due to the configured HttpClient.Timeout of 100 seconds elapsing.

不管怎样,流程反正是通了。看来在国内也只能做这种demo了,没有使用性。要跑完流程,看来需要找台国外的主机试试...

不过反复尝试三次,Linux下面总算跑通一次

workflow使用自己的Runner(Windows)

同Linux下一样,创建一个使用与Windows下runner的workflow文件:.github/workflows/self-hosted-ubuntu.yml

name: Self Hosted Runners Test Windows

on: [push]

jobs:
  build:

    runs-on: [self-hosted, Windows]

    steps:
      - uses: actions/checkout@v3
      - name: Display Python version
        run: python -c "import sys; print(sys.version)"

权限问题

上面的workflow遇到如下权限问题:

Run python -c "import sys; print(sys.version)"
. : File C:\actions-runner\_work\_temp\04a4a880-b37a-4c97-bc6b-f0a76e18e7b5.ps1 cannot be loaded because running script
s is disabled on this system. For more information, see about_Execution_Policies at https:/go.microsoft.com/fwlink/?Lin
kID=135170.
At line:1 char:3
+ . 'C:\actions-runner\_work\_temp\04a4a880-b37a-4c97-bc6b-f0a76e18e7b5 ...
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : SecurityError: (:) [], PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess
Error: Process completed with exit code 1.

因为runner运行在Windows10上面,而不是Windows Server上,二者默认的执行策略不同。

  • Restricted(适用于 Windows 客户端)。
  • RemoteSigned(适用于 Windows 服务器)。

解决方案:在PowerShell中执行

Set-ExecutionPolicy RemoteSigned

作用:允许本地运行未签名的脚本,但是通过网络传输的脚本必须经过数字签名。

demo完成

最终结果如下:

github-self-hosted-runner-result

参考

Comments