如何在GitLab CI脚本中重启机器后恢复runner连接继续执行任务
GitLab CI 绑定特定Shell Runner重启后继续执行脚本的实现方案
核心逻辑
Shell执行器的CI任务进程会随机器重启被中断,因此无法将重启前后的逻辑放在同一个任务中。我们通过拆分流水线阶段、配置Runner开机自启、增加任务重试机制的方式,实现重启后自动衔接后续操作。
前置配置
首先确保你的绑定机器的Shell Runner已配置开机自启,机器重启后Runner服务会自动拉起并连接GitLab:
- 如果还未安装Runner服务,执行命令:
gitlab-runner install --user <运行Runner的Windows用户> --password <对应用户密码> --startup auto - 如果已安装Runner,执行命令设置服务自动启动:
Set-Service -Name gitlab-runner -StartupType Automatic - 确认Runner运行用户拥有重启机器的权限,可在本地安全策略的「用户权限分配」中给用户添加「关闭系统」权限。
流水线配置示例
将流水线拆分为重启前任务和重启后任务两个阶段,两个任务绑定同一个Runner标签确保运行在目标机器上:
stages: - pre_restart - post_restart # 重启前执行的任务 job_before_restart: stage: pre_restart tags: - your-specific-runner-tag # 替换为你绑定目标机器的Runner专属标签 script: # 此处填写所有重启前需要执行的业务逻辑 - Write-Host "开始执行重启前操作..." # 后台触发重启,避免当前CI进程被中断导致任务报错失败 - Start-Job -ScriptBlock { Restart-Computer -Force } # 预留5秒等待重启指令触发,随后正常退出任务返回成功状态 - Start-Sleep 5 - exit 0 # 重启后执行的任务 job_after_restart: stage: post_restart tags: - your-specific-runner-tag # 和上方使用同一个Runner标签 needs: ["job_before_restart"] # 配置重试机制,机器未完全启动、Runner未连接时自动重试 retry: max: 5 # 可根据机器启动速度调整重试次数 when: runner_system_failure script: - Write-Host "机器重启完成,开始执行后续操作..." # 此处填写所有重启后需要执行的业务逻辑
补充说明
如果需要在重启前后传递参数,可以将参数写入目标机器的本地临时文件,重启后读取即可:
- 重启前写入参数:
"key1=value1nkey2=value2" | Out-File -FilePath C:\ci_temp\restart_params.txt -Encoding utf8` - 重启后读取参数:
$params = Get-Content -Path C:\ci_temp\restart_params.txt
内容的提问来源于stack exchange,提问作者emi
相关产品推荐
相关产品推荐

