{"id":155,"date":"2019-12-05T16:19:00","date_gmt":"2019-12-05T19:19:00","guid":{"rendered":"https:\/\/www.linuxpro.com.br\/2019\/12\/devops-ci-cd\/"},"modified":"2026-09-08T10:05:34","modified_gmt":"2026-09-08T13:05:34","slug":"devops-ci-cd","status":"publish","type":"post","link":"https:\/\/www.linuxpro.com.br\/es\/2019\/12\/devops-ci-cd\/","title":{"rendered":"DevOps, o que \u00e9 CI\/CD ?"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" alt=\"Mascote do LinuxPro empurrando uma etapa na esteira infinita de integra\u00e7\u00e3o e entrega cont\u00ednua\" src=\"\/wp-content\/uploads\/2026\/09\/devops-cicd-v3.webp\" width=\"1486\" height=\"856\" \/><\/p>\n<div style=\"background:#fff8e1;border-left:4px solid #8b1a1a;padding:.8em 1em;margin:1em 0\"><strong>Nota (2026):<\/strong> Texto original de dezembro de 2019 \u2014 gloss\u00e1rio de CI\/CD ainda no vocabul\u00e1rio Jenkins\/Red Hat, com a nota \u201cvai ser melhorado em breve\u201d. Sete anos depois o YAML no Git virou o default (GitHub Actions, GitLab CI, Forgejo), o CD em Kubernetes virou GitOps (Argo CD \/ Flux), e o pr\u00f3prio pipeline passou a ser alvo de supply chain. Conceito n\u00e3o mudou; a ferramenta e a amea\u00e7a, sim.<\/div>\n<p>CI\/CD n\u00e3o \u00e9 produto. \u00c9 o h\u00e1bito de <strong>integrar, testar e soltar software em ciclo curto<\/strong>, com o m\u00e1ximo de passo autom\u00e1tico. O \u201cmerge day\u201d de 2019 continua sendo o anti-padr\u00e3o. O que mudou \u00e9 onde o YAML mora, quem roda o job e o que acontece <em>depois<\/em> do verde no pipeline.<\/p>\n<p><!-- more --><\/p>\n<h2>CI, entrega e implanta\u00e7\u00e3o \u2014 os tr\u00eas CDs<\/h2>\n<p><strong>CI (integra\u00e7\u00e3o cont\u00ednua):<\/strong> cada push\/MR vira build + teste autom\u00e1tico no tronco compartilhado. O conflito aparece hoje, n\u00e3o na sexta da release.<\/p>\n<p><strong>Entrega cont\u00ednua:<\/strong> o artefato aprovado (bin\u00e1rio, imagem OCI, pacote) vai sozinho para um registro. Produ\u00e7\u00e3o ainda tem um humano no bot\u00e3o \u2014 ou um crit\u00e9rio (tag, aprova\u00e7\u00e3o, janela).<\/p>\n<p><strong>Implanta\u00e7\u00e3o cont\u00ednua:<\/strong> o mesmo artefato sobe sozinho para produ\u00e7\u00e3o se o teste passou. Feedback do usu\u00e1rio em minutos. Exige teste que voc\u00ea realmente confia, n\u00e3o um job verde oco.<\/p>\n<p>N\u00e3o vale brigar pelo acr\u00f4nimo. Vale desenhar o pipeline: o que \u00e9 autom\u00e1tico, o que \u00e9 porta, o que \u00e9 rollback.<\/p>\n<pre><code class=\"language-text\">commit \u2192 CI (lint, test, build)\n       \u2192 artefato no registry (entrega)\n       \u2192 staging\n       \u2192 produ\u00e7\u00e3o (implanta\u00e7\u00e3o: bot\u00e3o ou autom\u00e1tica)\n       \u2192 observa\u00e7\u00e3o (m\u00e9trica, log, alerta)\n<\/code><\/pre>\n<h2>O pipeline em 2026: YAML no Git<\/h2>\n<p>Jenkins com plugin ainda existe em legado. O ponto de partida no Linux hoje \u00e9 um arquivo no reposit\u00f3rio, runner em container, artefato em registry.<\/p>\n<p><strong>GitHub Actions<\/strong> \u2014 o default de quem j\u00e1 est\u00e1 no GitHub. Pin de action por SHA, n\u00e3o por tag flutuante: o CI virou vetor (compromisso de actions populares em 2025\u20132026).<\/p>\n<pre><code class=\"language-yaml\"># .github\/workflows\/ci.yml\nname: ci\non:\n  pull_request:\n  push:\n    branches: [main]\njobs:\n  test:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\/checkout@v4\n      - run: make test\n<\/code><\/pre>\n<p><strong>GitLab CI<\/strong> \u2014 o que o post irm\u00e3o de 2019 j\u00e1 apontava para Terraform. Um <code>.gitlab-ci.yml<\/code>, runners pr\u00f3prios se quiser soberania:<\/p>\n<pre><code class=\"language-yaml\"># .gitlab-ci.yml\nstages: [test, image]\ntest:\n  stage: test\n  image: golang:1.24\n  script: [go test .\/...]\nimage:\n  stage: image\n  image: docker:27\n  services: [docker:27-dind]\n  script:\n    - docker build -t registry.example.com\/app:$CI_COMMIT_SHA .\n    - docker push registry.example.com\/app:$CI_COMMIT_SHA\n  rules:\n    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\n<\/code><\/pre>\n<p><strong>Forgejo Actions \/ Gitea<\/strong> \u2014 o mesmo YAML do Actions, self-hosted, sem mandar o c\u00f3digo para a nuvem alheia. Woodpecker \u00e9 o outro bin\u00e1rio leve. No homelab Linux isso compete com GitLab CE.<\/p>\n<p>O <a href=\"\/2017\/08\/curso-de-docker-gratis\/\">curso de Docker<\/a> continua sendo o pr\u00e9-requisito: o job moderno <em>\u00e9<\/em> um container. Infra como c\u00f3digo no mesmo esp\u00edrito: <a href=\"\/2026\/09\/automatizando-servidores-linux-com-ansible\/\">Ansible<\/a> e o pipeline de <a href=\"\/2019\/12\/terraform-pipelines-in-gitlab\/\">Terraform no GitLab<\/a>.<\/p>\n<h2>CD virou GitOps<\/h2>\n<p>Implantar no Kubernetes em 2026 raramente \u00e9 <code>kubectl apply<\/code> no job de CI. O CI constr\u00f3i a imagem, assina, empurra o registry e <em>atualiza o Git<\/em> (tag, digest). O cluster puxa o estado desejado:<\/p>\n<ul>\n<li><strong>Argo CD<\/strong> \u2014 app-of-apps, drift detection, sync a partir do Git. 3.5 (2026) adiciona mTLS interno e verifica\u00e7\u00e3o de assinatura de commit.<\/li>\n<li><strong>Flux<\/strong> \u2014 o outro padr\u00e3o CNCF, controllers no cluster.<\/li>\n<\/ul>\n<p>O Git passa a ser a fonte da verdade. O runner deixa de ter credencial de produ\u00e7\u00e3o eterna: OIDC para a nuvem, short-lived token, admission no cluster checando Cosign\/SLSA antes do pod subir. Quem ainda faz <code>docker compose up<\/code> num VPS (como no <a href=\"\/2026\/09\/vaultwarden-bitwarden-self-hosted\/\">Vaultwarden<\/a>) est\u00e1 no degrau da entrega cont\u00ednua com SSH \u2014 v\u00e1lido, s\u00f3 n\u00e3o \u00e9 GitOps.<\/p>\n<h2>O pipeline como alvo<\/h2>\n<p>Em 2019 o medo era merge quebrado. Em 2026 o medo \u00e9 o job que <em>passa<\/em> e publica malware. Actions comprometidas, pacote npm sequestrado, secret no log.<\/p>\n<ul>\n<li>Pin de action\/container por digest, n\u00e3o <code>@v3<\/code> solto.<\/li>\n<li>Secrets no cofre (GitHub\/GitLab, Vault, SOPS) \u2014 nunca no YAML.<\/li>\n<li>SBOM + <strong>Cosign<\/strong> (Sigstore, OIDC keyless) na imagem.<\/li>\n<li>Provenance <strong>SLSA<\/strong> Build L2\/L3 quando o builder \u00e9 a plataforma, n\u00e3o um script no repo.<\/li>\n<li>PR de fork: n\u00e3o rode o workflow do branch do atacante com secret da org (<code>pull_request_target<\/code> mal usado).<\/li>\n<\/ul>\n<p>Depois do deploy: o <a href=\"\/2026\/09\/monitorando-servidores-linux-com-prometheus\/\">Prometheus<\/a> diz se o verde mentiu.<\/p>\n<h2>Por onde come\u00e7ar de verdade<\/h2>\n<ol>\n<li>Tronco compartilhado, PR pequeno, CI no PR (lint + teste). Sem isso o resto \u00e9 teatro.<\/li>\n<li>Imagem OCI versionada por SHA, registry pr\u00f3prio ou GHCR\/GitLab.<\/li>\n<li>Staging autom\u00e1tico; produ\u00e7\u00e3o com porta (tag ou aprova\u00e7\u00e3o) at\u00e9 o teste merecer implanta\u00e7\u00e3o cont\u00ednua.<\/li>\n<li>S\u00f3 ent\u00e3o GitOps, assinatura, SLSA.<\/li>\n<\/ol>\n<p>Muita empresa para no 2 e chama de DevOps. N\u00e3o \u00e9 pecado. \u00c9 honesto. Pular para Argo sem teste \u00e9 pintar o avi\u00e3o.<\/p>\n<h2>Uma volta visual<\/h2>\n<div style=\"position:relative;padding-bottom:56.25%;height:0;overflow:hidden;margin:1.5em 0\">\n<iframe src=\"https:\/\/www.youtube.com\/embed\/AZtTd3pFVTY\" title=\"Pipeline CI\/CD\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen style=\"position:absolute;top:0;left:0;width:100%;height:100%;border:0\"><\/iframe>\n<\/div>\n<h2>Refer\u00eancias<\/h2>\n<ul>\n<li><a href=\"\/2019\/12\/terraform-pipelines-in-gitlab\/\">Pipelines Terraform no GitLab<\/a> \u2014 o CD de infra no mesmo ano deste post<\/li>\n<li><a href=\"\/2017\/08\/curso-de-docker-gratis\/\">Curso de Docker gr\u00e1tis<\/a><\/li>\n<li><a href=\"\/2026\/09\/automatizando-servidores-linux-com-ansible\/\">Automatizando servidores Linux com Ansible<\/a><\/li>\n<li><a href=\"\/2026\/09\/monitorando-servidores-linux-com-prometheus\/\">Prometheus e Node Exporter<\/a><\/li>\n<li><a href=\"https:\/\/docs.gitlab.com\/ee\/ci\/\">GitLab CI\/CD docs<\/a><\/li>\n<li><a href=\"https:\/\/docs.github.com\/en\/actions\">GitHub Actions docs<\/a><\/li>\n<li><a href=\"https:\/\/slsa.dev\/\">SLSA<\/a> \u00b7 <a href=\"https:\/\/www.sigstore.dev\/\">Sigstore<\/a> \u00b7 <a href=\"https:\/\/argo-cd.readthedocs.io\/\">Argo CD<\/a><\/li>\n<\/ul>\n<p>CI\/CD continua sendo o mesmo pipeline de 2019: integrar cedo, testar sempre, soltar em peda\u00e7o pequeno. O YAML foi para o Git, o cluster passou a puxar o estado, e o job verde agora precisa provar de onde veio o bin\u00e1rio. O resto \u00e9 ferramenta.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>CI\/CD n\u00e3o \u00e9 produto. \u00c9 o h\u00e1bito de integrar, testar e soltar software em ciclo curto, com o m\u00e1ximo de passo autom\u00e1tico. O \u201cmerge day\u201d de 2019 continua sendo o anti-padr\u00e3o. O que mudou \u00e9 onde o YAML mora, quem &#8230; <a title=\"DevOps, o que \u00e9 CI\/CD ?\" class=\"read-more\" href=\"https:\/\/www.linuxpro.com.br\/es\/2019\/12\/devops-ci-cd\/\" aria-label=\"Read more about DevOps, o que \u00e9 CI\/CD ?\">Read more<\/a><\/p>","protected":false},"author":0,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[108,103,46],"tags":[105,106,9,47,156,48,49,104],"class_list":["post-155","post","type-post","status-publish","format-standard","hentry","category-ci-cd","category-cloud","category-devops","tag-ci-cd","tag-cloud","tag-dev","tag-devops","tag-docker","tag-git","tag-github","tag-gitlab"],"_links":{"self":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/155","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/comments?post=155"}],"version-history":[{"count":8,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/155\/revisions"}],"predecessor-version":[{"id":1317,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/155\/revisions\/1317"}],"wp:attachment":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/media?parent=155"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/categories?post=155"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/tags?post=155"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}