如何自动更新本地GitHub Action Runner?解决更新后CI/CD停摆无通知问题
自动更新本地GitHub Action Runner的解决方案(适配Beta版本)
我之前也碰到过Beta版本地Runner更新后CI/CD突然中断还没通知的问题,折腾出几个实用的方案,分享给你:
一、自动更新脚本(核心)
写一个bash脚本自动检测版本并更新,同时保留注册配置避免重新注册:
#!/bin/bash # 切换到Runner安装目录(根据你的实际路径修改) cd /opt/github-runner # 获取当前Runner版本 CURRENT_VERSION=$(./runner --version | grep -oP 'Version: \K.*') # 从GitHub API拉取最新版本号 LATEST_VERSION=$(curl -s https://api.github.com/repos/actions/runner/releases/latest | grep -oP '"tag_name": "\K.*' | sed 's/v//') # 版本对比,仅当有更新时执行操作 if [ "$CURRENT_VERSION" != "$LATEST_VERSION" ]; then echo "[$(date)] 发现新版本 $LATEST_VERSION,当前版本 $CURRENT_VERSION,开始更新..." >> runner-update.log # 检查是否有正在运行的作业,避免中途打断CI RUNNING_JOBS=$(./runner list | grep -c "Running") if [ "$RUNNING_JOBS" -gt 0 ]; then echo "[$(date)] 发现有 $RUNNING_JOBS 个作业正在运行,跳过本次更新" >> runner-update.log exit 0 fi # 停止Runner服务 ./svc.sh stop >> runner-update.log 2>&1 if [ $? -ne 0 ]; then echo "[$(date)] 停止Runner服务失败,更新终止" >> runner-update.log # 发送失败通知(示例用邮件) echo "GitHub Runner更新失败:停止服务出错" | mail -s "Runner更新告警" your-email@example.com exit 1 fi # 下载最新版本包 curl -LO "https://github.com/actions/runner/releases/download/v$LATEST_VERSION/actions-runner-linux-x64-$LATEST_VERSION.tar.gz" >> runner-update.log 2>&1 if [ $? -ne 0 ]; then echo "[$(date)] 下载新版本失败,恢复服务" >> runner-update.log ./svc.sh start >> runner-update.log 2>&1 echo "GitHub Runner更新失败:下载新版本出错" | mail -s "Runner更新告警" your-email@example.com exit 1 fi # 解压并替换文件(保留config.sh配置) mkdir -p runner-temp tar xzf actions-runner-linux-x64-$LATEST_VERSION.tar.gz -C runner-temp >> runner-update.log 2>&1 cp -r runner-temp/* . >> runner-update.log 2>&1 # 清理临时文件 rm -rf runner-temp actions-runner-linux-x64-$LATEST_VERSION.tar.gz # 重启Runner服务 ./svc.sh start >> runner-update.log 2>&1 if [ $? -eq 0 ]; then echo "[$(date)] 更新完成,当前版本: $LATEST_VERSION" >> runner-update.log echo "GitHub Runner已成功更新到版本 $LATEST_VERSION" | mail -s "Runner更新成功" your-email@example.com else echo "[$(date)] 重启服务失败,请手动检查" >> runner-update.log echo "GitHub Runner更新后重启服务失败,请立即处理" | mail -s "Runner紧急告警" your-email@example.com fi else echo "[$(date)] 当前已是最新版本: $CURRENT_VERSION" >> runner-update.log fi
定时执行脚本
用cron设置每天凌晨自动检查更新(避免高峰时段):
- 编辑crontab:
crontab -e - 添加一行:
0 2 * * * /bin/bash /opt/github-runner/update-runner.sh
二、避免CI/CD中断的额外技巧
- 多Runner集群部署:如果有多个本地Runner,更新时逐个操作,保证至少有一个Runner在线承接作业
- 备份配置文件:更新前自动备份
config.sh和.runner文件,万一更新失败可以快速回滚:# 在脚本停止服务前添加备份命令 cp config.sh config.sh.backup-$(date +%Y%m%d%H%M) cp .runner .runner.backup-$(date +%Y%m%d%H%M) - 服务状态监控:如果用systemd管理Runner服务,配置自动重启策略:
在github-runner.service文件中添加:Restart=always RestartSec=5
三、实时通知优化
除了邮件,还可以集成Slack、企业微信等工具发送通知,比如把邮件命令替换成Slack webhook调用:
curl -X POST -H 'Content-type: application/json' --data '{"text":"GitHub Runner已更新到版本 '"$LATEST_VERSION"'"}' https://hooks.slack.com/services/XXX/XXX/XXX
内容的提问来源于stack exchange,提问作者profy
相关产品推荐
相关产品推荐

