De $32 a $0.90 al mes: un pool de CI que solo existe cuando hace falta
说明与用途
自托管 CI 运行器池在空闲时休眠,将月度成本从 $32.34 降至 $0.90,保持 2.7 % 的运行时间。
问题
Mantener un pool de runners autoalojados en GitHub Actions costoso y siempre encendido resulta en gastos innecesarios cuando el flujo de trabajo está inactivo.
结果
El pool de runners autoalojados pasó de estar activo 97.5 % del tiempo y costar $32.34 / mes a dormir la mayor parte del tiempo, con un costo de ~$0.90 / mes y un tiempo activo del 2.7 %. Los tiempos de arranque aumentaron a 1 m 44 s–3 m 56 s, pero el ahorro de costos fue significativo.
工作流
- 1. Configurar ASG con minCapacity = 0, maxCapacity = 2, capacityRebalance = true y deleteOnTermination = true en el volumen EBS.
- 2. Crear workflow "runner-pool.yml" que se dispara en pull_request, push a main, workflow_dispatch y cron, con concurrency group "runner-pool".
- 3. En el job "wake" establecer DesiredCapacity = 1 para arrancar el pool.
- 4. En el job "sleep" verificar que no haya runners ocupados ni ejecuciones activas; si no, establecer DesiredCapacity = 0 para apagar el pool.
- 5. Configurar los demás workflows (ci.yml, deploy-backend.yml, deploy-frontend.yml, deploy-intelligence.yml, security-scan.yml) para usar runners self‑hosted sin preocuparse por el estado del pool.
- 6. Añadir workflow "rerun-on-runner-loss.yml" que re‑ejecuta jobs fallidos por pérdida de runner, con máximo 3 intentos.
- 7. Utilizar GitHub Actions concurrency y workflow_run triggers para sincronizar el pool con los demás workflows.
- 8. Monitorear métricas de ASG y ajustar según sea necesario.
- 9. Validar que los costos y tiempos de ejecución se mantengan dentro de los objetivos.
- 10. Documentar la configuración y los pasos para futuros mantenedores.
证据
El pool siempre encendido: 24/7; Pool scale-to-zero: 2.7 % (2h12m de 81h)
El cambio de CDK son dos líneas y una eliminación: ... minCapacity: 0, maxCapacity: 2, capacityRebalance: true, desiredCapacity deliberadamente NO declarado.
El volumen de EBS es deleteOnTermination.
- 记录日期: 2026-10-10T23:11:11.526Z