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

如何自动更新本地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设置每天凌晨自动检查更新(避免高峰时段):

  1. 编辑crontab:crontab -e
  2. 添加一行:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:14:30