system onlinepath: /guias/devops-cloud/configurar-un-runner-propio-para-github-actions/mode: knowledge_baselocal:
DevOps y cloud · Nivel intermedio

Cómo configurar un runner propio para GitHub Actions

GitHub Actions ejecuta tus workflows en máquinas que GitHub proporciona, pero a veces necesitás las tuyas: hardware específico, acceso a redes privadas o control total del entorno. Un self-hosted runner es tu propia máquina ejecutando los jobs, con reglas de seguridad que no se pueden ignorar.

16 min de lectura▣ Actualizada el ◇ Por Underc0de
Respuesta rápida

En GitHub Actions, un runner es la máquina que ejecuta los jobs de tus workflows. Por defecto se usan los runners alojados por GitHub: máquinas limpias que GitHub crea para cada ejecución y destruye al terminar, sin que administres nada. Un self-hosted runner (runner propio) es, en cambio, tu propia máquina —un servidor, una VM, un contenedor— que conectás a GitHub para que ejecute los jobs allí. ¿Cuándo conviene uno propio? Cuando necesitás algo que los alojados no dan: hardware específico (GPU, mucha memoria, una arquitectura concreta), acceso a una red privada (desplegar a servidores internos que no son públicos), un entorno preparado (con dependencias pesadas ya instaladas, para no reinstalarlas en cada ejecución) o control de costes a gran volumen. Instalarlo es sencillo: en la configuración del repositorio u organización, GitHub da un script que descarga el software del runner, lo registra con un token y lo deja escuchando trabajos; se suele configurar como servicio para que arranque solo. La parte que no se puede ignorar es la seguridad, sobre todo en repositorios públicos: un runner propio ejecuta el código que llega en los workflows, y en un repo público cualquiera puede abrir un pull request con código malicioso que se ejecutaría en tu máquina, con acceso a tu red. Por eso GitHub desaconseja runners propios en repos públicos, y si se usan, deben estar aislados (efímeros, sin secretos sensibles, sin acceso a lo que no necesitan). En repos privados el riesgo es menor, pero el principio se mantiene: un runner es una puerta a tu infraestructura.

Ver índice de contenidos
  1. 01Runner alojado vs. propio
  2. 02Cuándo conviene uno propio
  3. 03Instalar y asegurar
  4. 04Errores frecuentes
  5. 05Preguntas frecuentes
  6. 06Fuentes

Runner alojado vs. propio

Esta guía asume que conocés GitHub Actions (workflows, jobs, steps). El runner es la pieza que ejecuta cada job. La diferencia entre los dos tipos es de quién es la máquina y quién la administra:

Runner alojado (GitHub)Self-hosted (propio)
La máquinaLa pone y destruye GitHubEs tuya; la mantenés vos
EntornoLimpio en cada ejecuciónPersistente, salvo que lo hagas efímero
MantenimientoCero: GitHub lo actualizaTuyo: sistema, software del runner, seguridad
Acceso a red privadaNoSí, si la máquina está en ella
CosteMinutos incluidos y luego por usoEl de tu máquina

Lo cómodo por defecto: los alojados

Para la gran mayoría de proyectos, los runners alojados son la opción correcta: no administrás nada, cada ejecución parte de una máquina limpia (lo que evita que una ejecución contamine a la siguiente) y GitHub se ocupa de parches y actualizaciones. El runner propio no es «mejor»: es una respuesta a necesidades concretas que los alojados no cubren. Si no tenés una de esas necesidades, montar un runner propio solo te añade una máquina que mantener y un riesgo de seguridad que gestionar.

Cuándo conviene uno propio

La diferencia entre un runner alojado por GitHub y un runner propio autoalojado en GitHub Actions, y cuándo conviene cada uno. A la izquierda se muestra el runner alojado por GitHub: cuando se ejecuta un workflow, GitHub crea automáticamente una máquina limpia y temporal para ejecutar el trabajo, y la destruye al terminar, de modo que cada ejecución parte de un entorno nuevo y sin rastros de la anterior, y el usuario no administra nada, ya que GitHub se encarga del mantenimiento, los parches y las actualizaciones. Se indica que es la opción por defecto y la adecuada para la mayoría de los proyectos. A la derecha se muestra el runner propio autoalojado: es una máquina del propio usuario, ya sea un servidor físico, una máquina virtual o un contenedor, que se conecta a GitHub y queda a la escucha de trabajos para ejecutarlos allí; el usuario es responsable de mantener esa máquina, su sistema, el software del runner y su seguridad. En el centro o abajo se muestran los motivos por los que conviene un runner propio, es decir, necesidades que los runners alojados no cubren: necesitar hardware específico como aceleradores gráficos, mucha memoria o una arquitectura concreta; necesitar acceso a una red privada para poder desplegar a servidores internos que no son accesibles desde internet; disponer de un entorno preparado con dependencias pesadas ya instaladas para no tener que reinstalarlas en cada ejecución; y controlar los costes cuando el volumen de ejecuciones es muy alto. Se destaca de forma prominente el aspecto de seguridad, especialmente en los repositorios públicos: como un runner ejecuta el código que llega en los workflows, en un repositorio público cualquier persona podría enviar una propuesta de cambio con código malicioso que se ejecutaría en la máquina propia, con el acceso que esta tenga a la red interna, por lo que se advierte que GitHub desaconseja usar runners propios en repositorios públicos, y que si se usan deben estar aislados, ser efímeros, no contener secretos sensibles y tener el acceso mínimo. El diagrama resalta la idea de que el runner alojado es cómodo y seguro por defecto, mientras que el runner propio responde a necesidades concretas a cambio de asumir su mantenimiento y su seguridad, y que un runner es en el fondo una puerta a la propia infraestructura que hay que proteger. Estilo oscuro de DevOps, con el runner alojado y el propio comparados lado a lado, los motivos de uso etiquetados y una advertencia de seguridad destacada.
El runner alojado lo crea y destruye GitHub, limpio en cada ejecución y sin mantenimiento. El runner propio es tu máquina, que mantenés vos, y conviene solo ante necesidades concretas: hardware específico, red privada, entorno preparado o volumen. Su contrapartida es la seguridad.

Un runner propio se justifica por necesidades que los alojados no cubren, no por costumbre. Las cuatro razones habituales:

NecesidadPor qué el alojado no sirve
Hardware específicoGPU, mucha RAM o una arquitectura que los alojados no ofrecen
Acceso a red privadaDesplegar a servidores internos no accesibles desde internet
Entorno preparadoDependencias pesadas ya instaladas, para no reinstalarlas cada vez
Coste a gran volumenMuchísimas ejecuciones donde tu propio hardware sale a cuenta

Instalar y asegurar

Instalar un runner propio es directo; asegurarlo es donde está el trabajo de verdad. El registro se hace desde la configuración del repositorio u organización:

  1. Preparar la máquina. Un servidor, VM o contenedor con el sistema y las dependencias que necesiten tus jobs.
  2. Obtener el comando de registro. En Settings → Actions → Runners → New runner, GitHub da un script con un token.
  3. Descargar y registrar. El script descarga el software del runner y lo conecta a tu repositorio u organización.
  4. Configurarlo como servicio. Para que arranque solo y quede escuchando trabajos de forma permanente.
  5. Usarlo en el workflow. Con runs-on: self-hosted (o una etiqueta propia) en lugar de un runner alojado.
!
En repositorios públicos, un runner propio es un riesgo grave

Este es el punto que más cuesta y más importa. Un runner ejecuta el código que llega en los workflows. En un repositorio público, cualquier persona puede abrir un pull request, y ese PR puede modificar el workflow o traer código que se ejecutaría en tu máquina, con el acceso que esta tenga a tu red interna. Es decir: un desconocido podría ejecutar comandos en tu servidor. Por eso GitHub desaconseja explícitamente los runners propios en repos públicos. Si aun así los usás, deben estar aislados: efímeros (destruidos tras cada job, para que nada persista), sin acceso a secretos sensibles ni a redes internas, y con el mínimo privilegio posible. En repos privados el riesgo es menor porque solo colaboradores de confianza pueden lanzar workflows, pero el runner sigue siendo una puerta a tu infraestructura que hay que endurecer. Esto conecta directamente con la seguridad de la cadena de suministro.

Errores frecuentes

  • Usar un runner propio en un repo público sin aislarlo. Un PR malicioso puede ejecutar código en tu máquina; GitHub lo desaconseja.
  • Montar un runner propio sin necesidad real. Si los alojados sirven, solo sumás mantenimiento y riesgo.
  • Runner persistente que acumula estado. Una ejecución contamina la siguiente; preferir runners efímeros.
  • Dar al runner acceso a toda la red interna. Mínimo privilegio: solo lo que sus jobs necesitan.
  • Guardar secretos sensibles en la máquina del runner. Si se compromete, se filtran; usar el gestor de secretos y limitar su alcance.
  • No actualizar el software del runner ni el sistema. El mantenimiento es tuyo; un runner desactualizado es vulnerable.
  • Exponer el runner o su token. El token de registro y el acceso al runner deben tratarse como credenciales.

Preguntas frecuentes

¿Qué es un self-hosted runner en GitHub Actions?

Un self-hosted runner, o runner autoalojado, en GitHub Actions es una máquina propia del usuario que se conecta a GitHub para ejecutar en ella los trabajos de los flujos de trabajo, en contraposición a los runners alojados que proporciona la propia plataforma. Para entenderlo conviene recordar que en GitHub Actions un runner es simplemente la máquina donde se ejecutan los trabajos definidos en un flujo de trabajo, como compilar el código, ejecutar las pruebas o desplegar la aplicación. Por defecto, esos trabajos se ejecutan en runners alojados por GitHub, que son máquinas que la plataforma crea de forma automática y limpia para cada ejecución y destruye al terminar, sin que el usuario tenga que administrar nada, ocupándose GitHub del mantenimiento, los parches y las actualizaciones. Un self-hosted runner, en cambio, es una máquina que aporta y controla el propio usuario, ya sea un servidor físico, una máquina virtual o un contenedor, en la que se instala el software del runner y que se registra en GitHub para que quede a la escucha de trabajos y los ejecute cuando llegan. La diferencia fundamental es, por tanto, de quién es la máquina y quién la administra: en el caso alojado es de GitHub y no requiere gestión, mientras que en el caso autoalojado es del usuario, que asume la responsabilidad de mantener el sistema operativo, el software del runner y, muy especialmente, su seguridad. Además, a diferencia del runner alojado, que parte limpio en cada ejecución, el runner propio es persistente por defecto, conservando su estado entre ejecuciones salvo que se configure expresamente para ser efímero. El self-hosted runner permite cosas que el alojado no ofrece, como usar hardware específico, acceder a redes privadas o disponer de un entorno preconfigurado, pero a cambio de asumir su mantenimiento y de gestionar cuidadosamente su seguridad, ya que se convierte en una máquina propia que ejecuta el código que llega en los flujos de trabajo. Por ello, no es una opción mejor ni peor en abstracto, sino una respuesta a necesidades concretas que los runners alojados no cubren.

¿Cuándo conviene usar un runner propio en lugar de los de GitHub?

Conviene usar un runner propio autoalojado en lugar de los runners alojados por GitHub cuando existe una necesidad concreta que los runners alojados no pueden satisfacer, y no simplemente por costumbre o por la sensación de tener más control, ya que para la mayoría de los proyectos los runners alojados son la opción más cómoda y recomendable. Hay cuatro grandes situaciones que justifican un runner propio. La primera es la necesidad de hardware específico que los runners alojados no ofrecen, como unidades de procesamiento gráfico para tareas de aprendizaje automático o de cálculo intensivo, cantidades muy grandes de memoria, o una arquitectura de procesador concreta que se requiere para compilar o probar el software. La segunda es la necesidad de acceder a una red privada, por ejemplo cuando el flujo de trabajo debe desplegar a servidores internos de la organización que no son accesibles desde internet, algo que un runner alojado, al estar fuera de esa red, no puede hacer, mientras que un runner propio ubicado dentro de la red interna sí. La tercera es disponer de un entorno preparado con dependencias pesadas ya instaladas, de modo que no haya que reinstalarlas o reconstruirlas en cada ejecución, lo que puede ahorrar mucho tiempo cuando el entorno de compilación o de pruebas es grande y costoso de montar desde cero. La cuarta es el control de costes cuando el volumen de ejecuciones es muy elevado, situación en la que utilizar hardware propio puede resultar más económico que pagar por un consumo masivo de minutos en runners alojados. Fuera de estos casos, montar un runner propio no aporta ventajas y sí inconvenientes, porque añade una máquina que hay que mantener, actualizar y proteger, e introduce riesgos de seguridad que los runners alojados evitan al ser limpios y desechables. Por ello, la recomendación es utilizar por defecto los runners alojados y recurrir a los propios únicamente cuando se dé alguna de esas necesidades específicas, valorando en ese caso si compensan el coste de mantenimiento y las precauciones de seguridad que exigen.

¿Cómo se instala y registra un runner propio?

Instalar y registrar un runner propio en GitHub Actions es un proceso relativamente sencillo que se realiza desde la configuración del repositorio o de la organización y que la propia plataforma guía paso a paso. El primer paso consiste en preparar la máquina que hará de runner, que puede ser un servidor físico, una máquina virtual o un contenedor, asegurándose de que tenga el sistema operativo y las dependencias que los trabajos vayan a necesitar, como las herramientas de compilación o los entornos de ejecución correspondientes. El segundo paso es obtener el comando de registro desde la configuración, navegando en el apartado de acciones a la sección de runners y eligiendo añadir un nuevo runner; allí GitHub muestra un conjunto de instrucciones específicas para el sistema operativo elegido, que incluyen un token de registro temporal. El tercer paso es ejecutar en la máquina esas instrucciones, que descargan el software del runner, lo configuran y lo registran contra el repositorio o la organización usando el token proporcionado, estableciendo así la conexión entre la máquina y GitHub. El cuarto paso, muy recomendable, es configurar el runner para que se ejecute como un servicio del sistema, de manera que arranque automáticamente y quede permanentemente a la escucha de trabajos sin necesidad de intervención manual, en lugar de tener que lanzarlo a mano cada vez. Una vez registrado y en marcha, el runner aparece disponible en la configuración y queda listo para recibir trabajos. El último paso es indicar en los flujos de trabajo que ciertos trabajos deben ejecutarse en el runner propio, lo cual se hace especificando en la definición del trabajo que se ejecute en un runner autoalojado, ya sea mediante la etiqueta general correspondiente o mediante etiquetas personalizadas que se pueden asignar al runner para dirigir hacia él trabajos concretos, algo útil cuando se tienen varios runners con características distintas. Aunque el proceso de instalación en sí es directo, conviene recordar que la parte verdaderamente importante y que requiere más atención no es la instalación, sino la seguridad del runner, especialmente si el repositorio es público, por lo que antes de poner un runner propio en producción hay que planificar cómo se va a aislar y proteger.

¿Por qué es peligroso un runner propio en un repositorio público?

Un runner propio en un repositorio público es peligroso porque un runner ejecuta el código que llega en los flujos de trabajo, y en un repositorio público cualquier persona del mundo puede proponer cambios que podrían llegar a ejecutarse en la máquina propia, con el acceso que esta tenga a la red interna. Para entender el riesgo hay que recordar cómo funciona la colaboración en los repositorios públicos: cualquiera puede crear una propuesta de cambio, conocida como pull request, para contribuir al proyecto, y esa propuesta puede incluir modificaciones en el código e incluso en los propios flujos de trabajo. Si los flujos de trabajo se ejecutan en un runner autoalojado, una propuesta de cambio malintencionada podría contener código diseñado para hacer daño, que se ejecutaría directamente en la máquina del runner, es decir, en un servidor propio del usuario u organización. Esto significa que un atacante desconocido podría llegar a ejecutar comandos arbitrarios en esa máquina, robar información, moverse hacia otros sistemas accesibles desde la red interna en la que se encuentre el runner, o comprometer secretos y credenciales presentes en el entorno. El agravante es que, a diferencia de los runners alojados por GitHub, que son limpios y desechables y quedan aislados, un runner propio suele tener acceso a recursos internos y persistir su estado, lo que amplifica el daño potencial. Por todas estas razones, GitHub desaconseja explícitamente el uso de runners autoalojados en repositorios públicos. Si aun así resulta imprescindible usarlos en ese contexto, deben adoptarse medidas estrictas de aislamiento y mínima exposición: hacer los runners efímeros, de modo que se destruyan tras cada trabajo y no persista nada entre ejecuciones; evitar que tengan acceso a secretos sensibles o a redes internas críticas; concederles el mínimo privilegio posible; y considerar mecanismos que exijan aprobación antes de ejecutar flujos de trabajo procedentes de contribuciones externas. En repositorios privados el riesgo es sustancialmente menor, porque solo colaboradores de confianza pueden lanzar los flujos de trabajo, pero aun así el runner sigue siendo una puerta de entrada a la infraestructura que conviene endurecer con buenas prácticas de seguridad.

¿Qué es un runner efímero y por qué usarlo?

Un runner efímero es un runner autoalojado configurado para ejecutar un único trabajo y destruirse o restablecerse por completo después, de modo que no persiste estado alguno entre ejecuciones, a diferencia de un runner persistente, que permanece activo y conserva lo que quede en su sistema de una ejecución a la siguiente. La motivación para usar runners efímeros es fundamentalmente de seguridad y de fiabilidad, y responde a dos problemas de los runners persistentes. El primer problema es la contaminación entre ejecuciones: en un runner persistente, los archivos, procesos, cachés o cambios que deja un trabajo pueden afectar a los trabajos siguientes, provocando comportamientos inconsistentes, resultados que dependen del historial de la máquina o fallos difíciles de reproducir; un runner efímero, al partir siempre de un estado limpio, garantiza que cada trabajo se ejecute en un entorno predecible y sin residuos del anterior, igual que hacen los runners alojados por GitHub. El segundo problema, y más grave, es de seguridad: si un trabajo malicioso o comprometido logra ejecutarse en un runner persistente, puede dejar en la máquina puertas traseras, credenciales robadas, procesos ocultos o modificaciones que persistan y afecten a ejecuciones posteriores o comprometan de forma duradera el sistema; con un runner efímero, como la máquina se destruye y se recrea limpia tras cada trabajo, el margen de un atacante para persistir se reduce drásticamente, ya que cualquier daño desaparece al reiniciarse el entorno. Por estas razones, los runners efímeros son la práctica recomendada cuando se usan runners autoalojados, y resultan especialmente importantes en contextos de mayor riesgo, como los repositorios públicos, donde son una de las medidas clave de aislamiento. Habitualmente se implementan apoyándose en contenedores o en máquinas virtuales que se levantan para un trabajo y se eliminan al finalizar, a menudo mediante mecanismos de escalado automático que crean y destruyen runners según la demanda. En resumen, un runner efímero aporta limpieza y seguridad al asegurar que cada trabajo se ejecuta en un entorno nuevo y desechable, evitando tanto la contaminación entre ejecuciones como la persistencia de posibles compromisos.

¿Un runner propio reemplaza a los pipelines de GitHub Actions?

No, un runner propio no reemplaza ni cambia los pipelines de GitHub Actions, sino que es simplemente una alternativa sobre dónde se ejecutan los trabajos de esos pipelines, conviviendo con todo lo demás sin alterarlo. Conviene distinguir claramente dos conceptos. Por un lado están los flujos de trabajo o pipelines de GitHub Actions, que son las definiciones de lo que hay que hacer, escritas en archivos de configuración dentro del repositorio, y que describen los trabajos y los pasos que los componen, como obtener el código, instalar dependencias, ejecutar pruebas, construir artefactos o desplegar; esa lógica es exactamente la misma independientemente de dónde se ejecute. Por otro lado está el runner, que es únicamente la máquina que ejecuta esos trabajos definidos en el pipeline. Elegir un runner propio en lugar de uno alojado por GitHub solo cambia el lugar y la máquina donde corre el trabajo, indicándolo en la definición del trabajo mediante la opción correspondiente, pero no modifica en absoluto cómo se escriben los flujos de trabajo, ni los pasos, ni la sintaxis, ni el funcionamiento general de GitHub Actions. De hecho, es perfectamente posible y habitual combinar ambos tipos de runner dentro de un mismo proyecto o incluso de un mismo flujo de trabajo, ejecutando por ejemplo la mayoría de los trabajos en runners alojados y reservando para un runner propio únicamente aquellos que necesitan hardware específico, acceso a una red privada o un entorno especial. Por tanto, aprender a usar un runner propio no sustituye el conocimiento de GitHub Actions ni de sus pipelines, sino que lo complementa, añadiendo la capacidad de dirigir determinados trabajos hacia máquinas propias cuando hay una necesidad concreta que lo justifique. La base sigue siendo entender bien los flujos de trabajo, los trabajos y los pasos de GitHub Actions, y el runner propio es una pieza adicional que se integra en ese marco para cubrir casos particulares, siempre teniendo presente que su uso exige asumir el mantenimiento de la máquina y unas precauciones de seguridad que los runners alojados no requieren.

Fuentes

Documentación oficial y material de la comunidad consultados para esta guía. Fecha de consulta: 28 de julio de 2026.

Aportes de la comunidad Underc0de

  1. Underc0de, foro. Sección GNU/Linux. Automatización y CI/CD.
  2. Underc0de, foro. Sección Programación. Integración continua.

Documentación oficial

  1. GitHub. About self-hosted runners. Documentación oficial.
  2. GitHub. Adding self-hosted runners. Instalación y registro.
  3. GitHub. Security hardening for GitHub Actions. Endurecimiento de seguridad.
  4. GitHub. About GitHub-hosted runners. Los runners alojados por GitHub.