[{"data":1,"prerenderedAt":1324},["ShallowReactive",2],{"blog-\u002Fblog\u002Fgithub-actions-vs-gitlab-ci-vs-drone-self-hosted":3,"blog-surround-\u002Fblog\u002Fgithub-actions-vs-gitlab-ci-vs-drone-self-hosted":1308,"blog-en-alt-\u002Fblog\u002Fgithub-actions-vs-gitlab-ci-vs-drone-self-hosted":1322},{"id":4,"title":5,"author":6,"body":7,"category":1289,"cover":1290,"date":1291,"description":1292,"draft":1293,"extension":1294,"lastReviewed":1290,"meta":1295,"navigation":1296,"path":1297,"readingTime":1298,"seo":1299,"sitemap":1300,"stem":1301,"tags":1302,"__hash__":1307},"blog_pt\u002Fblog\u002Fgithub-actions-vs-gitlab-ci-vs-drone-self-hosted.md","GitHub Actions vs GitLab CI vs Drone: qual CI\u002FCD escolher pra startup brasileira","Equipe HeroCtl",{"type":8,"value":9,"toc":1250},"minimark",[10,19,22,27,45,51,57,63,66,69,73,76,79,106,109,113,120,125,158,162,165,217,220,223,226,230,233,236,256,259,263,266,270,306,310,313,318,367,370,376,390,393,397,400,404,448,452,478,482,485,492,496,499,619,626,629,633,636,697,700,702,706,890,893,897,900,904,910,914,920,923,927,933,936,940,946,950,956,960,963,966,992,1003,1006,1010,1014,1017,1033,1037,1040,1051,1054,1058,1061,1064,1068,1071,1089,1092,1096,1101,1104,1109,1112,1117,1120,1125,1128,1133,1136,1141,1144,1149,1156,1161,1164,1169,1172,1174,1178,1181,1213,1216,1226,1229,1243],[11,12,13,14,18],"p",{},"A escolha de CI\u002FCD em 2026 não é mais sobre \"qual ferramenta tem mais features\". Todas as três sérias — GitHub Actions, GitLab CI, Drone (e seu fork Woodpecker) — fazem o básico bem. A escolha real é sobre ",[15,16,17],"strong",{},"onde a sua dor vai aparecer primeiro",": na fatura no fim do mês, na complexidade do workflow quando o monorepo crescer, ou na hora de subir um runner que ninguém entende quando o dev sênior sai de férias.",[11,20,21],{},"Este post é uma comparação honesta pra tech leads brasileiros decidindo CI\u002FCD em 2026. Sem ranking artificial, sem coluna em que uma ferramenta é \"campeã\" em tudo. Tradeoffs explícitos, números em reais, e uma recomendação por perfil no final.",[23,24,26],"h2",{"id":25},"tldr-200-palavras","TL;DR (200 palavras)",[11,28,29,30,33,34,33,37,40,41,44],{},"A decisão de CI\u002FCD em 2026 segue quatro forças: ",[15,31,32],{},"onde o código está hospedado",", ",[15,35,36],{},"custo de minutos",[15,38,39],{},"complexidade de workflow"," e ",[15,42,43],{},"disposição pra operar self-hosted",".",[11,46,47,50],{},[15,48,49],{},"GitHub Actions"," ganhou mindshare absoluto pra projetos no GitHub. É grátis até 2000 minutos\u002Fmês em repos públicos; depois custa US$0,008\u002Fmin em runner Linux — entre US$5 e US$30\u002Fmês pra startup típica (R$25 a R$150). Marketplace tem 10 mil ações prontas. O calcanhar é o pricing de minutos quando o volume cresce.",[11,52,53,56],{},[15,54,55],{},"GitLab CI"," é mais completo: grafo de dependências entre jobs nativo, parent-child pipelines, monorepo handling melhor, registro de imagens incluído, scanning de segurança embutido. Self-hosted (Community Edition) é gratuito mas exige 4 a 8 GB de RAM e operação ativa. SaaS Premium é US$29\u002Fusuário\u002Fmês — caro pra time grande.",[11,58,59,62],{},[15,60,61],{},"Drone\u002FWoodpecker"," auto-hospedado é a opção pra reduzir custo a zero variável. Um servidor de R$30 a R$80\u002Fmês roda CI pra cinco a dez projetos. Custa em ops: você opera os runners.",[11,64,65],{},"Pra startup BR pequena no GitHub, comece no plano gratuito do Actions. Quando passar de US$30\u002Fmês, considere Woodpecker self-hosted. Pra empresa que valoriza CI + issue tracker + registro num produto só, GitLab self-hosted.",[11,67,68],{},"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━",[23,70,72],{"id":71},"por-que-essa-decisao-importa-mais-do-que-parece","Por que essa decisão importa mais do que parece?",[11,74,75],{},"CI\u002FCD é a infraestrutura mais usada de qualquer time de produto: cada commit toca o sistema, cada PR depende dele, cada deploy passa por ele. Uma escolha errada não te quebra no primeiro mês — te quebra no terceiro ano, quando migrar custa quatro semanas de duas pessoas e você paga isso enquanto o roadmap fica parado.",[11,77,78],{},"Os três sintomas que indicam que a escolha foi errada:",[80,81,82,89,100],"ol",{},[83,84,85,88],"li",{},[15,86,87],{},"A fatura cresce mais rápido do que o time."," Se o custo de CI dobra a cada seis meses sem que o volume de deploys justifique, o pricing model não é o seu.",[83,90,91,94,95,99],{},[15,92,93],{},"Os workflows viram cópias-cola."," Se cada novo projeto começa com ",[96,97,98],"code",{},"cp -r .github\u002Fworkflows\u002F",", a ferramenta não tem composição decente.",[83,101,102,105],{},[15,103,104],{},"Falhas no CI levam mais de uma hora pra debugar."," Se reproduzir o erro local exige rodar uma imagem Docker que ninguém sabe montar, o build não é portável.",[11,107,108],{},"Os três competidores principais resolvem esses sintomas de formas diferentes. Vamos por partes.",[23,110,112],{"id":111},"github-actions-o-padrao-de-fato-vale-o-preco","GitHub Actions: o padrão de fato — vale o preço?",[11,114,115,116,119],{},"Se o seu código está no GitHub, Actions tem uma vantagem estrutural que não dá pra ignorar: zero atrito de integração. Você cria ",[96,117,118],{},".github\u002Fworkflows\u002Fci.yml",", faz push, e está rodando. Sem cadastro separado, sem token cruzado, sem webhook pra configurar.",[121,122,124],"h3",{"id":123},"o-que-actions-faz-bem","O que Actions faz bem",[126,127,128,134,140,146,152],"ul",{},[83,129,130,133],{},[15,131,132],{},"Marketplace gigante."," Mais de dez mil ações prontas para tarefas comuns: setup de Node, Python, Go; deploy pra AWS, GCP, Azure; assinatura de imagens; scanning de segurança. A maioria é mantida pelo próprio fornecedor da tecnologia (HashiCorp publica a sua, AWS publica a sua, etc).",[83,135,136,139],{},[15,137,138],{},"Matrix builds."," Rodar a mesma suite contra cinco versões de Node ou três sistemas operacionais é uma chave em três linhas.",[83,141,142,145],{},[15,143,144],{},"Reusable workflows."," Desde 2021 dá pra extrair workflows compartilhados entre repos da mesma organização — soluciona o problema de \"cópia-cola entre projetos\" pra times médios.",[83,147,148,151],{},[15,149,150],{},"Deployment protection rules."," Approvals manuais, janelas de horário, restrição por branch — tudo configurável sem plugin.",[83,153,154,157],{},[15,155,156],{},"Self-hosted runners."," Você pode rodar o agente em sua própria infra e usar a UI do Actions só como orquestrador. Resolve o problema de minutos pra times com volume alto.",[121,159,161],{"id":160},"o-que-actions-cobra-caro","O que Actions cobra caro",[11,163,164],{},"O modelo de cobrança é por minuto, e os números importam:",[166,167,168,181],"table",{},[169,170,171],"thead",{},[172,173,174,178],"tr",{},[175,176,177],"th",{},"Tipo de runner",[175,179,180],{},"Custo",[182,183,184,193,201,209],"tbody",{},[172,185,186,190],{},[187,188,189],"td",{},"Linux 2 vCPU (padrão)",[187,191,192],{},"US$0,008\u002Fmin (R$0,04)",[172,194,195,198],{},[187,196,197],{},"Windows 2 vCPU",[187,199,200],{},"US$0,016\u002Fmin (R$0,08)",[172,202,203,206],{},[187,204,205],{},"macOS (necessário pra builds iOS)",[187,207,208],{},"US$0,08\u002Fmin (R$0,40)",[172,210,211,214],{},[187,212,213],{},"Larger Linux (4 vCPU+)",[187,215,216],{},"US$0,016\u002Fmin e acima",[11,218,219],{},"Pra uma startup no GitHub com cinco devs e workflow razoável (build + teste + lint em cada PR), o consumo típico é 800 a 2500 minutos\u002Fmês em Linux. Isso dá US$6 a US$20\u002Fmês — ou seja, entre R$30 e R$100. Cabe na linha de \"ferramentas de dev\" sem dor.",[11,221,222],{},"Quando dói: workflows pesados (E2E com Playwright, builds Rust, testes que sobem Postgres + Redis em cada job) facilmente passam de 10 mil minutos\u002Fmês. A US$0,008\u002Fmin isso vira US$80\u002Fmês — R$400. Multiplique por 12 e você está pagando R$5 mil\u002Fano em CI.",[11,224,225],{},"Builds macOS são o pior caso: US$0,40\u002Fmin é dez vezes mais que Linux. Times que mantém apps iOS gastam três a quatro vezes mais em CI do que em infra de produção.",[121,227,229],{"id":228},"self-hosted-runners-do-actions-resolvem","Self-hosted runners do Actions resolvem?",[11,231,232],{},"Parcialmente. Você roda o binário do runner em uma máquina sua, registra no repo ou na organização, e os jobs vão pra lá em vez do pool gerenciado. Custo de minuto vai pra zero — você paga só a máquina.",[11,234,235],{},"Mas três pegadinhas:",[80,237,238,244,250],{},[83,239,240,243],{},[15,241,242],{},"Manutenção do runner."," A versão atualiza com frequência; runners desatualizados começam a falhar silenciosamente. Sem automação, vira tarefa de operação manual.",[83,245,246,249],{},[15,247,248],{},"Scaling manual."," Se o time tem cinco devs abrindo 20 PRs simultâneos, um runner serializa tudo. Você precisa de N runners — e provisionar\u002Fdesprovisionar conforme demanda exige tooling adicional.",[83,251,252,255],{},[15,253,254],{},"Segurança em repos públicos."," Self-hosted runners em repo público são uma porta aberta pra qualquer fork malicioso rodar código arbitrário na sua máquina. Sempre restrito a repos privados ou organização confiável.",[11,257,258],{},"A solução madura é Actions Runner Controller (ARC): um operador que sobe runners on-demand num cluster Kubernetes ou similar. Resolve scaling, mas adiciona uma camada inteira de infraestrutura — não é trivial.",[23,260,262],{"id":261},"gitlab-ci-o-competidor-pesado-ainda-faz-sentido","GitLab CI: o competidor \"pesado\" ainda faz sentido?",[11,264,265],{},"GitLab CI é mais antigo do que Actions, mais completo em features, e menos popular fora dos times que já estão na plataforma GitLab. A pergunta correta não é \"GitLab CI é melhor que Actions?\", é \"vale a pena migrar pra GitLab pra usar GitLab CI?\"",[121,267,269],{"id":268},"o-que-gitlab-ci-faz-melhor","O que GitLab CI faz melhor",[126,271,272,282,288,294,300],{},[83,273,274,277,278,281],{},[15,275,276],{},"Grafo de dependências (DAG)."," Nativo, sem tooling externo. Você declara ",[96,279,280],{},"needs: [job_a, job_b]"," e os jobs rodam em paralelo respeitando dependências. Pra workflows com 30+ jobs (monorepo grande, várias linguagens, deploy multi-ambiente), isso é a diferença entre 8 minutos e 25 minutos por pipeline.",[83,283,284,287],{},[15,285,286],{},"Parent-child pipelines."," Pipeline grande pode disparar pipelines filhos com lógica condicional — útil pra monorepo onde só serviços alterados precisam buildar.",[83,289,290,293],{},[15,291,292],{},"Registro de imagens incluído."," Cada projeto vem com um registro de container privado nativo. Sem configurar segredos pra Amazon ECR, Docker Hub ou similar.",[83,295,296,299],{},[15,297,298],{},"Pages, security scanning, code quality, dependency scanning"," — tudo embutido na plataforma. Em Actions cada um é uma ação separada do marketplace.",[83,301,302,305],{},[15,303,304],{},"Merge request integration profundo."," Pipelines aparecem dentro do MR com diff de cobertura, comparação de bundle size, comparação de tempo de build. Em Actions os checks aparecem como links — em GitLab são dados estruturados.",[121,307,309],{"id":308},"onde-gitlab-ci-cobra-caro","Onde GitLab CI cobra caro",[11,311,312],{},"Duas dimensões.",[11,314,315],{},[15,316,317],{},"Pricing SaaS:",[166,319,320,332],{},[169,321,322],{},[172,323,324,327,329],{},[175,325,326],{},"Plano",[175,328,180],{},[175,330,331],{},"Limite mensal de minutos",[182,333,334,345,356],{},[172,335,336,339,342],{},[187,337,338],{},"Free",[187,340,341],{},"US$0\u002Fusuário",[187,343,344],{},"400 minutos",[172,346,347,350,353],{},[187,348,349],{},"Premium",[187,351,352],{},"US$29\u002Fusuário\u002Fmês (R$145)",[187,354,355],{},"10.000 minutos",[172,357,358,361,364],{},[187,359,360],{},"Ultimate",[187,362,363],{},"US$99\u002Fusuário\u002Fmês (R$495)",[187,365,366],{},"50.000 minutos",[11,368,369],{},"Pra time de cinco devs no Premium, são US$145\u002Fmês — R$725. Esse é só o ticket de entrada; minutos extras custam à parte. Pra time de 20, US$580\u002Fmês = R$2.900 só em assinatura.",[11,371,372,375],{},[15,373,374],{},"Self-hosted Community Edition"," é gratuito e remove esse custo de licença — mas:",[126,377,378,381,384,387],{},[83,379,380],{},"Mínimo realista: 4 vCPU, 8 GB RAM (16 GB se vai usar registro + pages + scanning).",[83,382,383],{},"VPS adequado no Brasil: R$120 a R$250\u002Fmês.",[83,385,386],{},"Ops: 2 a 4 horas\u002Fmês em atualização, backup, monitoração.",[83,388,389],{},"Atualizações mensais. GitLab tem cadência rígida; ficar três versões atrás abre brechas de segurança documentadas.",[11,391,392],{},"Em produção real, self-hosted GitLab dá menos trabalho do que Kubernetes mas mais do que Actions SaaS. É um servidor real que você opera.",[23,394,396],{"id":395},"drone-ci-e-woodpecker-a-alternativa-minimalista","Drone CI e Woodpecker: a alternativa minimalista",[11,398,399],{},"Drone CI nasceu em 2014 como o \"CI nativo de container\": cada step do pipeline é um container, sem mágica. Em 2020 a empresa por trás (Drone Inc.) foi adquirida pela Harness, e o produto ganhou uma versão Cloud comercial. O fork comunitário Woodpecker continua 100% open-source, com API compatível com Drone.",[121,401,403],{"id":402},"o-que-dronewoodpecker-fazem-bem","O que Drone\u002FWoodpecker fazem bem",[126,405,406,416,430,436,442],{},[83,407,408,411,412,415],{},[15,409,410],{},"YAML simples."," Cada step declara uma imagem e um comando. Sem DSL, sem actions reutilizáveis com semântica própria. O que você executa localmente com ",[96,413,414],{},"docker run"," é o que executa no CI.",[83,417,418,421,422,425,426,429],{},[15,419,420],{},"Container-native."," Não há \"executor\" Java, não há agente Python rodando steps. Cada step é um container isolado. Reproduzir o erro localmente é literal: copia o ",[96,423,424],{},"image:"," e o ",[96,427,428],{},"commands:"," do YAML e roda no terminal.",[83,431,432,435],{},[15,433,434],{},"Self-hosted desde o dia um."," Não há \"Drone Cloud grátis\" pulling features pra versão paga. O servidor + os runners são o produto inteiro.",[83,437,438,441],{},[15,439,440],{},"Plugins via container."," Cada plugin (deploy SSH, Slack, Docker push, AWS) é uma imagem publicada. Versionado igual a qualquer outra dependência.",[83,443,444,447],{},[15,445,446],{},"Suporta múltiplos hosts de código."," GitHub, GitLab, Bitbucket, Gitea, Forgejo — tudo no mesmo servidor de Drone.",[121,449,451],{"id":450},"onde-dronewoodpecker-cobram","Onde Drone\u002FWoodpecker cobram",[126,453,454,460,466,472],{},[83,455,456,459],{},[15,457,458],{},"Comunidade menor."," Quando você bate em um bug obscuro, o Stack Overflow tem cinco respostas, não cinquenta. Github issues são sua principal fonte.",[83,461,462,465],{},[15,463,464],{},"Operação não trivial em escala."," Um servidor + um runner é fácil. Cinco runners autoescalando atrás de uma fila é tooling que você monta — auto-scaling não é built-in.",[83,467,468,471],{},[15,469,470],{},"Drone Cloud é pago."," Se você quer SaaS, vai pra Harness; o tier grátis é limitado. Por isso a recomendação é sempre self-hosted.",[83,473,474,477],{},[15,475,476],{},"Documentação modesta."," Cobre o caminho feliz; casos de borda você descobre lendo código.",[121,479,481],{"id":480},"por-que-woodpecker-em-vez-de-drone-em-2026","Por que Woodpecker em vez de Drone em 2026",[11,483,484],{},"Drone vanilla ainda funciona, mas a Harness tem priorizado a versão cloud comercial. Woodpecker é o fork comunitário do Drone original — 100% open-source, sem versão paga puxando features, releases mensais ativas, comunidade engajada. API e YAML compatíveis com Drone, então migração é trivial: troca a URL do servidor.",[11,486,487,488,491],{},"Pra qualquer time pequeno auto-hospedando em 2026, ",[15,489,490],{},"Woodpecker é a escolha melhor que Drone vanilla",". Mesma arquitetura, sem o overhead de uma empresa controlando o roadmap.",[23,493,495],{"id":494},"qual-mais-barato-em-2026","Qual mais barato em 2026?",[11,497,498],{},"Custo total mensal real, considerando time de cinco devs com volume médio (300 builds\u002Fmês, builds de 8 minutos médios em Linux):",[166,500,501,517],{},[169,502,503],{},[172,504,505,508,511,514],{},[175,506,507],{},"Opção",[175,509,510],{},"Custo fixo",[175,512,513],{},"Custo variável",[175,515,516],{},"Total estimado\u002Fmês",[182,518,519,534,547,561,575,589,603],{},[172,520,521,524,527,530],{},[187,522,523],{},"Woodpecker self-hosted (VPS R$80)",[187,525,526],{},"R$80",[187,528,529],{},"R$0",[187,531,532],{},[15,533,526],{},[172,535,536,539,541,543],{},[187,537,538],{},"Actions repos públicos (open-source)",[187,540,529],{},[187,542,529],{},[187,544,545],{},[15,546,529],{},[172,548,549,552,554,557],{},[187,550,551],{},"Actions repos privados (free tier 2000 min)",[187,553,529],{},[187,555,556],{},"R$0 a R$50",[187,558,559],{},[15,560,556],{},[172,562,563,566,568,571],{},[187,564,565],{},"Actions Linux pago (volume médio)",[187,567,529],{},[187,569,570],{},"R$50 a R$150",[187,572,573],{},[15,574,570],{},[172,576,577,580,583,585],{},[187,578,579],{},"GitLab CI self-hosted (VPS R$200)",[187,581,582],{},"R$200",[187,584,529],{},[187,586,587],{},[15,588,582],{},[172,590,591,594,596,599],{},[187,592,593],{},"Actions com builds macOS pesados",[187,595,529],{},[187,597,598],{},"R$300 a R$1.500",[187,600,601],{},[15,602,598],{},[172,604,605,608,611,614],{},[187,606,607],{},"GitLab CI SaaS Premium (5 devs)",[187,609,610],{},"R$725",[187,612,613],{},"R$0 a R$200",[187,615,616],{},[15,617,618],{},"R$725 a R$925",[11,620,621,622,625],{},"Vencedor absoluto em custo: ",[15,623,624],{},"Woodpecker self-hosted"," pra time disposto a operar uma VPS. Custa o mesmo que um almoço por mês e roda CI pra dez projetos sem sentir.",[11,627,628],{},"Se ops não está disponível, Actions plano gratuito é a próxima opção. Ele cabe num time pequeno com workflows leves; quando passa de US$30\u002Fmês variável, vale a pena pelo menos avaliar runners self-hosted.",[23,630,632],{"id":631},"qual-tem-melhor-experiencia-de-desenvolvedor","Qual tem melhor experiência de desenvolvedor?",[11,634,635],{},"DX em CI\u002FCD se mede em três dimensões: tempo do \"yml em branco\" até o \"primeiro build passando\", capacidade de debug quando dá errado, e capacidade de evoluir o workflow quando ele cresce.",[166,637,638,648],{},[169,639,640],{},[172,641,642,645],{},[175,643,644],{},"Dimensão",[175,646,647],{},"Vencedor",[182,649,650,658,666,674,682,690],{},[172,651,652,655],{},[187,653,654],{},"Templates prontos \u002F acessibilidade",[187,656,657],{},"GitHub Actions (marketplace + onboarding)",[172,659,660,663],{},[187,661,662],{},"Workflows complexos \u002F DAG \u002F monorepo",[187,664,665],{},"GitLab CI (parent-child + needs nativo)",[172,667,668,671],{},[187,669,670],{},"Reprodução local \u002F simplicidade conceitual",[187,672,673],{},"Drone\u002FWoodpecker (cada step = container)",[172,675,676,679],{},[187,677,678],{},"Debug de falha intermitente",[187,680,681],{},"Drone\u002FWoodpecker (re-rodar step isolado é trivial)",[172,683,684,687],{},[187,685,686],{},"Composição entre projetos",[187,688,689],{},"GitHub Actions (reusable workflows + composite actions)",[172,691,692,695],{},[187,693,694],{},"Time-to-first-pipeline (zero pra hello world)",[187,696,49],{},[11,698,699],{},"Não há vencedor absoluto. Pra time que valoriza começar rápido, Actions. Pra time que tem workflow complexo desde o dia um (monorepo, várias linguagens), GitLab CI. Pra time que quer entender exatamente o que está acontecendo, Drone\u002FWoodpecker.",[11,701,68],{},[23,703,705],{"id":704},"tabela-comparativa-12-criterios-honestos","Tabela comparativa: 12 critérios honestos",[166,707,708,721],{},[169,709,710],{},[172,711,712,715,717,719],{},[175,713,714],{},"Critério",[175,716,49],{},[175,718,55],{},[175,720,61],{},[182,722,723,736,750,764,778,792,806,820,834,848,862,876],{},[172,724,725,728,731,734],{},[187,726,727],{},"Custo mensal startup BR (5 devs, volume médio)",[187,729,730],{},"R$0 a R$150",[187,732,733],{},"R$80 a R$925",[187,735,526],{},[172,737,738,741,744,747],{},[187,739,740],{},"Free tier real (2026)",[187,742,743],{},"2000 min\u002Fmês privados, ilimitado público",[187,745,746],{},"400 min\u002Fmês SaaS",[187,748,749],{},"Ilimitado self-hosted",[172,751,752,755,758,761],{},[187,753,754],{},"Self-hosted disponível",[187,756,757],{},"Sim (runners), SaaS UI",[187,759,760],{},"Sim (CE completa)",[187,762,763],{},"Sim (é a única forma sensata)",[172,765,766,769,772,775],{},[187,767,768],{},"Complexidade de workflow grande",[187,770,771],{},"Boa (reusable workflows)",[187,773,774],{},"Excelente (DAG + parent-child)",[187,776,777],{},"Modesta (linear + matrix)",[172,779,780,783,786,789],{},[187,781,782],{},"Suporte a monorepo",[187,784,785],{},"Médio (paths filter)",[187,787,788],{},"Excelente (rules + parent-child)",[187,790,791],{},"Médio (when filter)",[172,793,794,797,800,803],{},[187,795,796],{},"Registro de containers integrado",[187,798,799],{},"Não (precisa GHCR à parte)",[187,801,802],{},"Sim, nativo",[187,804,805],{},"Não (use registro externo)",[172,807,808,811,814,817],{},[187,809,810],{},"Gestão de segredos",[187,812,813],{},"Repo + org + environment",[187,815,816],{},"Project + group + instance",[187,818,819],{},"Server + repo",[172,821,822,825,828,831],{},[187,823,824],{},"Jobs paralelos out-of-box",[187,826,827],{},"Sim (matrix)",[187,829,830],{},"Sim (parallel + DAG)",[187,832,833],{},"Sim (depends_on)",[172,835,836,839,842,845],{},[187,837,838],{},"Comunidade BR \u002F material em português",[187,840,841],{},"Grande",[187,843,844],{},"Médio",[187,846,847],{},"Pequeno",[172,849,850,853,856,859],{},[187,851,852],{},"Documentação em PT-BR",[187,854,855],{},"Parcial (oficial em inglês)",[187,857,858],{},"Parcial",[187,860,861],{},"Praticamente zero",[172,863,864,867,870,873],{},[187,865,866],{},"Integração com GitHub\u002FGitLab\u002FGitea",[187,868,869],{},"Só GitHub",[187,871,872],{},"Só GitLab (mirror externo é workaround)",[187,874,875],{},"Todos os três + Bitbucket",[172,877,878,881,884,887],{},[187,879,880],{},"Faixa ideal de uso",[187,882,883],{},"1 a 50 devs no GitHub",[187,885,886],{},"5 a 500 devs em uma plataforma só",[187,888,889],{},"1 a 30 devs com ops disponível",[11,891,892],{},"Nenhum competidor tem coluna sem ressalva. A ferramenta certa depende do perfil do time.",[23,894,896],{"id":895},"decisao-por-perfil-de-time","Decisão por perfil de time",[11,898,899],{},"Quatro recomendações concretas, sem \"depende\".",[121,901,903],{"id":902},"indie-hacker-ou-repo-publico-no-github","Indie hacker ou repo público no GitHub",[11,905,906,909],{},[15,907,908],{},"Use GitHub Actions plano gratuito."," Repos públicos têm minutos ilimitados. Você não tem motivo pra procurar alternativa. Se daqui a um ano o projeto crescer, você reavalia.",[121,911,913],{"id":912},"startup-early-no-github-repos-privados-r10k-a-r50k-mrr","Startup early no GitHub, repos privados, R$10k a R$50k MRR",[11,915,916,919],{},[15,917,918],{},"Continue no Actions plano gratuito."," O free tier de 2000 minutos cabe em um time de dois a três devs com workflows razoáveis. Quando começar a passar disso, primeiro reduza desperdício (paths filter pra não rodar tudo em todo PR, cache de dependências decente) antes de migrar.",[11,921,922],{},"Se passar consistentemente de US$30\u002Fmês variável, considere migrar pra runners self-hosted ou Woodpecker em paralelo.",[121,924,926],{"id":925},"startup-com-r50k-a-r200k-mrr-no-github-volume-ci-alto","Startup com R$50k a R$200k MRR no GitHub, volume CI alto",[11,928,929,932],{},[15,930,931],{},"Híbrido."," Use Actions pra workflows leves (lint, testes unitários) e self-hosted runners (via ARC) ou Woodpecker pra workflows pesados (E2E, builds longos, deploys). Você paga por minuto onde compensa e zero onde dói.",[11,934,935],{},"Pra times com builds macOS regulares, considere uma máquina Mac mini dedicada como self-hosted runner. Investimento de R$10 mil paga em três meses se você gasta US$200\u002Fmês em macOS Actions hoje.",[121,937,939],{"id":938},"empresa-br-no-gitlab-self-hosted","Empresa BR no GitLab self-hosted",[11,941,942,945],{},[15,943,944],{},"Use GitLab CI nativo."," Você já está pagando o custo de operar GitLab; CI vem junto sem custo adicional. Migrar pra outra ferramenta significaria operar dois sistemas em paralelo — não vale.",[121,947,949],{"id":948},"time-pequeno-controlando-custo-agressivamente","Time pequeno controlando custo agressivamente",[11,951,952,955],{},[15,953,954],{},"Woodpecker self-hosted em VPS R$80."," Roda CI pra dez projetos sem suar. Custa em ops 1 a 2 horas\u002Fmês. Se o time tem alguém com afinidade por ferramentas Unix, é a opção mais econômica e mais previsível em conta — você sabe exatamente o custo todo mês.",[23,957,959],{"id":958},"onde-heroctl-entra-como-infraestrutura-pra-runners","Onde HeroCtl entra como infraestrutura pra runners",[11,961,962],{},"Self-hosted CI\u002FCD é exatamente o tipo de carga de trabalho que o HeroCtl orquestra bem: serviços longos (servidor de CI, banco que mantém histórico de builds), serviços que escalam horizontalmente (runners que sobem e descem com a fila), serviços com necessidade de persistência (cache de artefatos).",[11,964,965],{},"Em vez de operar Docker Compose num servidor único — single point of failure — você descreve o setup como uma configuração de jobs:",[126,967,968,974,980,986],{},[83,969,970,973],{},[15,971,972],{},"Servidor de Drone\u002FWoodpecker como job longo",", com replica única e volume persistente pro banco de histórico.",[83,975,976,979],{},[15,977,978],{},"N runners como job replicável",", escalando horizontalmente. O orquestrador distribui os runners entre nós; se um servidor morre, os runners migram pros outros.",[83,981,982,985],{},[15,983,984],{},"Backup integrado"," pro estado do CI (banco do servidor + cache de artefatos), sem montar tooling externo.",[83,987,988,991],{},[15,989,990],{},"Métricas e logs integrados"," — você vê uso de CPU, memória, tempo de build sem subir um stack de observabilidade separado.",[11,993,994,995,998,999,1002],{},"A diferença prática: em vez de operar um stack de CI em paralelo ao seu cluster de produção, ele vira parte do mesmo cluster, com as mesmas garantias de alta disponibilidade. Se um servidor cai, os runners migram. Se você quer dobrar capacidade pra uma sprint pesada, é mudar ",[96,996,997],{},"replicas: 4"," pra ",[96,1000,1001],{},"replicas: 8"," no arquivo de configuração.",[11,1004,1005],{},"Pra quem está na fronteira \"começo simples mas vou crescer\", isso resolve a transição sem precisar trocar de ferramenta no meio do caminho.",[23,1007,1009],{"id":1008},"os-4-erros-caros-em-cicd-self-hosted-e-como-evita-los","Os 4 erros caros em CI\u002FCD self-hosted (e como evitá-los)",[121,1011,1013],{"id":1012},"erro-1-cache-stale-silencioso","Erro 1: cache stale silencioso",[11,1015,1016],{},"O sintoma: build passa local, falha no CI por causa de uma dependência que existe na máquina do dev mas não na imagem fresca. Pior caso: passa no CI também porque cache anterior contém a dependência, mas falha em produção quando a imagem é construída sem cache.",[11,1018,1019,1020,33,1023,33,1026,33,1029,1032],{},"A correção: cache decente assume que pode ser invalidado a qualquer momento. Sempre que mudar arquivos de manifesto de dependências (",[96,1021,1022],{},"package.json",[96,1024,1025],{},"go.mod",[96,1027,1028],{},"requirements.txt",[96,1030,1031],{},"Cargo.toml","), incluí-los na chave de cache. Periodicamente (semanal), forçar build sem cache pra detectar drift.",[121,1034,1036],{"id":1035},"erro-2-secret-commitado-por-acidente","Erro 2: secret commitado por acidente",[11,1038,1039],{},"O sintoma: alguém colou um token na configuração de CI \"só pra testar\", commitou, esqueceu. O repo é público; em 12 horas o token está em uso por quem não devia.",[11,1041,1042,1043,1046,1047,1050],{},"A correção: dois mecanismos em camadas. ",[15,1044,1045],{},"Pre-commit hook"," que escaneia padrões de chaves comuns (AWS, Stripe, GitHub PAT). ",[15,1048,1049],{},"Rotação automática"," de tokens críticos (90 dias máximo). Se um token vazar, a janela de exposição é finita.",[11,1052,1053],{},"Em GitLab CI, use variables com flag \"masked\" e \"protected\". Em Actions, use environment-scoped secrets com approval rules. Em Drone\u002FWoodpecker, segredos são escopados por repo e nunca aparecem em logs por padrão.",[121,1055,1057],{"id":1056},"erro-3-runner-rodando-no-mesmo-servidor-de-producao","Erro 3: runner rodando no mesmo servidor de produção",[11,1059,1060],{},"O sintoma: build pesado consome CPU\u002FRAM, produção fica lenta, latência sobe, alarme dispara, on-call acorda. Caso real comum em times pequenos que tentam economizar máquina.",[11,1062,1063],{},"A correção: runners em servidor separado de produção, sempre. Se o orçamento aperta, runner em VPS de R$30\u002Fmês ainda é mais barato do que um incidente de produção em horário comercial.",[121,1065,1067],{"id":1066},"erro-4-workflow-que-nao-roda-fora-do-ci","Erro 4: workflow que não roda fora do CI",[11,1069,1070],{},"O sintoma: o build do CI é um script de 200 linhas inline no YAML, com 15 variáveis de ambiente que o sistema injeta. Quando algo dá errado, ninguém consegue reproduzir local sem fazer engenharia reversa do YAML.",[11,1072,1073,1074,33,1077,1080,1081,1084,1085,1088],{},"A correção: o CI deve chamar comandos que existem como ",[96,1075,1076],{},"Makefile",[96,1078,1079],{},"script\u002Fbuild",", ou ",[96,1082,1083],{},"package.json scripts",". O YAML do CI orquestra; a lógica vive em scripts versionados que rodam em qualquer terminal. Se você não consegue rodar ",[96,1086,1087],{},"make ci"," localmente e ver o mesmo resultado, o seu CI não é portável.",[11,1090,1091],{},"Drone\u002FWoodpecker força essa disciplina por design (cada step é um container). Actions e GitLab CI permitem o anti-padrão; cabe ao time evitar.",[23,1093,1095],{"id":1094},"perguntas-frequentes","Perguntas frequentes",[11,1097,1098],{},[15,1099,1100],{},"GitHub Actions é mais rápido que Drone?",[11,1102,1103],{},"Em build cru, depende do runner: o pool gerenciado do Actions usa máquinas de 2 vCPU; um runner self-hosted em uma máquina de 4 vCPU é mais rápido. Em tempo total de pipeline (incluindo fila), Actions ganha quando há volume — eles têm capacidade ociosa enorme. Self-hosted (qualquer ferramenta) tem fila proporcional ao número de runners que você provisiona.",[11,1105,1106],{},[15,1107,1108],{},"Posso usar GitLab CI com repo no GitHub?",[11,1110,1111],{},"Tecnicamente sim, via \"pull mirror\" (GitLab espelha o GitHub e roda CI nele). Na prática é frágil: webhooks atrasam, status checks não voltam pro GitHub do jeito que o time espera, MRs ficam confusos. Não vale a pena. Se você está no GitHub, use Actions ou Drone\u002FWoodpecker (que aceitam GitHub como fonte nativa).",[11,1113,1114],{},[15,1115,1116],{},"Self-hosted runners do GitHub Actions valem a pena?",[11,1118,1119],{},"Pra repos privados com volume alto (mais de 5000 minutos\u002Fmês), sim. Você economiza minutos pagos em troca de operar máquinas. Pra repos públicos, não — risco de segurança (forks maliciosos rodando código na sua máquina) supera benefício. ARC (Actions Runner Controller) ajuda em escala, mas adiciona uma camada de Kubernetes; só faz sentido pra times que já operam K8s.",[11,1121,1122],{},[15,1123,1124],{},"Woodpecker é estável o suficiente em 2026?",[11,1126,1127],{},"Sim. Releases mensais, base de código sólida (forkado de Drone, que tinha cinco anos de produção), comunidade ativa. Em produção em centenas de empresas pequenas e médias. Não é a aposta segura \"ninguém é demitido por escolher\" — essa é Actions ou GitLab — mas em três anos de fork não houve incidente comunitário grave. Pra time pequeno self-hosted, é a escolha sensata.",[11,1129,1130],{},[15,1131,1132],{},"ArgoCD e FluxCD entram nessa decisão?",[11,1134,1135],{},"Não diretamente. ArgoCD\u002FFluxCD são ferramentas de GitOps pra Kubernetes, não CI. Eles assistem um repo Git e aplicam mudanças em cluster. CI continua sendo Actions\u002FGitLab\u002FDrone gerando imagens; ArgoCD\u002FFlux aplicam o deploy. Se você não está em Kubernetes, ArgoCD\u002FFlux não são pra você. Times em outros orquestradores fazem deploy direto do CI ou via APIs do orquestrador.",[11,1137,1138],{},[15,1139,1140],{},"Quantos runners simultâneos pra time de 5 devs?",[11,1142,1143],{},"Regra prática: um runner por dois desenvolvedores ativos, mais um runner extra pra builds longos não bloquear PRs rápidos. Time de cinco devs: três runners é confortável. Em horários de pico (release day), suba pra cinco temporariamente. Cada runner consome 1 a 2 GB de RAM em workload típica; um servidor de 8 GB roda quatro runners sem dor.",[11,1145,1146],{},[15,1147,1148],{},"Cache de dependências — qual ferramenta lida melhor?",[11,1150,1151,1152,1155],{},"GitLab CI tem cache nativo por chave\u002Fpath, integrado ao registro próprio. GitHub Actions tem ",[96,1153,1154],{},"actions\u002Fcache"," (gratuito, 10 GB por repo). Drone\u002FWoodpecker dependem de plugin de cache externo (S3, MinIO local) — mais setup mas mais flexível. Em volume moderado, todos resolvem; em volume alto (monorepo grande), GitLab tem vantagem por integração com o registro.",[11,1157,1158],{},[15,1159,1160],{},"Migrar de GitHub Actions pra Drone — quanto trabalho?",[11,1162,1163],{},"Pra workflows simples (build + teste + push), 1 a 2 dias. Pra workflows que dependem de muitas ações do marketplace, 1 a 2 semanas (precisa reescrever cada ação como container). A maior dor é segredos e ambientes — exporte e reimporte com cuidado. Recomendação: faça migração projeto a projeto, não tudo de uma vez.",[11,1165,1166],{},[15,1167,1168],{},"Posso rodar runners de Actions e Drone\u002FWoodpecker no mesmo servidor?",[11,1170,1171],{},"Tecnicamente sim, ambos são containers. Na prática, isolamento melhora: runners em servidores separados evitam que um build pesado afete o outro. Se o orçamento é apertado, dois servidores de R$40\u002Fmês são melhores que um de R$80\u002Fmês com tudo junto.",[11,1173,68],{},[23,1175,1177],{"id":1176},"em-resumo","Em resumo",[11,1179,1180],{},"CI\u002FCD em 2026 não tem ferramenta vencedora. Tem perfis de uso e tradeoffs honestos:",[126,1182,1183,1189,1195,1201,1207],{},[83,1184,1185,1188],{},[15,1186,1187],{},"Você está no GitHub e o volume é leve a médio?"," Actions, plano gratuito. Não procure problema onde não tem.",[83,1190,1191,1194],{},[15,1192,1193],{},"Você está no GitLab self-hosted?"," GitLab CI nativo. Já está pago.",[83,1196,1197,1200],{},[15,1198,1199],{},"Você quer custo previsível e tem 1-2h\u002Fmês de ops disponível?"," Woodpecker self-hosted em VPS R$80. A escolha mais econômica.",[83,1202,1203,1206],{},[15,1204,1205],{},"Você tem monorepo grande com workflow complexo?"," GitLab CI (DAG nativo) ou Actions com reusable workflows.",[83,1208,1209,1212],{},[15,1210,1211],{},"Você tem volume alto e dor de pricing de minutos?"," Híbrido: Actions pra workflows leves, runners self-hosted pra pesados.",[11,1214,1215],{},"Se você está pensando em rodar a ferramenta de CI como parte do mesmo cluster que serve produção — com alta disponibilidade real, métricas integradas e backup sem montar stack à parte — instale o HeroCtl em um servidor:",[1217,1218,1223],"pre",{"className":1219,"code":1221,"language":1222},[1220],"language-text","curl -sSL https:\u002F\u002Fget.heroctl.com\u002Finstall.sh | sh\n","text",[96,1224,1221],{"__ignoreMap":1225},"",[11,1227,1228],{},"A partir daí, descrever um servidor de Woodpecker com três runners auto-escaláveis é um arquivo de configuração de cinquenta linhas. O cluster cuida do resto: distribui os runners pelos nós, mantém o servidor disponível mesmo com perda de máquina, faz backup do estado, expõe métricas no painel embutido.",[11,1230,1231,1232,1237,1238,1242],{},"Pra quem quer mais contexto, vale ler também ",[1233,1234,1236],"a",{"href":1235},"\u002Fblog\u002Fdeploy-docker-producao-do-compose-ao-cluster","Deploy Docker em produção: do compose ao cluster"," — discute quando faz sentido sair de docker-compose pra um plano de controle replicado, com os mesmos critérios honestos deste post. E pra times pensando em simplificar a stack de orquestração inteira, ",[1233,1239,1241],{"href":1240},"\u002Fblog\u002Fmigrar-de-kubernetes-pra-stack-mais-simples-case","Migrar de Kubernetes pra uma stack mais simples — case real"," tem números de uma migração real, com ganhos e dores.",[11,1244,1245,1246,1249],{},"A escolha de CI\u002FCD é uma das decisões mais duradouras do time. Vale alguns dias de comparação honesta antes de copiar o ",[96,1247,1248],{},".github\u002Fworkflows\u002F"," do projeto anterior — porque três anos depois, migrar custa caro.",{"title":1225,"searchDepth":1251,"depth":1251,"links":1252},2,[1253,1254,1255,1261,1265,1270,1271,1272,1273,1280,1281,1287,1288],{"id":25,"depth":1251,"text":26},{"id":71,"depth":1251,"text":72},{"id":111,"depth":1251,"text":112,"children":1256},[1257,1259,1260],{"id":123,"depth":1258,"text":124},3,{"id":160,"depth":1258,"text":161},{"id":228,"depth":1258,"text":229},{"id":261,"depth":1251,"text":262,"children":1262},[1263,1264],{"id":268,"depth":1258,"text":269},{"id":308,"depth":1258,"text":309},{"id":395,"depth":1251,"text":396,"children":1266},[1267,1268,1269],{"id":402,"depth":1258,"text":403},{"id":450,"depth":1258,"text":451},{"id":480,"depth":1258,"text":481},{"id":494,"depth":1251,"text":495},{"id":631,"depth":1251,"text":632},{"id":704,"depth":1251,"text":705},{"id":895,"depth":1251,"text":896,"children":1274},[1275,1276,1277,1278,1279],{"id":902,"depth":1258,"text":903},{"id":912,"depth":1258,"text":913},{"id":925,"depth":1258,"text":926},{"id":938,"depth":1258,"text":939},{"id":948,"depth":1258,"text":949},{"id":958,"depth":1251,"text":959},{"id":1008,"depth":1251,"text":1009,"children":1282},[1283,1284,1285,1286],{"id":1012,"depth":1258,"text":1013},{"id":1035,"depth":1258,"text":1036},{"id":1056,"depth":1258,"text":1057},{"id":1066,"depth":1258,"text":1067},{"id":1094,"depth":1251,"text":1095},{"id":1176,"depth":1251,"text":1177},"comparativo",null,"2026-05-15","GitHub Actions venceu mindshare mas tem custos de minutos. GitLab CI é mais completo mas pesa mais. Drone (e Woodpecker) auto-hospedado roda em VPS pequeno. Comparação prática.",false,"md",{},true,"\u002Fblog\u002Fgithub-actions-vs-gitlab-ci-vs-drone-self-hosted","14 min",{"title":5,"description":1292},{"loc":1297},"blog\u002Fgithub-actions-vs-gitlab-ci-vs-drone-self-hosted",[1303,1304,1305,1306,1289],"github-actions","gitlab-ci","drone","ci-cd","6HE70abQMrpxYtjVIHfg4cJABlHozxJVxg5Q13QBw0M",[1309,1316],{"title":1310,"path":1311,"stem":1312,"description":1313,"date":1314,"category":1315,"children":-1},"Deploy zero-downtime sem Kubernetes: tutorial prático em 2026","\u002Fblog\u002Fdeploy-zero-downtime-sem-kubernetes-tutorial","blog\u002Fdeploy-zero-downtime-sem-kubernetes-tutorial","Você não precisa de Kubernetes pra ter deploy sem downtime. Tutorial completo com 2 servidores, Caddy\u002FTraefik na frente, e rolling update via script ou orquestrador leve.","2026-06-09","engenharia",{"title":1317,"path":1318,"stem":1319,"description":1320,"date":1321,"category":1289,"children":-1},"HeroCtl vs Coolify: quando o painel de um servidor não basta","\u002Fblog\u002Fheroctl-vs-coolify","blog\u002Fheroctl-vs-coolify","Coolify resolve solo dev brilhantemente. Quando o cliente pede SLA e o servidor único vira ponto único de falha, a história muda. Comparativo honesto.","2026-01-13",{"path":1323},"\u002Fen\u002Fblog\u002Fgithub-actions-vs-gitlab-ci-vs-drone",1777362205849]