如何在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自动化部署:
- 在GitHub组织/仓库创建GitHub App,授予
administration:write权限(用于管理Runner资源) - 生成App的私钥,将其与App ID、安装ID一起存储在AWS Secrets Manager中
- 在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组并获取长期有效的组注册令牌:
- 进入GitHub组织的
Settings > Actions > Runners > Runner groups - 创建新的Runner组,点击
Register a runner获取组注册令牌 - 将令牌存储在AWS Secrets Manager,在user-data脚本中拉取后直接用于注册
这种方案的优势是实现简单,但需注意:组令牌为长期有效,一旦泄露可能导致恶意Runner注册,需严格管控令牌权限与存储安全。
注意事项
- 确保EC2实例绑定了足够的IAM权限:允许访问AWS Secrets Manager,以及出站访问GitHub API
- 注册时必须添加
--unattended参数,避免交互流程中断自动化 - 将Runner配置为系统服务,确保实例重启后自动恢复运行
内容的提问来源于stack exchange,提问作者pkaramol
相关产品推荐
相关产品推荐

