{"id":10137,"date":"2022-03-22T17:34:38","date_gmt":"2022-03-22T12:04:38","guid":{"rendered":"https:\/\/opstree.com\/blog\/\/?p=10137"},"modified":"2022-06-15T15:57:44","modified_gmt":"2022-06-15T10:27:44","slug":"introduction-to-buildkite","status":"publish","type":"post","link":"https:\/\/opstree.com\/blog\/2022\/03\/22\/introduction-to-buildkite\/","title":{"rendered":"Know How to Get Started with Buildkite"},"content":{"rendered":"\n<p class=\"has-text-align-justify\">We&#8217;re on the verge where all the small to big organisations are shipping software to customers in minutes. Earlier this was not possible, but thank&#8217;s to Continuous Integration (CI) and Continuous Delivery (CD) that made it possible.<\/p>\n\n\n\n<p class=\"has-text-align-justify\">Continuous Integration (CI) is the practice of integrating code changes from multiple contributors into a single project via automation. Continuous Delivery (CD) is the automated process to build, test, configure &amp; deploy software into the production environment. Both methods combined make it possible to build, test &amp; deploy everyday code changes into the production environment.<\/p>\n\n\n\n<p class=\"has-text-align-justify\">There are lots of tools in the market to implement CICD, one among which we are about to discuss today in this post.<\/p>\n\n\n\n<p class=\"has-text-align-justify\">Let me introduce you to Buildkite.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\">Buildkite<\/h2>\n\n\n\n<p class=\"has-text-align-justify\">Buildkite is a CI and build automation tool that combines the power of your own build infrastructure with the convenience of a managed, centralized web UI. It is a hybrid SaaS platform designed for enterprise scale. You can run as many jobs as you need and buildkite will manage the orchestration and reporting. You\u2019re in charge of your builds, Buildkite is in charge of the platform.<\/p>\n\n\n\n<p class=\"has-text-align-justify\">Buildkite consists of <strong>three<\/strong> main components:<\/p>\n\n\n\n<h5 class=\"wp-block-heading\"><strong>Buildkite Agent:<\/strong><\/h5>\n\n\n\n<p class=\"has-text-align-justify\">The Buildkite agent is a small, reliable, and cross-platform build runner that makes it easy to run automated builds on your own infrastructure. Agents run on several platforms including Ubuntu, Debian, Mac, Windows, Docker, and others. Its main responsibilities are polling buildkite.com for work, running build jobs, reporting back the status code and output log of the job, and uploading the job&#8217;s artifacts.<\/p>\n\n\n\n<p class=\"has-text-align-justify\"><strong>How does Buildkite Agent Work?<br><\/strong>The agent works by polling Buildkite\u2019s agent API over HTTPS. Since HTTPS protocol is used there is no need for port forwarding or firewall access for incoming requests. The agent registers itself with Buildkite &amp; places it into your organization\u2019s agents pool. Because of this scaling of agents is very easy with Buildkite.<\/p>\n\n\n<div class=\"wp-block-image is-style-default\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2022\/03\/buildkite-agent-workflow-edited.png?w=1024\" alt=\"\" class=\"wp-image-10177\" width=\"640\" height=\"468\" \/><\/figure><\/div>\n\n\n<p class=\"has-text-align-justify\">The agent polls Buildkite for a new build job. Once received and accepted, the agent will execute the command, stream back the build script\u2019s output, and then posts the final exit status. Whilst the job is running, you can use the buildkite-agent meta-data command to set and get build-wide meta-data.<br>Buildkite provides a rich set of metadata that can be used in post-build actions or post-build notifications.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\"><strong>Pipelines:<\/strong><\/h5>\n\n\n\n<p class=\"has-text-align-justify\">Pipelines are containers to define and model the build workflows and also to kick off post-build steps.<\/p>\n\n\n\n<p class=\"has-text-align-justify\">A pipeline is a template of the steps or instructions that need to be executed during the build. There are many types of steps that can be included in a single pipeline, some run source code pull, code build, some run scripts, some define conditional logic, and others wait for user input. We can include any number of steps in the pipeline template. When the pipeline is run, a build gets created. Each of the steps in the pipeline ends up as jobs in the build, which then get distributed to available agents.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\"><strong>Deployments:<\/strong><\/h5>\n\n\n\n<p class=\"has-text-align-justify\">These are steps that run after a build is complete and can be either triggered automatically or manually.<br>There are many ways to set up both manual and continuous deployment workflows using Buildkite. This covers various ways of architecting deployment pipelines, common workflows, and how to integrate with external deployment systems.<\/p>\n\n\n\n<p class=\"has-text-align-justify\"><strong>Single deployment steps:<\/strong><br>Adding a deployment step that runs after your tests pass is the simplest way to deploy from a Buildkite pipeline.<\/p>\n\n\n\n<p class=\"has-text-align-justify\">The example pipeline.yml below shows how to set up continuous deployment using a single step that runs after the tests pass.<\/p>\n\n\n\n<figure class=\"highlight-figure\"><figcaption>pipeline.yml<\/figcaption><div class=\"highlight\"><pre class=\"highlight yaml\"><code><span class=\"na\">steps<\/span><span class=\"pi\">:<\/span>\n  <span class=\"pi\">-<\/span> <span class=\"na\">label<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">\ud83d\udd28\"<\/span>\n    <span class=\"na\">command<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">scripts\/tests\"<\/span>\n\n  <span class=\"pi\">-<\/span> <span class=\"s\">wait<\/span>\n\n  <span class=\"pi\">-<\/span> <span class=\"na\">label<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">\ud83d\ude80\"<\/span>\n    <span class=\"na\">command<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">scripts\/deploy\"<\/span>\n    <span class=\"na\">if<\/span><span class=\"pi\">:<\/span> <span class=\"s\">build.branch == 'main'<\/span>\n    <span class=\"na\">concurrency<\/span><span class=\"pi\">:<\/span> <span class=\"s\">1<\/span>\n    <span class=\"na\">concurrency_group<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">my-app-deploy\"<\/span>\n<\/code><\/pre><\/div><\/figure>\n\n\n\n<p class=\"has-text-align-justify\">This pipeline uses a conditional to only run on commits to the main branch and sets a concurrency limit of 1 to ensure that only one deployment happens at a time.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"653\" height=\"308\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2022\/03\/screenshot-from-2022-03-14-15-00-16-1.png?w=653\" alt=\"\" class=\"wp-image-10149\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p class=\"has-text-align-justify\"><strong>Deployment plugins:<\/strong><br>There are <a rel=\"noreferrer noopener\" href=\"https:\/\/buildkite.com\/docs\/plugins\" target=\"_blank\">Buildkite plugins<\/a> available for various systems and tools. For example, the <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/buildkite-plugins\/ecs-deploy-buildkite-plugin\" target=\"_blank\">ECS Deploy plugin<\/a> and the <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/envato\/lambda-deploy-buildkite-plugin\" target=\"_blank\">AWS Lambda Deploy plugin<\/a>.<\/p>\n\n\n\n<p class=\"has-text-align-justify\">The following example shows how to use the ECS Deploy plugin to automatically deploy a pre-built Docker image to an <code>AWS ECS<\/code> service:<\/p>\n\n\n\n<figure class=\"highlight-figure\"><figcaption>pipeline.yml<\/figcaption><div class=\"highlight\"><pre class=\"highlight yaml\"><code><span class=\"na\">steps<\/span><span class=\"pi\">:<\/span>\n  <span class=\"pi\">-<\/span> <span class=\"na\">block<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">Deploy\"<\/span>\n    <span class=\"na\">prompt<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">Deploy<\/span><span class=\"nv\"> <\/span><span class=\"s\">to<\/span><span class=\"nv\"> <\/span><span class=\"s\">production?\"<\/span>\n  <span class=\"pi\">-<\/span> <span class=\"na\">label<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">:ecs:<\/span><span class=\"nv\"> <\/span><span class=\"s\">\ud83d\ude80\"<\/span>\n    <span class=\"na\">concurrency<\/span><span class=\"pi\">:<\/span> <span class=\"s\">1<\/span>\n    <span class=\"na\">concurrency_group<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">rails-app-deploy\"<\/span>\n    <span class=\"na\">plugins<\/span><span class=\"pi\">:<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"s\">ecs-deploy#v1.3.0<\/span><span class=\"pi\">:<\/span>\n        <span class=\"na\">cluster<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">production\"<\/span>\n        <span class=\"na\">service<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">app\"<\/span>\n        <span class=\"na\">task-definition<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">production-deploy\/rails-app.json\"<\/span>\n        <span class=\"na\">task-family<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">rails-app\"<\/span>\n        <span class=\"na\">image<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">my.ecr.repo\/rails-app:${BUILDKITE_COMMIT}\"<\/span>\n        <span class=\"na\">task-role-arn<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">deployer\"<\/span>\n        <span class=\"na\">deployment-configuration<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">100\/200\"<\/span>\n<\/code><\/pre><\/div><\/figure>\n\n\n\n<p><strong>GitHub deployments:<\/strong><a href=\"https:\/\/buildkite.com\/docs\/deployments#github-deployments\" target=\"_blank\" rel=\"noopener\"><\/a><\/p>\n\n\n\n<p class=\"has-text-align-justify\">You can set up your pipelines to create a build whenever there is a deployment created in GitHub. You can trigger these builds using a call to&nbsp;<a href=\"https:\/\/developer.github.com\/v3\/guides\/delivering-deployments\/\" target=\"_blank\" rel=\"noopener\">GitHub\u2019s Deployments REST API<\/a>, or using the&nbsp;<a href=\"https:\/\/slack.github.com\/\" target=\"_blank\" rel=\"noopener\">GitHub Slack app<\/a>\u2019s&nbsp;<code>\/github deploy my-org\/my-repo<\/code>&nbsp;command.<\/p>\n\n\n\n<p class=\"has-text-align-justify\">To enable builds to be created from GitHub deployment events, create a pipeline and select &#8216;Trigger builds on deployment&#8217; in your Buildkite pipeline&#8217;s GitHub settings:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"671\" height=\"346\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2022\/03\/screenshot-from-2022-03-14-20-23-28.png?w=671\" alt=\"\" class=\"wp-image-10157\" \/><\/figure>\n\n\n\n<p class=\"has-text-align-justify\">To customize the deployment&#8217;s environment name and URL in GitHub, you can set the following two&nbsp;<a href=\"https:\/\/buildkite.com\/docs\/pipelines\/build-meta-data\" target=\"_blank\" rel=\"noopener\">build meta-data<\/a>&nbsp;values in the pipeline that performs the deployment:<\/p>\n\n\n\n<div class=\"highlight\"><pre class=\"highlight shell\"><code>buildkite-agent meta-data <span class=\"nb\">set<\/span> <span class=\"s2\">\"github_deployment_status:environment\"<\/span> <span class=\"s2\">\"staging\"<\/span>\nbuildkite-agent meta-data <span class=\"nb\">set<\/span> <span class=\"s2\">\"github_deployment_status:environment_url\"<\/span> <span class=\"s2\">\"https:\/\/staging.my-app-dev.com\/\"<\/span>\n<\/code><\/pre><\/div>\n\n\n\n<h5 class=\"wp-block-heading\">Understanding Buildkite\u2019s Hybrid Infrastructure &amp; Scalablity<\/h5>\n\n\n\n<p class=\"has-text-align-justify\"><strong>Scalability<\/strong><br>Buildkite is a hybrid SaaS platform designed for enterprise scaling. Since the agents are self-hosted you will have complete control over the parallel scaling of your CI tasks. You can add unlimited agents at no extra cost. Run as many jobs as you need and Buildkite will manage the orchestration and reporting. You\u2019re in charge of your builds, Buildkite is in charge of the platform.<\/p>\n\n\n\n<p class=\"has-text-align-justify\"><strong>Extensibility<\/strong><br>Buildkite makes it easy to create, find, and implement integrations with third-party technologies, with an extensive library of plugins and deep native support for major source control, containers, and dev tool solutions. It also allows you to write &amp; use your own plugins, this helps customize your pipeline to your specific workflow.<\/p>\n\n\n\n<p class=\"has-text-align-justify\"><strong>Security<\/strong><br>With the self-hosted Buildkite agent jobs are run in your environments, behind your firewall. Because your source code is never shared with Buildkite, Buildkite provides the control and security of on-prem combined with the convenience of self-hosting.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Advantages of using Buildkite:<\/h5>\n\n\n\n<ul><li><strong>Hybrid Platform: <\/strong>Buildkite provides a SaaS platform to define and visualize pipelines, and an agent to execute jobs on customer-managed infrastructure.<\/li><li><strong>Extensive Self-Hosted Job Support: <\/strong>Including team permission management, robust CLI &amp; API controls, built-in DataDog integration, and automatic AWS &amp; Google Cloud tagging\/labeling.<\/li><li><strong>Flexible Pipeline Creation:<\/strong> Pipelines can be defined via an in-UI step builder, as a YAML file, or dynamically via scripts in your source repository.<\/li><li><strong>Unlimited Job Concurrency: <\/strong>Self-hosted agents give you full control to parallelize your CI tasks at any scale.<\/li><li><strong>Uncapped Usage Limits:<\/strong> No usage caps. Deploy with confidence whether you need to run 10 or 10,000 builds at a time.<\/li><li><strong>Unlimited Job Queue Limits:<\/strong> Queue up as much work as you need for as long as you need it.<\/li><li><strong>Pricing:<\/strong> Buildkite charges USD$ 15 per user, per month for a plan that includes unlimited agents, unlimited builds, unlimited artifacts, Public build pipelines, Private build pipelines, Teams permissions, Single Sign On, Priority email support &amp; Free 14-day trial. Also provides an open source plan that is free of charges that includes Unlimited agents, Unlimited builds, Unlimited artifacts, Public build pipelines.<\/li><\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">Conclusion:<\/h5>\n\n\n\n<p class=\"has-text-align-justify\">There are so many CICD tools in the market that have their own advantages, but deciding which suits your requirement is a challenging task. Hope this blog will help you decide if Buildkite is the perfect CICD tool for your requirement.<\/p>\n\n\n\n<p class=\"has-text-align-justify\">That&#8217;s all for today! <\/p>\n\n\n\n<p class=\"has-text-align-justify\">I hope you guys have enjoyed the reading, if you have any feedback or suggestions, please reach out to me. In the upcoming blog on Buildkite, we will discuss configuring a pipeline in Buildkite.  <\/p>\n\n\n\n<p><br><strong style=\"font-weight:bold;\">Blog Pundit:<\/strong> <a href=\"https:\/\/opstree.com\/blog\/\/author\/deepakgupta97\/\"><strong>Deepak Gupta<\/strong><\/a> and <strong>Sanjeev Pandey<\/strong><\/p>\n\n\n\n<p><strong><a href=\"https:\/\/www.opstree.com\/contact-us?utm_source=blog&amp;utm_medium=wordpress+&amp;utm_campaign=Know-how-to-get-started-with-Buildkite\" target=\"_blank\" rel=\"noreferrer noopener\">Opstree<\/a><\/strong><a rel=\"noreferrer noopener\" href=\"https:\/\/www.opstree.com\/contact-us?utm_source=blog&amp;utm_medium=wordpress+&amp;utm_campaign=AWS-Elastic-Network-Interface\" target=\"_blank\"> <\/a>is an End to End DevOps solution provider<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button is-style-fill\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/www.opstree.com\/contact-us\" target=\"_blank\" rel=\"noreferrer noopener\">CONTACT US<\/a><\/div>\n<\/div>\n\n\n\n<p class=\"has-text-align-center\"><strong>Connect Us <\/strong><\/p>\n\n\n\n<ul class=\"wp-block-social-links aligncenter is-content-justification-right is-layout-flex wp-container-core-social-links-is-layout-1 wp-block-social-links-is-layout-flex\"><li class=\"wp-social-link wp-social-link-linkedin  wp-block-social-link\"><a href=\"https:\/\/www.linkedin.com\/company\/opstree-solutions\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">LinkedIn<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-youtube  wp-block-social-link\"><a href=\"https:\/\/www.youtube.com\/channel\/UCeLma6SpNYH7jjYKSBNSexw\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">YouTube<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-github  wp-block-social-link\"><a href=\"https:\/\/github.com\/OpsTree\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">GitHub<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-facebook  wp-block-social-link\"><a href=\"https:\/\/www.facebook.com\/opstree\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">Facebook<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-medium  wp-block-social-link\"><a href=\"https:\/\/medium.com\/buildpiper\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M20.962,7.257l-5.457,8.867l-3.923-6.375l3.126-5.08c0.112-0.182,0.319-0.286,0.527-0.286c0.05,0,0.1,0.008,0.149,0.02 c0.039,0.01,0.078,0.023,0.114,0.041l5.43,2.715l0.006,0.003c0.004,0.002,0.007,0.006,0.011,0.008 C20.971,7.191,20.98,7.227,20.962,7.257z M9.86,8.592v5.783l5.14,2.57L9.86,8.592z M15.772,17.331l4.231,2.115 C20.554,19.721,21,19.529,21,19.016V8.835L15.772,17.331z M8.968,7.178L3.665,4.527C3.569,4.479,3.478,4.456,3.395,4.456 C3.163,4.456,3,4.636,3,4.938v11.45c0,0.306,0.224,0.669,0.498,0.806l4.671,2.335c0.12,0.06,0.234,0.088,0.337,0.088 c0.29,0,0.494-0.225,0.494-0.602V7.231C9,7.208,8.988,7.188,8.968,7.178z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">Medium<\/span><\/a><\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>We&#8217;re on the verge where all the small to big organisations are shipping software to customers in minutes. Earlier this was not possible, but thank&#8217;s to Continuous Integration (CI) and Continuous Delivery (CD) that made it possible. Continuous Integration (CI) is the practice of integrating code changes from multiple contributors into a single project via &hellip; <a href=\"https:\/\/opstree.com\/blog\/2022\/03\/22\/introduction-to-buildkite\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Know How to Get Started with Buildkite&#8221;<\/span><\/a><\/p>\n","protected":false},"author":218216335,"featured_media":29900,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[28070474],"tags":[731330843,460,311806480,731330844,731330852,4605929,731330845,34463,4996032],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/opstree.com\/blog\/wp-content\/uploads\/2025\/11\/DevSecOps-1.jpg","jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pfDBOm-2Dv","jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/10137"}],"collection":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/users\/218216335"}],"replies":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/comments?post=10137"}],"version-history":[{"count":25,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/10137\/revisions"}],"predecessor-version":[{"id":10963,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/10137\/revisions\/10963"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/media\/29900"}],"wp:attachment":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/media?parent=10137"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/categories?post=10137"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/tags?post=10137"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}