自建K3s Github Action Runner

Github的Action workflow提供了一个CI/CD的功能,默认情况下都有500分钟的免费运行时间。但是免费的机器编译速度略慢以及500分钟对于稍大一些的编译并不够用,于是Github也提供了self-hosted runner的选项。

简单的地说self-host runner有两种

  1. 直接在主机上运行。每次触发的运行环境互相不隔离
  2. 直接在k8s上动态的生成一个container,与宿主机完全隔离,每一次运行都是独立的环境

第一种的方法跑起来很简单,只要跟着Github tutorial上的命令粘贴复制即可。但是缺点是宿主机的发行版必须是Github支持的,比如Debian或者Ubuntu。对于ArchLinux爱好者不友好。

第二种方法显然跑一个k8s是个麻烦,于是我们可以简单用一个单机k3s来同样实现。

安装k3s

1
2
curl -sfL https://get.k3s.io | sh -
sudo k3s kubectl get nodes

用Helm安装ARC (Github Action Runner Controller)

安装Helm

1
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

安装 actions-runner-system

1
2
3
4
5
helm install arc \
  --namespace actions-runner-system \
  --create-namespace \
  oci://ghcr.io/actions/actions-runner-controller-charts/gha-runner-scale-set-controller \
  --version 0.13.0

创建一个至少具有repo权限的Token

1
2
3
  kubectl create secret generic github-pat-secret \
  -n actions-runner-system \
  --from-literal=github_token=ghp_YOUR_TOKEN_HERE

创建一个配置文件

1
2
3
4
5
6
7
8
9
cat > runner-values.yaml <<'EOF'
githubConfigUrl: "https://github.com/YOUR_ORG/YOUR_REPO"
githubConfigSecret: github-pat-secret
minRunners: 1
maxRunners: 5
runnerScaleSetName: "k3s-runner-set"
containerMode:
  type: "dind"
EOF

安装 runner set (即可以根据配置自动scale的一组runner)

1
2
3
4
5
helm install arc-runner-set \
  --namespace actions-runner-system \
  -f runner-values.yaml \
  oci://ghcr.io/actions/actions-runner-controller-charts/gha-runner-scale-set \
  --version 0.13.0

这个时候回到Github repo的Settings->Actions->Runners 应该可以看到Runner Scale Set里有一个 k3s-runner-set 这就是跑在你k3s里可以自动scale的runner set。

这个时候在你的Github Action workflow yaml里指定 runs-on: k3s-runner-set 即可跑在你自己的runner上并且运行环境每一次都是干净隔离的,既不会影响宿主机也不会受前一次运行残留文件的影响。

参考连接

[Actions Runner Controller] https://docs.github.com/en/actions/concepts/runners/actions-runner-controller

使用 Hugo 构建
主题 StackJimmy 设计