{"id":19908,"date":"2026-09-14T18:32:36","date_gmt":"2026-09-14T18:32:36","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/github-actions-templates-2\/"},"modified":"2026-09-14T18:32:36","modified_gmt":"2026-09-14T18:32:36","slug":"github-actions-templates","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/github-actions-templates\/","title":{"rendered":"Plantillas privadas de GitHub Actions para tu organizaci\u00f3n"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">GitHub Actions es la novedad en el mundo del CI\/CD, pero est\u00e1 superando r\u00e1pidamente a los servidores de automatizaci\u00f3n tradicionales de c\u00f3digo abierto. Desde hace un tiempo, el equipo de desarrollo de Sinch Mailgun sabe que algunas de las herramientas y tecnolog\u00edas con las que configuramos esto tienen una comunidad cada vez m\u00e1s peque\u00f1a y corren el riesgo de volverse demasiado espec\u00edficas para poder mantenerlas. Por estos motivos, nos encontramos inmersos en una migraci\u00f3n de nuestro CI\/CD basado en Jenkins al CI\/CD de GitHub Actions. Para que quede claro: a veces no est\u00e1 todo incluido, a menos que tengas el plan GitHub Enterprise como cliente&#8230;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Digo esto porque, hasta hace muy poco, las plantillas de flujo de trabajo en los repositorios privados no eran compatibles, por lo que tuvimos que buscar una alternativa. Por suerte, <a href=\"https:\/\/github.blog\/changelog\/2022-03-04-sharing-github-actions-within-your-enterprise-is-now-ga\/\" target=\"_tabs\" rel=\"noopener noreferrer\">GitHub ha publicado hace poco una actualizaci\u00f3n<\/a> que ya incluye asistencia para esta funci\u00f3n en sus planes Enterprise. Sin embargo, <b>para quienes utilizan los planes Free o Team de GitHub, el problema persiste. <\/b>No sabemos si GitHub lanzar\u00e1 esta actualizaci\u00f3n para otros planes ni cu\u00e1ndo lo har\u00e1, as\u00ed que, de momento, aqu\u00ed te contamos nuestra experiencia y c\u00f3mo lo solucionamos.<\/p>\n\n\n\r\n    <nav data-content-type=\"longform\" class=\"toc-block longform-spacings px-5 py-6 px-md-6 px-lg-7 py-md-7 bg-light fs-sm rounded-lg\" aria-labelledby=\"toc-title-6299\"><p class=\"h5 m-0\" id=\"toc-title-6299\">\u00cdndice<\/p><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">01<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#el-reto-de-reutilizar-los-flujos-de-trabajo\">El reto de reutilizar los flujos de trabajo<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">02<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#sincronizacion-de-plantillas-de-flujo-de-trabajo\">Sincronizaci\u00f3n de plantillas de flujo de trabajo\u00a0<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">03<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#plantillas-de-github-actions-una-alternativa-aceptable-para-los-planes-que-no-son-enterprise\">Plantillas de GitHub Actions: una alternativa aceptable para los planes que no son Enterprise<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">04<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#simplifica-la-configuracion-mediante-un-gestor-de-paquetes-basado-en-git\">Simplifica la configuraci\u00f3n mediante un gestor de paquetes basado en Git<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">05<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#pros-y-contras-de-github-actions\">Pros y contras de GitHub Actions<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">06<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#pasos-siguientes\">Pasos siguientes<\/a><\/div><\/div><\/nav>\n\n\n<h2 class=\"wp-block-heading\">El reto de reutilizar los flujos de trabajo<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Mi experiencia previa con GitLab CI me acort\u00f3 la curva de aprendizaje con GitHub Actions, pero al final los peque\u00f1os detalles resultaron ser diferentes. Por ejemplo, incluir una serie de pasos de un proyecto en otro es muy distinto. Tanto GitHub Actions como GitLab CI permiten reutilizar pasos de un repositorio en otro, pero <b>los planes Free y Team de GitHub Actions exigen que los pasos que quieras incluir sean de acceso p\u00fablico<\/b>. En GitLab CI, se puede usar la autenticaci\u00f3n para importar tareas, etapas, variables, etc. de un repositorio privado utilizando la directiva  <a href=\"https:\/\/docs.gitlab.com\/ee\/ci\/yaml\/index.html#include\" target=\"_tabs\" rel=\"noopener noreferrer\">includes<\/a> .<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En el momento de redactar este art\u00edculo, GitHub Actions ten\u00eda  <a href=\"https:\/\/stackoverflow.com\/questions\/4659549\/maintain-git-repo-inside-another-git-repo\/4660048#4660048\" target=\"_tabs\" rel=\"noopener noreferrer\">incidencias<\/a> (<a href=\"https:\/\/github.com\/github\/roadmap\/issues\/74\" target=\"_tabs\" rel=\"noopener noreferrer\">bueno, dos<\/a>) para hacer el seguimiento de esta esperada funci\u00f3n en los repositorios privados. Estas incidencias llevaban abiertas casi 18 meses y hace poco que se ha incorporado la soluci\u00f3n para los planes Enterprise. No tengo claro cu\u00e1ndo (o si) esta funci\u00f3n estar\u00e1 disponible para todo el mundo, pero me parece que es una parte fundamental para habilitar la reutilizaci\u00f3n privada de flujos de trabajo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Sincronizaci\u00f3n de plantillas de flujo de trabajo\u00a0<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Le\u00ed un sinf\u00edn de publicaciones de Stack Overflow e indagu\u00e9 en los hilos de comentarios de GitHub Issues, pero no encontr\u00e9 ninguna buena alternativa a la imposibilidad de incluir flujos de trabajo de otros repositorios privados de la misma organizaci\u00f3n.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pens\u00e9 que los subm\u00f3dulos de git podr\u00edan ser una posible soluci\u00f3n. Al fin y al cabo, permiten que un repositorio incluya a otro. \u00bfPodr\u00edamos incluir nuestras plantillas de flujo de trabajo como subm\u00f3dulo en nuestro repositorio y utilizar la gesti\u00f3n de subm\u00f3dulos de git para mantener las plantillas actualizadas? S\u00ed, podr\u00edamos, pero no si quer\u00edamos tener plantillas que no fueran relevantes para ciertos repositorios en el repositorio de plantillas. <b>Git trata un repositorio como la unidad m\u00e1s peque\u00f1a en la gesti\u00f3n de subm\u00f3dulos<\/b>, as\u00ed que nuestra soluci\u00f3n deb\u00eda pasar por tener un repositorio solo con los flujos de trabajo relevantes o por evitar los subm\u00f3dulos por completo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Optamos por no usar subm\u00f3dulos porque queremos que un \u00fanico repositorio de flujos de trabajo contenga plantillas de Go y Python (entre otras), pero he sacado en claro informaci\u00f3n muy valiosa de toda esta reflexi\u00f3n. Algunos <a href=\"https:\/\/stackoverflow.com\/a\/4660048\" target=\"_tabs\" rel=\"noopener noreferrer\">hay quien utiliza enlaces simb\u00f3licos para incluir partes de un repositorio en otro <\/a>en lugar de subm\u00f3dulos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As\u00ed que intentamos vincular nuestra plantilla al flujo de trabajo de nuestra aplicaci\u00f3n. <b><code>ln $DIR\/workflows\/go\/build_and_push.yml $DIR\/my-app\/.github\/workflows\/build_and_push.yml<\/code><\/b> funciona para mantener nuestra plantilla de flujo de trabajo en sincronizaci\u00f3n con nuestra aplicaci\u00f3n&#8230; hasta que ejecutamos un comando git que modifica la plantilla (git cambia los inodos de los archivos que modifica). Dado que queremos poder ejecutar git pull para actualizar las plantillas, tendr\u00edamos que buscar algo que pudiera aplicar autom\u00e1ticamente los cambios del repositorio de plantillas al archivo de una aplicaci\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Plantillas de GitHub Actions: una alternativa aceptable para los planes que no son Enterprise<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Al no contar con la capacidad nativa de incluir plantillas privadas en nuestros flujos de trabajo y querer tener un \u00fanico repositorio en el que almacenarlas, optamos por esta sencilla soluci\u00f3n que optimiza la facilidad de aplicar las actualizaciones de las plantillas. Hasta que los planes Free y Team de GitHub incluyan asistencia para plantillas privadas, puedes migrar, pero esta es una posible soluci\u00f3n que hemos probado y verificado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Incluimos muestras de hooks de git en nuestro repositorio de plantillas (por ejemplo, <code>hooks\/post-checkout.sample<\/code>) porque los comandos de git que vayan a romper enlaces deben restablecerlos. Los hooks de <code>post-checkout<\/code> y <code>post-merge<\/code> tienen este aspecto:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    #!\/bin\/sh\r\n#\r\n# An example hook script to keep your application workflow up-to-date with this\r\n# template. For example, this updates my-app&#039;s workflow with the go template.\r\n#\r\n# To activate, this must have execute permission and be copied like so:\r\n#\r\n# $ cp hooks\/post-checkout.sample .git\/hooks\/post-checkout\r\n# $ chmod +x .git\/hooks\/post-checkout\r\n\r\n# setup our project directory, assumes my-app is sibling\r\nexport PROJ_DIR=..\r\n# remove existing workflow for clean install\r\nrm $PROJ_DIR\/my-app\/.github\/workflows\/build_and_push.yml\r\n# link app workflow to template\r\nln -v $PROJ_DIR\/workflows\/go\/build_and_push.yml $PROJ_DIR\/my-app\/.github\/workflows\/build_and_push.yml\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\"><code>git merge<\/code> y <code>git checkout<\/code> son operaciones habituales que rompen los enlaces, as\u00ed que ejecutamos este script despu\u00e9s de esas acciones.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por tanto, para aplicar plantillas de flujo de trabajo en las aplicaciones, hay que hacer lo siguiente:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Clonar nuestro repositorio <code>workflows<\/code>.<\/li>\n\n\n\n<li>Editar <code>hooks\/post-checkout.sample<\/code> y <code>hooks\/post-merge.sample<\/code> para que coincidan con tus aplicaciones.<\/li>\n\n\n\n<li>Copiarlos a sus respectivas ubicaciones <code>.git\/hooks<\/code> y darles permisos de ejecuci\u00f3n.<\/li>\n\n\n\n<li>Llevar a cabo un <code>git checkout<\/code> o <code>git pull<\/code> (<code>git checkout master<\/code> desde la rama principal funciona).<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Por desgracia, esto no mantiene actualizado por s\u00ed solo el repositorio de plantillas y exige cierta interacci\u00f3n por parte de la persona responsable del proyecto para adoptar las actualizaciones; al fin y al cabo, los cambios deben aplicarse al remoto. Esto se puede hacer a trav\u00e9s de los siguientes comandos:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    # from the workflow templates repo\r\n$ git pull\r\n# from the project repo\r\n$ git add .github\/workflows\/\r\n$ git commit -m &quot;upgrade workflow template&quot;\r\n$ git push\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Una vez hecho esto, el flujo de trabajo se ejecutar\u00e1 con los cambios m\u00e1s recientes del repositorio de plantillas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Simplifica la configuraci\u00f3n mediante un gestor de paquetes basado en Git<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dado que lo optimizamos todo para que fuera m\u00e1s f\u00e1cil aplicar las plantillas, tuvimos que hacer otras concesiones con nuestra soluci\u00f3n alternativa. La m\u00e1s evidente es la configuraci\u00f3n necesaria. Estamos pidiendo a los usuarios que organicen sus repositorios de una forma particular y copien y peguen los archivos a mano. Estos requisitos contribuyen a que exista cierta fragilidad, ya que el sistema puede fallar si se mueven los archivos o si los inodos cambian sin que nos demos cuenta.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sin embargo, esta alternativa nos aporta un beneficio muy interesante. Hemos descubierto un conjunto de herramientas y scripts que pueden funcionar en un contexto gen\u00e9rico. Creamos un gestor de paquetes gen\u00e9rico basado en git que utiliza enlaces y hooks de git para actualizar archivos entre repositorios de git:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    #!\/bin\/sh\r\n\r\n# set paths\/files (relative to workflows repo)\r\nexport TEMPLATE_DIR=.\r\nexport APP_DIR=..\/my-app\r\nexport DOCKER_TEMPL=go\/Dockerfile\r\nexport WKFLW_TEMPL=go\/build.yml\r\n\r\n#remove files for clean install\r\nrm $APP_DIR\/Dockerfil $APP_DIR\/.github\/workflows\/build.yml\r\n\r\n# link app workflow to template\r\nln -v $TEMPLATE_DIR\/$DOCKER_TEMPL $APP_DIR\/Dockerfile\r\nln -v $TEMPLATE_DIR\/$WKFLW_TEMPL $APP_DIR\/.github\/workflows\/build.yml\r\n\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<h2 class=\"wp-block-heading\">Pros y contras de GitHub Actions<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Entonces, \u00bfpor qu\u00e9 GitHub Actions? Bueno, nuestro sistema actual exige modificaciones, solicitudes de incorporaci\u00f3n de cambios (pull requests), implementaciones y mucho m\u00e1s para integrar un nuevo servicio. Adem\u00e1s, como usuario de GitHub Enterprise, tenemos una gran asignaci\u00f3n de minutos de ejecuci\u00f3n en GitHub Actions, de modo que decidimos evaluarlo como alternativa.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ahora que hemos pasado alg\u00fan tiempo con GitHub Actions, estas son mis conclusiones: <\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\nPros de GitHub Actions\n<\/th><th>\nContras de GitHub Actions\n<\/th><\/tr><\/thead><tbody><tr><td>\nQue los runners est\u00e9n alojados significa que no tenemos que preocuparnos por su mantenimiento.\n<\/td><td>\nCobra por minutos de ejecuci\u00f3n, por lo que desincentiva la creaci\u00f3n de pruebas de larga duraci\u00f3n en los runners alojados en GitHub.\n<\/td><\/tr><tr><td>\nOfrece algunas ventajas de seguridad (aunque acaban de tener una  <a href=\"https:\/\/www.theregister.com\/2022\/04\/21\/github-stolen-oauth-tokens-used-in-breaches\/\">brecha<\/a>).\n<\/td><td>\nTodav\u00eda le faltan algunas caracter\u00edsticas que ofrece Jenkins.\n<\/td><\/tr><tr><td>\nTiene una sintaxis de CI\/CD m\u00e1s com\u00fan definida por YAML.\n<\/td><td>\nEn Actions, GitHub utiliza unas met\u00e1foras y un lenguaje similares a los de la competencia, pero las met\u00e1foras no siempre coinciden. Esto dificulta un poco la migraci\u00f3n y el aprendizaje.\n<\/td><\/tr><tr><td>\nEs m\u00e1s f\u00e1cil integrar tareas p\u00fablicas o de c\u00f3digo abierto (OSS).\n<\/td><td>\nTrabajar con secretos puede ser peligroso y el equipo de desarrollo puede filtrar datos sin darse cuenta.\n<\/td><\/tr><tr><td>\nLa integraci\u00f3n con la interfaz de usuario de GitHub facilita la visualizaci\u00f3n de los resultados de CI.\n<\/td><td><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Como puedes ver, no es oro todo lo que reluce. Pero pronosticamos que GitHub, con los infinitos recursos que le proporciona Microsoft, superar\u00e1 a Jenkins a largo plazo.\u00a0<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pasos siguientes<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Aunque nuestra alternativa no es la m\u00e1s elegante, es una soluci\u00f3n que funciona hasta que GitHub admita plantillas privadas en los planes que no son Enterprise. Si esto sucede, podr\u00e1s migrar las plantillas a un \u00fanico repositorio.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dicho esto, contamos con una cuenta de GitHub Enterprise, pero todav\u00eda no tenemos la capacidad de activar la funci\u00f3n de repositorios privados que ha a\u00f1adido GitHub.\u00a0A\u00fan estamos intentando averiguar el origen de este problema.\u00a0Hasta entonces, utilizaremos la alternativa y volveremos a comprobarlo en el futuro para ver si logramos acceder a esta nueva funci\u00f3n. \u00a1No te pierdas las novedades!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tras muchos a\u00f1os usando Jenkins, decidimos migrar a GitHub Actions, pero nos encontramos con algunos obst\u00e1culos. Por eso, hemos ideado una soluci\u00f3n alternativa que permite a los usuarios de GitHub sin planes Enterprise, pero con repositorios privados, actualizar sus plantillas de flujo de trabajo.<\/p>\n","protected":false},"author":16,"featured_media":3952,"menu_order":0,"template":"","meta":{"_acf_changed":true,"footnotes":""},"blog_category":[19],"class_list":["post-19908","blog","type-blog","status-publish","has-post-thumbnail","hentry","blog_category-dev-life"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>C\u00f3mo usar repositorios privados con GitHub Actions - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"Migrar el sistema de CI\/CD a GitHub Actions puede ser complicado si quieres usar plantillas privadas. Por suerte, hemos creado esta alternativa para aplicar las actualizaciones de las plantillas.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/github-actions-templates\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"C\u00f3mo usar repositorios privados con GitHub Actions - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"Migrar el sistema de CI\/CD a GitHub Actions puede ser complicado si quieres usar plantillas privadas. Por suerte, hemos creado esta alternativa para aplicar las actualizaciones de las plantillas.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/github-actions-templates\/\" \/>\n<meta property=\"og:site_name\" content=\"Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png\" \/>\n\t<meta property=\"og:image:width\" content=\"720\" \/>\n\t<meta property=\"og:image:height\" content=\"448\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"6 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/dev-life\\\/github-actions-templates\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/dev-life\\\/github-actions-templates\\\/\",\"name\":\"C\u00f3mo usar repositorios privados con GitHub Actions - Transactional Email API Service For Developers | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/dev-life\\\/github-actions-templates\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/dev-life\\\/github-actions-templates\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Dev-Life.png\",\"datePublished\":\"2026-09-14T18:32:36+00:00\",\"description\":\"Migrar el sistema de CI\\\/CD a GitHub Actions puede ser complicado si quieres usar plantillas privadas. Por suerte, hemos creado esta alternativa para aplicar las actualizaciones de las plantillas.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/dev-life\\\/github-actions-templates\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/dev-life\\\/github-actions-templates\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/dev-life\\\/github-actions-templates\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Dev-Life.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Dev-Life.png\",\"width\":720,\"height\":448},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/dev-life\\\/github-actions-templates\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Plantillas privadas de GitHub Actions para tu organizaci\u00f3n\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#website\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"description\":\"Potentes API de email transaccional que te permiten enviar, recibir y hacer seguimiento de emails, creadas pensando en los desarrolladores. \u00a1Descubre m\u00e1s!\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#organization\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-android-chrome-512x512-1.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-android-chrome-512x512-1.png\",\"width\":512,\"height\":512,\"caption\":\"Transactional Email API Service For Developers | Mailgun\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"C\u00f3mo usar repositorios privados con GitHub Actions - Transactional Email API Service For Developers | Mailgun","description":"Migrar el sistema de CI\/CD a GitHub Actions puede ser complicado si quieres usar plantillas privadas. Por suerte, hemos creado esta alternativa para aplicar las actualizaciones de las plantillas.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/github-actions-templates\/","og_locale":"es_ES","og_type":"article","og_title":"C\u00f3mo usar repositorios privados con GitHub Actions - Transactional Email API Service For Developers | Mailgun","og_description":"Migrar el sistema de CI\/CD a GitHub Actions puede ser complicado si quieres usar plantillas privadas. Por suerte, hemos creado esta alternativa para aplicar las actualizaciones de las plantillas.","og_url":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/github-actions-templates\/","og_site_name":"Transactional Email API Service For Developers | Mailgun","og_image":[{"width":720,"height":448,"url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"6 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/github-actions-templates\/","url":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/github-actions-templates\/","name":"C\u00f3mo usar repositorios privados con GitHub Actions - Transactional Email API Service For Developers | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/github-actions-templates\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/github-actions-templates\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","datePublished":"2026-09-14T18:32:36+00:00","description":"Migrar el sistema de CI\/CD a GitHub Actions puede ser complicado si quieres usar plantillas privadas. Por suerte, hemos creado esta alternativa para aplicar las actualizaciones de las plantillas.","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/github-actions-templates\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/es\/blog\/dev-life\/github-actions-templates\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/github-actions-templates\/#primaryimage","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","width":720,"height":448},{"@type":"BreadcrumbList","@id":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/github-actions-templates\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mailgun.com\/es\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/www.mailgun.com\/es\/blog\/"},{"@type":"ListItem","position":3,"name":"Plantillas privadas de GitHub Actions para tu organizaci\u00f3n"}]},{"@type":"WebSite","@id":"https:\/\/www.mailgun.com\/es\/#website","url":"https:\/\/www.mailgun.com\/es\/","name":"Transactional Email API Service For Developers | Mailgun","description":"Potentes API de email transaccional que te permiten enviar, recibir y hacer seguimiento de emails, creadas pensando en los desarrolladores. \u00a1Descubre m\u00e1s!","publisher":{"@id":"https:\/\/www.mailgun.com\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mailgun.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.mailgun.com\/es\/#organization","name":"Transactional Email API Service For Developers | Mailgun","url":"https:\/\/www.mailgun.com\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.mailgun.com\/es\/#\/schema\/logo\/image\/","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/06\/cropped-android-chrome-512x512-1.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/06\/cropped-android-chrome-512x512-1.png","width":512,"height":512,"caption":"Transactional Email API Service For Developers | Mailgun"},"image":{"@id":"https:\/\/www.mailgun.com\/es\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog\/19908","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/users\/16"}],"version-history":[{"count":0,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog\/19908\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/media\/3952"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/media?parent=19908"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog_category?post=19908"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}