{"id":256,"date":"2026-10-13T03:50:51","date_gmt":"2026-10-13T03:50:51","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2010\/05\/17\/asdasd-adsad\/"},"modified":"2026-10-13T03:50:51","modified_gmt":"2026-10-13T03:50:51","slug":"asdasd-adsad","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/asdasd-adsad\/","title":{"rendered":"CI\/CD Pipeline Basics for DevOps Teams: From Commit to Production"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">A well-designed CI\/CD pipeline turns code changes into reliable releases with less manual effort. This guide is for DevOps engineers and platform teams who want a practical blueprint: workflow stages, tool selection trade-offs, and production-safe deployment patterns.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Originally published on 2010-05-17; fully revised and updated.<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What CI\/CD covers in practice<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Continuous Integration (CI)<\/strong> focuses on frequent code integration, automated testing, and build validation. <strong>Continuous Delivery\/Deployment (CD)<\/strong> extends that flow into release automation, with controls for risk and rollback.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>CI catches integration issues early with automated checks.<\/li><li>CD reduces manual release steps and makes deployments repeatable.<\/li><li>Both together improve lead time, consistency, and recovery speed.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Reference workflow from commit to production<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A practical pipeline should validate quickly, produce traceable artifacts, and gate production rollout with clear approval and rollback paths.<\/p>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Developer pushes commit] --> B[Install dependencies]\n    B --> C[Run lint and unit tests]\n    C --> D{Tests pass}\n    D -- no --> E[Fail pipeline and fix]\n    D -- yes --> F[Build artifact or image]\n    F --> G[Push to artifact registry]\n    G --> H[Deploy to staging]\n    H --> I[Run smoke tests]\n    I --> J{Approve production release}\n    J -- no --> E\n    J -- yes --> K[Deploy to production]\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Compare popular CI\/CD platforms<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Platform choice is usually driven by repository location, required control over runners, and how much operational overhead your team can absorb.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Platform<\/th><th>Best for<\/th><th>Hosting model<\/th><th>Strengths<\/th><th>Trade-offs<\/th><\/tr><\/thead><tbody><tr><td>Jenkins<\/td><td>Highly customized enterprise pipelines<\/td><td>Primarily self-managed<\/td><td>Flexible plugin ecosystem, deep customization<\/td><td>Higher maintenance and upgrade overhead<\/td><\/tr><tr><td>GitHub Actions<\/td><td>Teams already using GitHub repos<\/td><td>Cloud and self-hosted runners<\/td><td>Native GitHub integration, simple workflow syntax<\/td><td>Complex workflows can become hard to govern<\/td><\/tr><tr><td>GitLab CI\/CD<\/td><td>Teams standardizing on GitLab<\/td><td>SaaS or self-managed<\/td><td>Integrated SCM and pipeline features<\/td><td>Best experience tied to GitLab ecosystem<\/td><\/tr><tr><td>CircleCI<\/td><td>Cloud-first teams needing quick setup<\/td><td>Cloud and self-hosted options<\/td><td>Fast onboarding, reusable config patterns<\/td><td>Less native when code is outside supported integrations<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Minimal pipeline example with GitHub Actions<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This example runs tests on every push and pull request, then builds and pushes a container image for the main branch.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-yaml\">name: ci-cd\n<span class=\"hljs-attr\">on<\/span>:\n  push:\n    branches: &#91; <span class=\"hljs-string\">\"main\"<\/span> ]\n  <span class=\"hljs-attr\">pull_request<\/span>:\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n    <span class=\"hljs-attr\">steps<\/span>:\n      - uses: actions\/checkout@v4\n      - name: <span class=\"hljs-built_in\">Set<\/span> up Node\n        <span class=\"hljs-attr\">uses<\/span>: actions\/setup-node@v4\n        <span class=\"hljs-attr\">with<\/span>:\n          node-version: <span class=\"hljs-string\">\"20\"<\/span>\n      - run: npm ci\n      - run: npm test\n\n  <span class=\"hljs-attr\">build_and_push<\/span>:\n    needs: test\n    <span class=\"hljs-attr\">if<\/span>: github.ref == <span class=\"hljs-string\">'refs\/heads\/main'<\/span>\n    runs-on: ubuntu-latest\n    <span class=\"hljs-attr\">steps<\/span>:\n      - uses: actions\/checkout@v4\n      - run: docker build -t ghcr.io\/example\/app:${{ github.sha }} .\n      - run: echo <span class=\"hljs-string\">\"${{ secrets.GITHUB_TOKEN }}\"<\/span> | docker login ghcr.io -u ${{ github.actor }} --password-stdin\n      - run: docker push ghcr.io\/example\/app:${{ github.sha }}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Deployment command example for Kubernetes<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">After publishing an image, update the deployment and wait for rollout status. Pair this with health checks and alerting in production.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-bash\"><span class=\"hljs-keyword\">export<\/span> GIT_SHA=$(git rev-parse --short HEAD)\n\ndocker build -t ghcr.io\/example\/app:$GIT_SHA .\ndocker push ghcr.io\/example\/app:$GIT_SHA\n\nkubectl <span class=\"hljs-keyword\">set<\/span> image deployment\/app app=ghcr.io\/example\/app:$GIT_SHA -n production\nkubectl rollout status deployment\/app -n production<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Common pitfalls and best practices<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Pitfall:<\/strong> Long pipelines with slow feedback. <strong>Best practice:<\/strong> Run fast tests first, then heavier integration suites.<\/li><li><strong>Pitfall:<\/strong> Environment drift between staging and production. <strong>Best practice:<\/strong> Use the same deployment mechanism and immutable artifacts.<\/li><li><strong>Pitfall:<\/strong> Secrets exposed in logs. <strong>Best practice:<\/strong> Store secrets in a dedicated manager and mask sensitive output.<\/li><li><strong>Pitfall:<\/strong> No rollback plan. <strong>Best practice:<\/strong> Automate rollback or progressive delivery with clear health gates.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Learn how to design a practical CI\/CD pipeline that improves release reliability and speed. This guide covers workflow stages, platform trade-offs, and production-safe deployment examples.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[2],"tags":[],"class_list":["post-256","post","type-post","status-publish","format-standard","hentry","category-uncategorised"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/256","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=256"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/256\/revisions"}],"predecessor-version":[{"id":79084,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/256\/revisions\/79084"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=256"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=256"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=256"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}