You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ubuntu上实现GitHub Actions Runner的可重复安装?

问题:自动化在Ubuntu EC2实例上部署GitHub Actions Runner

我希望在EC2实例的Ubuntu系统上自动化安装GitHub Actions Runner,GitHub官方提供的手动安装步骤如下:

# 创建文件夹
mkdir actions-runner && cd actions-runner
# 下载最新的Runner包
curl -o actions-runner-linux-x64-2.303.0.tar.gz -L https://github.com/actions/runner/releases/download/v2.303.0/actions-runner-linux-x64-2.303.0.tar.gz
# 可选:验证哈希值
echo "e4a9fb7269c1a156eb5d5369232d0cd62e06bec2fd2b321600e85ac914a9cc73  actions-runner-linux-x64-2.303.0.tar.gz" | shasum -a 256 -c
# 解压安装包
tar xzf ./actions-runner-linux-x64-2.303.0.tar.gz
# 创建Runner并启动配置流程
./config.sh --url https://github.com/MyOrg/MyRepo --token [REDACTED]
# 最后一步:运行Runner
./run.sh

但每次获取的注册令牌都不相同,我需要编写类似user-data的脚本(或自动扩缩容组的启动模板),实现可重复安装,无需每次手动获取新令牌。

核心疑问:销毁EC2实例并重建后,同一令牌是否可用于注册新机器为Runner?


解决方案

核心结论

销毁重建EC2实例后,旧的注册令牌无法重复使用。GitHub提供的单次注册令牌是短期有效(通常24小时)且一次性的,只能用于注册一个Runner,无法重复利用。要实现自动化注册,需采用以下两种方案之一:

方案1:通过GitHub App动态生成注册令牌

这是最安全、可扩展的方案,适用于组织或仓库级的Runner自动化部署:

  1. 在GitHub组织/仓库创建GitHub App,授予administration:write权限(用于管理Runner资源)
  2. 生成App的私钥,将其与App ID、安装ID一起存储在AWS Secrets Manager中
  3. 在EC2的user-data脚本中,通过GitHub API动态生成临时注册令牌,流程如下:
# 从AWS Secrets Manager拉取GitHub App相关凭证(需给EC2实例绑定对应IAM权限)
APP_PRIVATE_KEY=$(aws secretsmanager get-secret-value --secret-id github-app-private-key --query SecretString --output text)
APP_ID="123456" # 替换为你的GitHub App ID
INSTALLATION_ID="789012" # 替换为你的App安装ID

# 生成JWT令牌(有效期10分钟,用于认证GitHub App)
JWT=$(echo -n "{\"iat\":$(date +%s),\"exp\":$(date -d "+10 minutes" +%s),\"iss\":$APP_ID}" | openssl dgst -sha256 -sign <(echo "$APP_PRIVATE_KEY") | base64 | tr -d '\n')

# 获取App安装访问令牌
ACCESS_TOKEN=$(curl -s -X POST \
  -H "Authorization: Bearer $JWT" \
  -H "Accept: application/vnd.github.v3+json" \
  "https://api.github.com/app/installations/$INSTALLATION_ID/access_tokens" | jq -r '.token')

# 获取仓库级注册令牌(组织级替换为https://api.github.com/orgs/MyOrg/actions/runners/registration-token)
REG_TOKEN=$(curl -s -X POST \
  -H "Authorization: token $ACCESS_TOKEN" \
  -H "Accept: application/vnd.github.v3+json" \
  "https://api.github.com/repos/MyOrg/MyRepo/actions/runners/registration-token" | jq -r '.token')

# 执行Runner安装与注册
mkdir -p actions-runner && cd actions-runner
curl -o actions-runner-linux-x64-2.303.0.tar.gz -L https://github.com/actions/runner/releases/download/v2.303.0/actions-runner-linux-x64-2.303.0.tar.gz
echo "e4a9fb7269c1a156eb5d5369232d0cd62e06bec2fd2b321600e85ac914a9cc73  actions-runner-linux-x64-2.303.0.tar.gz" | shasum -a 256 -c
tar xzf ./actions-runner-linux-x64-2.303.0.tar.gz
# 无人值守模式注册,自动设置Runner名称为实例主机名
./config.sh --url https://github.com/MyOrg/MyRepo --token $REG_TOKEN --name "EC2-Runner-$(hostname)" --work "_work" --unattended
# 配置为系统服务,开机自启
sudo ./svc.sh install
sudo ./svc.sh start

方案2:使用组织级Runner组的长期令牌(仅组织可用)

如果是GitHub组织环境,可以创建Runner组并获取长期有效的组注册令牌:

  1. 进入GitHub组织的Settings > Actions > Runners > Runner groups
  2. 创建新的Runner组,点击Register a runner获取组注册令牌
  3. 将令牌存储在AWS Secrets Manager,在user-data脚本中拉取后直接用于注册

这种方案的优势是实现简单,但需注意:组令牌为长期有效,一旦泄露可能导致恶意Runner注册,需严格管控令牌权限与存储安全。

注意事项

  • 确保EC2实例绑定了足够的IAM权限:允许访问AWS Secrets Manager,以及出站访问GitHub API
  • 注册时必须添加--unattended参数,避免交互流程中断自动化
  • 将Runner配置为系统服务,确保实例重启后自动恢复运行

内容的提问来源于stack exchange,提问作者pkaramol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 20:03:26