{"id":20131,"date":"2026-09-14T22:07:27","date_gmt":"2026-09-14T22:07:27","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/github-actions-templates-2\/"},"modified":"2026-09-14T22:07:27","modified_gmt":"2026-09-14T22:07:27","slug":"github-actions-templates","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/github-actions-templates\/","title":{"rendered":"Modelos privados do GitHub Actions para a sua organiza\u00e7\u00e3o"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">O GitHub Actions \u00e9 a novidade no mundo de CI\/CD, mas est\u00e1 superando rapidamente os servidores tradicionais de automa\u00e7\u00e3o de c\u00f3digo aberto. J\u00e1 faz algum tempo que a equipe de desenvolvimento da Sinch Mailgun sabe que algumas das ferramentas e tecnologias que usamos nessa configura\u00e7\u00e3o t\u00eam uma comunidade cada vez menor e correm o risco de se tornarem muito espec\u00edficas para que a manuten\u00e7\u00e3o valha a pena. \u00c9 por esses motivos que estamos no meio de uma migra\u00e7\u00e3o de nosso CI\/CD baseado no Jenkins para o CI\/CD do GitHub Actions. Aviso: \u00e0s vezes, as pilhas n\u00e3o est\u00e3o inclu\u00eddas, a menos que voc\u00ea seja cliente do GitHub Enterprise&#8230;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Digo isso porque, at\u00e9 muito recentemente, os modelos de fluxo de trabalho em reposit\u00f3rios privados n\u00e3o eram compat\u00edveis, ent\u00e3o tivemos que usar uma solu\u00e7\u00e3o alternativa. Felizmente, <a href=\"https:\/\/github.blog\/changelog\/2022-03-04-sharing-github-actions-within-your-enterprise-is-now-ga\/\" target=\"_tabs\" rel=\"noopener noreferrer\">o GitHub lan\u00e7ou uma atualiza\u00e7\u00e3o recente<\/a> que agora tem suporte a essa funcionalidade em seus planos Enterprise. Mas <b>para quem est\u00e1 nos planos Free ou Team do GitHub, o problema persiste. <\/b>N\u00e3o sabemos se ou quando o GitHub vai liberar essa atualiza\u00e7\u00e3o para outros planos, ent\u00e3o, enquanto isso n\u00e3o acontece, veja pelo que passamos e como resolvemos isso.<\/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-6690\"><p class=\"h5 m-0\" id=\"toc-title-6690\">\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=\"#o-desafio-de-reutilizar-fluxos-de-trabalho\">O desafio de reutilizar fluxos de trabalho<\/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=\"#sincronizacao-de-modelos-de-fluxo-de-trabalho\">Sincroniza\u00e7\u00e3o de modelos de fluxo de trabalho\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=\"#modelos-do-github-actions-uma-solucao-alternativa-aceitavel-para-planos-nao-enterprise\">Modelos do GitHub Actions: uma solu\u00e7\u00e3o alternativa aceit\u00e1vel para planos n\u00e3o 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=\"#simplificar-a-configuracao-usando-um-gerenciador-de-pacotes-baseado-em-git\">Simplificar a configura\u00e7\u00e3o usando um gerenciador de pacotes baseado em 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-e-contras-do-github-actions\">Pr\u00f3s e contras do 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=\"#proximos-passos\">Pr\u00f3ximos passos<\/a><\/div><\/div><\/nav>\n\n\n<h2 class=\"wp-block-heading\">O desafio de reutilizar fluxos de trabalho<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Minha experi\u00eancia anterior com o GitLab CI encurtou a curva de aprendizado com o GitHub Actions, mas os detalhes mais minuciosos mostraram-se diferentes. Por exemplo, incluir um conjunto de etapas de um projeto em outro \u00e9 bem diferente. Tanto o GitHub Actions quanto o GitLab CI t\u00eam suporte \u00e0 reutiliza\u00e7\u00e3o de etapas de um reposit\u00f3rio em outro, mas <b>os planos Free e Team do GitHub Actions exigem que as etapas a serem inclu\u00eddas sejam acess\u00edveis publicamente<\/b>. No Gitlab CI, \u00e9 poss\u00edvel usar a autentica\u00e7\u00e3o para importar tarefas, est\u00e1gios, vari\u00e1veis etc. de um reposit\u00f3rio privado usando a diretiva  <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\">No momento da reda\u00e7\u00e3o deste texto, o GitHub Actions tinha <a href=\"https:\/\/stackoverflow.com\/questions\/4659549\/maintain-git-repo-inside-another-git-repo\/4660048#4660048\" target=\"_tabs\" rel=\"noopener noreferrer\">issues<\/a> (<a href=\"https:\/\/github.com\/github\/roadmap\/issues\/74\" target=\"_tabs\" rel=\"noopener noreferrer\">na verdade, duas<\/a>) rastreando essa funcionalidade desejada para reposit\u00f3rios privados. Essas issues ficaram abertas por quase 18 meses, e essa funcionalidade foi adicionada recentemente para quem tem planos Enterprise. N\u00e3o sei ao certo quando (ou se) essa funcionalidade estar\u00e1 dispon\u00edvel para todo mundo, mas parece ser uma parte fundamental do funcionamento para dar suporte \u00e0 reutiliza\u00e7\u00e3o privada de fluxos de trabalho.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Sincroniza\u00e7\u00e3o de modelos de fluxo de trabalho\u00a0<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pesquisei as publica\u00e7\u00f5es no Stack Overflow e vasculhei as conversas de coment\u00e1rios do GitHub Issues, mas n\u00e3o encontrei boas solu\u00e7\u00f5es alternativas para a falta de capacidade de incluir fluxos de trabalho de outros reposit\u00f3rios privados na mesma organiza\u00e7\u00e3o.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pensei que os subm\u00f3dulos do git poderiam ser uma poss\u00edvel solu\u00e7\u00e3o. Afinal, eles permitem que um reposit\u00f3rio inclua outro reposit\u00f3rio. Poder\u00edamos incluir nossos modelos de fluxo de trabalho como um subm\u00f3dulo em nosso reposit\u00f3rio e usar o gerenciamento de subm\u00f3dulos do git para manter os modelos atualizados? Poder\u00edamos, mas n\u00e3o se quis\u00e9ssemos ter modelos irrelevantes para alguns reposit\u00f3rios no reposit\u00f3rio de modelos. <b>O git trata um reposit\u00f3rio como a menor unidade no gerenciamento de subm\u00f3dulos<\/b>, ent\u00e3o nossa solu\u00e7\u00e3o teria um reposit\u00f3rio com apenas fluxos de trabalho relevantes, ou evitaria o uso de subm\u00f3dulos de uma vez por todas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Optamos por n\u00e3o usar subm\u00f3dulos porque quer\u00edamos que um reposit\u00f3rio de fluxo de trabalho armazenasse modelos de Go e Python (entre outros), mas extra\u00ed algumas informa\u00e7\u00f5es valiosas dessa linha de racioc\u00ednio. Algumas <a href=\"https:\/\/stackoverflow.com\/a\/4660048\" target=\"_tabs\" rel=\"noopener noreferrer\">pessoas usam links simb\u00f3licos (symlinks) para incluir partes de um reposit\u00f3rio em outro <\/a>em vez de subm\u00f3dulos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ent\u00e3o, tentamos vincular nosso modelo ao fluxo de trabalho do nosso aplicativo. <b><code>ln $DIR\/workflows\/go\/build_and_push.yml $DIR\/my-app\/.github\/workflows\/build_and_push.yml<\/code><\/b> funciona para manter o nosso modelo de fluxo de trabalho sincronizado com o aplicativo&#8230; at\u00e9 executarmos um comando git que modifica o modelo (o git altera os inodes dos arquivos que modifica). Como queremos conseguir usar o git pull para atualiza\u00e7\u00f5es nos modelos, precisar\u00edamos encontrar algo que aplicasse automaticamente as altera\u00e7\u00f5es do reposit\u00f3rio de modelos ao arquivo de um aplicativo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Modelos do GitHub Actions: uma solu\u00e7\u00e3o alternativa aceit\u00e1vel para planos n\u00e3o Enterprise<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Sem a capacidade nativa de incluir modelos privados em nossos fluxos de trabalho e como quer\u00edamos ter um \u00fanico reposit\u00f3rio para armazenar nossos modelos de fluxo de trabalho, optamos por essa solu\u00e7\u00e3o simples que otimiza a facilidade de aplicar as atualiza\u00e7\u00f5es de modelo. At\u00e9 que os planos Free e Team do GitHub deem suporte a modelos privados, voc\u00ea pode migrar, mas esta \u00e9 uma poss\u00edvel solu\u00e7\u00e3o que tentamos e testamos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Inclu\u00edmos exemplos de git hooks em nosso reposit\u00f3rio de modelos (por exemplo, <code>hooks\/post-checkout.sample<\/code>) porque qualquer comando git que v\u00e1 quebrar os links precisar\u00e1 restabelec\u00ea-los. Os hooks para <code>post-checkout<\/code> e <code>post-merge<\/code> ficam mais ou menos assim:<\/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=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\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> e <code>git checkout<\/code> s\u00e3o opera\u00e7\u00f5es comuns que quebram links, ent\u00e3o executamos este script ap\u00f3s essas a\u00e7\u00f5es.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Portanto, para aplicar os modelos de fluxo de trabalho aos seus aplicativos, \u00e9 preciso:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Clonar o nosso reposit\u00f3rio <code>workflows<\/code>.<\/li>\n\n\n\n<li>Editar os arquivos <code>hooks\/post-checkout.sample<\/code> e <code>hooks\/post-merge.sample<\/code> para corresponder aos seus aplicativos.<\/li>\n\n\n\n<li>Copi\u00e1-los para seus respectivos locais em <code>.git\/hooks<\/code> e dar permiss\u00e3o de execu\u00e7\u00e3o a eles.<\/li>\n\n\n\n<li>Executar um <code>git checkout<\/code> ou <code>git pull<\/code> (<code>git checkout master<\/code> a partir da prim\u00e1ria funciona).<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Infelizmente, isso n\u00e3o mant\u00e9m o reposit\u00f3rio de modelos atualizado por conta pr\u00f3pria e requer alguma intera\u00e7\u00e3o das pessoas propriet\u00e1rias do projeto para adotar as atualiza\u00e7\u00f5es \u2013 afinal, as altera\u00e7\u00f5es precisam ser aplicadas ao reposit\u00f3rio remoto. \u00c9 poss\u00edvel fazer isso por meio dos seguintes 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=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\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\">E depois disso, o fluxo de trabalho ser\u00e1 executado com as altera\u00e7\u00f5es mais recentes do reposit\u00f3rio de modelos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Simplificar a configura\u00e7\u00e3o usando um gerenciador de pacotes baseado em Git<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Como otimizamos a facilidade de aplicar os modelos, fizemos outras concess\u00f5es com nossa solu\u00e7\u00e3o alternativa. A mais \u00f3bvia delas \u00e9 a configura\u00e7\u00e3o necess\u00e1ria. Estamos pedindo para os usu\u00e1rios organizarem os reposit\u00f3rios de uma forma espec\u00edfica e copiarem e colarem arquivos manualmente. Esses requisitos contribuem para uma certa fragilidade, em que o sistema pode quebrar se os arquivos forem movidos ou os inodes mudarem sem o nosso conhecimento.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No entanto, h\u00e1 um benef\u00edcio interessante que obtemos com essa solu\u00e7\u00e3o. Descobrimos um conjunto de ferramentas e scripts que pode funcionar em um contexto gen\u00e9rico. Criamos um gerenciador de pacotes gen\u00e9rico baseado em git que utiliza links e git hooks para atualizar arquivos entre reposit\u00f3rios 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=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\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\">Pr\u00f3s e contras do GitHub Actions<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Mas, por que o GitHub Actions? Bom, nosso sistema atual exige modifica\u00e7\u00f5es, pull requests, implanta\u00e7\u00f5es e muito mais para integrar um novo servi\u00e7o. E, como usu\u00e1rios do GitHub Enterprise, temos uma grande aloca\u00e7\u00e3o de minutos de execu\u00e7\u00e3o no GitHub Actions e, por isso, decidimos avaliar isso como uma alternativa.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Agora que passamos algum tempo usando o GitHub Actions, estas s\u00e3o as minhas conclus\u00f5es: <\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\nPr\u00f3s do GitHub Actions\n<\/th><th>\nContras do GitHub Actions\n<\/th><\/tr><\/thead><tbody><tr><td>\nOs runners hospedados significam que n\u00e3o precisamos nos preocupar com a manuten\u00e7\u00e3o deles.\n<\/td><td>\nA cobran\u00e7a \u00e9 por minutos de execu\u00e7\u00e3o, o que n\u00e3o nos incentiva a ter testes de longa dura\u00e7\u00e3o nos runners hospedados pelo GitHub.\n<\/td><\/tr><tr><td>\nOferece alguns benef\u00edcios de seguran\u00e7a (embora tenham acabado de sofrer uma  <a href=\"https:\/\/www.theregister.com\/2022\/04\/21\/github-stolen-oauth-tokens-used-in-breaches\/\">viola\u00e7\u00e3o<\/a>).\n<\/td><td>\nAinda faltam alguns recursos oferecidos pelo Jenkins.\n<\/td><\/tr><tr><td>\nTem uma sintaxe de CI\/CD mais comum definida por YAML.\n<\/td><td>\nO GitHub usa met\u00e1foras e linguagem no Actions semelhantes \u00e0s da concorr\u00eancia, mas as met\u00e1foras nem sempre s\u00e3o as mesmas. Isso torna a migra\u00e7\u00e3o e o aprendizado um pouco dif\u00edceis.\n<\/td><\/tr><tr><td>\n\u00c9 mais f\u00e1cil integrar tarefas p\u00fablicas\/de software de c\u00f3digo aberto (OSS).\n<\/td><td>\nTrabalhar com secrets pode ser perigoso e a equipe de desenvolvimento pode vazar dados sem saber.\n<\/td><\/tr><tr><td>\nA integra\u00e7\u00e3o com a interface de usu\u00e1rio do GitHub facilita a visualiza\u00e7\u00e3o dos resultados de CI.\n<\/td><td><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Como voc\u00ea pode ver, a grama do vizinho nem sempre \u00e9 mais verde. Mas prevemos que o GitHub, com seus infinitos recursos da Microsoft, vai superar o Jenkins no longo prazo.\u00a0<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pr\u00f3ximos passos<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Embora nossa solu\u00e7\u00e3o alternativa n\u00e3o seja bonita, \u00e9 uma solu\u00e7\u00e3o que funciona at\u00e9 que o GitHub passe a oferecer suporte a modelos privados para planos n\u00e3o Enterprise. Se isso acontecer, voc\u00ea pode migrar os modelos para um \u00fanico reposit\u00f3rio.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dito isso, temos uma conta do GitHub Enterprise, mas ainda n\u00e3o podemos ativar a funcionalidade de reposit\u00f3rio privado que o GitHub adicionou.\u00a0Ainda estamos determinando a origem desse problema.\u00a0At\u00e9 l\u00e1, estamos usando a solu\u00e7\u00e3o alternativa e voltaremos a verificar no futuro para ver se conseguimos obter acesso a essa nova funcionalidade. Aguarde novidades!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ap\u00f3s muitos anos usando o Jenkins, decidimos migrar para o GitHub Actions, onde enfrentamos alguns desafios. Por isso, desenvolvemos uma solu\u00e7\u00e3o alternativa que permite que usu\u00e1rios n\u00e3o Enterprise do GitHub com reposit\u00f3rios privados atualizem seus modelos de fluxo de trabalho.<\/p>\n","protected":false},"author":16,"featured_media":3952,"menu_order":0,"template":"","meta":{"_acf_changed":true,"footnotes":""},"blog_category":[19],"class_list":["post-20131","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>Como usar reposit\u00f3rios privados com o GitHub Actions - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"Mover o seu CI\/CD para o GitHub Actions pode ser complicado caso voc\u00ea queira usar modelos privados. Felizmente, criamos esta solu\u00e7\u00e3o alternativa para aplicar atualiza\u00e7\u00f5es de modelos.\" \/>\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\/pt\/blog\/dev-life\/github-actions-templates\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Como usar reposit\u00f3rios privados com o GitHub Actions - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"Mover o seu CI\/CD para o GitHub Actions pode ser complicado caso voc\u00ea queira usar modelos privados. Felizmente, criamos esta solu\u00e7\u00e3o alternativa para aplicar atualiza\u00e7\u00f5es de modelos.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/pt\/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\\\/pt\\\/blog\\\/dev-life\\\/github-actions-templates\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/dev-life\\\/github-actions-templates\\\/\",\"name\":\"Como usar reposit\u00f3rios privados com o GitHub Actions - Transactional Email API Service For Developers | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/dev-life\\\/github-actions-templates\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/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-14T22:07:27+00:00\",\"description\":\"Mover o seu CI\\\/CD para o GitHub Actions pode ser complicado caso voc\u00ea queira usar modelos privados. Felizmente, criamos esta solu\u00e7\u00e3o alternativa para aplicar atualiza\u00e7\u00f5es de modelos.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/dev-life\\\/github-actions-templates\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/dev-life\\\/github-actions-templates\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/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\\\/pt\\\/blog\\\/dev-life\\\/github-actions-templates\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/inicio\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Modelos privados do GitHub Actions para a sua organiza\u00e7\u00e3o\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#website\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"description\":\"Poderosas APIs de e-mail transacional que permitem a voc\u00ea enviar, receber e rastrear e-mails, criadas com os desenvolvedores em mente. Saiba mais hoje mesmo!\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#organization\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#\\\/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\\\/pt\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Como usar reposit\u00f3rios privados com o GitHub Actions - Transactional Email API Service For Developers | Mailgun","description":"Mover o seu CI\/CD para o GitHub Actions pode ser complicado caso voc\u00ea queira usar modelos privados. Felizmente, criamos esta solu\u00e7\u00e3o alternativa para aplicar atualiza\u00e7\u00f5es de modelos.","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\/pt\/blog\/dev-life\/github-actions-templates\/","og_locale":"pt_BR","og_type":"article","og_title":"Como usar reposit\u00f3rios privados com o GitHub Actions - Transactional Email API Service For Developers | Mailgun","og_description":"Mover o seu CI\/CD para o GitHub Actions pode ser complicado caso voc\u00ea queira usar modelos privados. Felizmente, criamos esta solu\u00e7\u00e3o alternativa para aplicar atualiza\u00e7\u00f5es de modelos.","og_url":"https:\/\/www.mailgun.com\/pt\/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\/pt\/blog\/dev-life\/github-actions-templates\/","url":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/github-actions-templates\/","name":"Como usar reposit\u00f3rios privados com o GitHub Actions - Transactional Email API Service For Developers | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/github-actions-templates\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/pt\/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-14T22:07:27+00:00","description":"Mover o seu CI\/CD para o GitHub Actions pode ser complicado caso voc\u00ea queira usar modelos privados. Felizmente, criamos esta solu\u00e7\u00e3o alternativa para aplicar atualiza\u00e7\u00f5es de modelos.","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/github-actions-templates\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/github-actions-templates\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.mailgun.com\/pt\/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\/pt\/blog\/dev-life\/github-actions-templates\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mailgun.com\/pt\/inicio\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/www.mailgun.com\/pt\/blog\/"},{"@type":"ListItem","position":3,"name":"Modelos privados do GitHub Actions para a sua organiza\u00e7\u00e3o"}]},{"@type":"WebSite","@id":"https:\/\/www.mailgun.com\/pt\/#website","url":"https:\/\/www.mailgun.com\/pt\/","name":"Transactional Email API Service For Developers | Mailgun","description":"Poderosas APIs de e-mail transacional que permitem a voc\u00ea enviar, receber e rastrear e-mails, criadas com os desenvolvedores em mente. Saiba mais hoje mesmo!","publisher":{"@id":"https:\/\/www.mailgun.com\/pt\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mailgun.com\/pt\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.mailgun.com\/pt\/#organization","name":"Transactional Email API Service For Developers | Mailgun","url":"https:\/\/www.mailgun.com\/pt\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.mailgun.com\/pt\/#\/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\/pt\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog\/20131","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/users\/16"}],"version-history":[{"count":0,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog\/20131\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/media\/3952"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/media?parent=20131"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog_category?post=20131"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}