<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by GoCD on Medium]]></title>
        <description><![CDATA[Stories by GoCD on Medium]]></description>
        <link>https://medium.com/@goforcd?source=rss-2aedefc37fcf------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*vAwNBqaVrAHqxHt9-P5Jew.jpeg</url>
            <title>Stories by GoCD on Medium</title>
            <link>https://medium.com/@goforcd?source=rss-2aedefc37fcf------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 02:31:11 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@goforcd/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[How we used Continuous Delivery to deliver a Continuous Delivery tool]]></title>
            <link>https://medium.com/rootconf-blog/how-we-used-continuous-delivery-to-deliver-a-continuous-delivery-tool-e5f3cb891b48?source=rss-2aedefc37fcf------2</link>
            <guid isPermaLink="false">https://medium.com/p/e5f3cb891b48</guid>
            <category><![CDATA[ci-theatre]]></category>
            <category><![CDATA[thoughtworks]]></category>
            <category><![CDATA[automation]]></category>
            <category><![CDATA[continuous-delivery]]></category>
            <category><![CDATA[gocd]]></category>
            <dc:creator><![CDATA[GoCD]]></dc:creator>
            <pubDate>Tue, 08 May 2018 08:28:45 GMT</pubDate>
            <atom:updated>2018-05-08T09:01:46.837Z</atom:updated>
            <content:encoded><![CDATA[<p><em>[Sponsored post: This post has been written by ThoughtWorks’ GoCD team as part of their sponsorship for Rootconf 2018.]</em></p><p>At ThoughtWorks, we are passionate advocates for continuous delivery — we even wrote the book on it. Jez Humble, the co-author of <a href="https://www.amazon.com/dp/0321601912?tag=contindelive-20">Continuous Delivery</a> (CD), and the initial product manager for GoCD described CD as</p><blockquote><em>“Continuous Delivery is the ability to get changes of all types — including new features, configuration changes, bug fixes and experiments — into production, or into the hands of users, safely and quickly in a sustainable way.</em>”</blockquote><p>One of the primary reasons we understand the challenges behind continuous delivery, and how one may be lulled into thinking they are practicing it, is because we’ve been through this ourselves. This is a story of how we discovered that we could deliver more continuously when we made the decision to go open source in early 2014.</p><h3>What is GoCD</h3><p>GoCD is a free and open source continuous delivery server built by ThoughtWorks. It provides complex workflow modeling, advanced traceability and end-to-end visualization of your deployment pipelines. Built specifically to do continuous delivery, GoCD supports all recommended CD patterns out of the box.</p><h3>The proprietary bubble</h3><p>GoCD was originally created as a proprietary solution by ThoughtWorks around 2010. Between 2010 and 2014 we had a release cycle of three to four months. The product was being consumed by several enterprise customers and given their resistance to upgrade often, there was no impetus for the team to deliver change any quicker. We had automated test as well as an exploratory and regression test cycle and released high quality releases. Although we had never tried we thought that if we really <em>needed</em> to, we could deliver whenever we wanted.</p><h3>Using CD to deliver an open source CD product</h3><p>Going open source came with new expectations from a new audience. We were seeing rapid adoption from a new group of people who expected changes faster than our previous enterprise customers. And who were keen to see their contributions in production. At this point, we thought we were ready to deliver continuously, but we weren’t truly ready When we tried to reduce the release cycle to deliver once every month or month and a half we were challenged. In order to reach this goal we took these steps.</p><h4><strong>1. Gradually start automating manual parts of the deployment process first</strong></h4><p>Our first goal was to shorten our release cycle from 3–4 months to 1.5 months. When we looked closely at this process we could see some obvious areas to improve to begin with. For example, although we had a lot of automated tests to help with our regression testing we also had gaps. Our installer testing phase, which tested that each installer for each operating system was functional as well as our performance tests were not automated. To complete these phases manually took us weeks. Likewise publishing our installers at the end of the process was a manual process. Rather than try to change this all at once which was daunting we decided to break down the automation our entire deployment into tiny chunks. Each new release, we automated a new piece of the process, so that we gradually reduced our cycle time and released more often. This incremental approach allowed us to improve without taking too much on at the same time.</p><h4><strong>2. Find newer things to automate</strong></h4><p>As we progressed, we started finding newer things to automate such as our Release Notes. Since we were delivering an open source tool to the public, we needed to have reliable and sensible release notes for each release. First, we got everyone who contributed code (the team and external contributors) to write good commit messages and then automated release notes out of these. Each time we added a new automated step like this we made the progress quicker and more reliable.</p><h3>GoCD deployments today</h3><p>Our ultimate goal was to get to a place where we could automatically publish releases to production and we are still on that journey but much much closer than we were before. Today, we have automated our installer tests, performance tests, release notes etc., and are closer to this goal. While we make major version releases on a monthly basis, we deploy experimental releases on every commit.</p><p>You can take a look at our pipelines at <a href="https://build.gocd.org/">https://build.gocd.org</a> .</p><p>One of the real benefits of practicing CD has been that if there’s a problem with the release, we have the ability to release a new version or deploy a fix much more easily. Our pipeline is still not a 100% automated (e.g we manually curate some of our release notes to make them easier to read) and we keep looking for newer things to automate. However, the goal of continuous delivery isn’t complete automation but to ensure that changes get to users safely and reliably. To that end, our journey to continuous delivery is on-going.</p><h3>Our advice for anyone else moving to CD</h3><p>The two most important learnings for us in the quest to delivery continuously have been that:</p><h4><strong>Frequency reduces difficulty</strong></h4><p>The idea is simple — if you find something difficult, do it more often. If you can bring that pain forward, you will realize that there are a lot of costs and complexity that you can reduce. Every time we do something manual we ask ourselves the question “can we automate this?”</p><h4><strong>Automation costs pay for themselves</strong></h4><p>Many times teams will be too daunted to take on the task of automation or they will think that they don’t have time to automate. While there We used to have long cycles and at the end we still spent manual effort checking if all the tests had been carried out and correcting when anything had been missed. We don’t have to worry about that now. There is an initial cost at the beginning automation, but in the end, it definitely pays off. Our approach to incrementally pay-down our manual testing and manual release process allowed us to reduce the time to production as well as continue to deliver. Now we are able to release quickly and reliably whenever we want.</p><p>We discovered that our biggest challenge to going open source was our assumption that we were practicing CD when we really weren’t. Just like with <a href="https://www.gocd.org/2017/05/16/its-not-CI-its-CI-theatre.html">CI theatre</a> we recommend that teams challenge themselves to deliver faster, more often and more reliably in order to understand their opportunities to improve.</p><p><em>To get started with GoCD, you can start by </em><a href="https://gocd.org/download"><em>downloading it for free</em></a><em>. We recommend using our </em><a href="https://www.gocd.org/getting-started/part-1/"><em>Getting Started Guide</em></a><em> for guidance on CD concepts and how to build your deployment pipeline. If you need help with anything related to CD or GoCD setup, do reach out to our </em><a href="https://groups.google.com/forum/#!forum/go-cd"><em>community</em></a><em>.</em></p><p><em>GoCD has sponsored Rootconf 2018. The team is seeking feedback and adoption of their open source tool.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e5f3cb891b48" width="1" height="1" alt=""><hr><p><a href="https://medium.com/rootconf-blog/how-we-used-continuous-delivery-to-deliver-a-continuous-delivery-tool-e5f3cb891b48">How we used Continuous Delivery to deliver a Continuous Delivery tool</a> was originally published in <a href="https://medium.com/rootconf-blog">Rootconf Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Are you ready for Continuous Delivery? (Part 2: Feedback Loops)]]></title>
            <link>https://medium.com/continuous-delivery/are-you-ready-for-continuous-delivery-part-2-feedback-loops-f500e401aef8?source=rss-2aedefc37fcf------2</link>
            <guid isPermaLink="false">https://medium.com/p/f500e401aef8</guid>
            <category><![CDATA[continuous-integration]]></category>
            <category><![CDATA[test-automation]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[feedback-loop]]></category>
            <category><![CDATA[continuous-delivery]]></category>
            <dc:creator><![CDATA[GoCD]]></dc:creator>
            <pubDate>Mon, 18 Jul 2016 08:16:55 GMT</pubDate>
            <atom:updated>2016-07-18T08:16:55.120Z</atom:updated>
            <content:encoded><![CDATA[<p><em>Posted by </em><a href="https://twitter.com/david_j_rice"><em>David Rice</em></a><em>. This article was originally published on </em><a href="https://www.go.cd/2016/03/15/are-you-ready-for-continuous-delivery-part-2-feedback-loops/"><em>GoCD’s blog</em></a><em>.</em></p><p>During the 10 plus years ThoughtWorks has been in the Continuous Delivery (CD) ecosystem, we’ve regularly come across people wanting to try our tools (GoCD and Snap CI) as they start their journey toward CD. Very often, in attempting to support teams new to CD, we suggest that they pause any tool evaluation and consider whether their organization is actually ready to embark on this journey. If you do not frankly assess your team’s readiness, the result can be a massive failure. The path to CD should not start with the immediate adoption of a CD tool.</p><p>In <a href="https://www.go.cd/2016/01/25/are-you-ready-for-continuous-delivery/">part one</a> of this series, we explored some core development practices that are prerequisites for CD. In this part, we’ll look at a variety of feedback loops — both manual and automated — your organization should have in place before rolling out CD.</p><h3>Feedback loops and Continuous Delivery</h3><p>The aim of Continuous Delivery is to release software faster, more reliably, and more frequently. Given that, diagrams of CD typically depict a linear flow. On the surface, this is quite different from Continuous Integration, which is usually shown as a loop.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*8jAhcHjiuGwXVveC.png" /></figure><p>But CD as a linear flow is an incomplete picture. A good deployment pipeline has numerous feedback loops along the way. At each stage of the pipeline, verifications are run. If they pass, the pipeline continues. If they fail, the pipeline halts and the team responds appropriately to the feedback. The feedback along the way prevents CD from being chaos. Poor quality will almost never reach production in a well-designed pipeline.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*NWMEYY6bpOMtORHX.png" /></figure><p>Most of the feedback loops you find in a deployment pipeline are good practices in and of themselves. You might already be doing some or most of them. We think you should have many of these in place before moving forward with CD.</p><h3>Test automation</h3><p>The most common feedback loop in any deployment pipeline is the execution of automated tests. You must have a solid test automation strategy before attempting CD. Some people like the approach of the <a href="http://martinfowler.com/bliki/TestPyramid.html">test pyramid</a>. We’re actually fine with any sensible approach, as long as it’s fast and reliable. There are myriad types of automated tests, and which ones you use will depend upon your circumstances. Here, we will take a look at three of the most important types: unit, regression, and performance.</p><h4>Unit tests</h4><p>Unit tests verify your application at the most granular level, typically methods or classes. They are fast, easy to maintain, and support rapid change of your application. Unit tests should be the foundation of your automation strategy. If your teams don’t value a thorough and fast unit test suite, they won’t be able to move fast or with confidence.</p><p>Some points to consider when assessing your team:</p><ul><li>The suite must be fast. What’s fast? A few minutes on a large code base is OK. But faster is better. Slow unit tests result in a slow, horribly frustrating development flow.</li><li>On a mature team, the testers will be comfortable with pushing as much of your test automation as possible into your unit test layer.</li><li>Code coverage is important, but tracking metrics is generally only beneficial for a team learning the basics.</li><li>Some frameworks and platforms are known to be slow when it comes to unit tests. Do not fight or subvert a framework to make tests fast. Instead, consider switching your framework or platform.</li></ul><h4>Regression test suite</h4><p>A regression test suite verifies that your entire application actually works. This suite adds a ton of value to a deployment pipeline. For many, the regression stage of a pipeline gives the confidence needed to deploy. We want to make a couple of points about this.</p><p>Firstly, regression tests should be 100 percent automated. They are change-detectors and do not require brain power to execute. A manual regression stage in your deployment process will prove painful. Work to get rid of it. Your testers can add more value elsewhere.</p><p>Secondly, we reject the notion that a regression suite must mean slow, flaky Selenium tests. Our take is, yes, it’s a fair reputation, but it was earned by many teams doing it wrong. How to author and maintain an automated regression suite is a book-worthy topic, but quickly:</p><ul><li>Don’t couple them to small stories or tasks. Only consider them in the context of the entire application.</li><li>Relentlessly prune the suite. Keep it tight. Err on the side of leaving something uncovered rather than accepting duplication.</li><li>Treat them as production code. Keep things very clean.</li><li>Have programmers write them. Train your testers to code if they are interested in automation. Avoid drag-and-drop programming.</li><li>Do not accept flaky tests. Fix them or get rid of them.</li><li>Even the best suites we’ve seen tend to be slow. Embrace using some combination of hardware, virtualization, and cloud to parallelize execution.</li></ul><p>One caveat to note: the best testers will want to do a manual regression every so often, just to help structure how they think about the application. That’s a good thing so long as it’s about their being thoughtful and not how you actually integrate regression checks into your process.</p><h4>Performance testing</h4><p>Performance testing — verifying that your application meets specific performance criteria — is a massive topic. There’s no one way to do it: your approach will vary according to request volume and data size. There are many varieties: load, stress, soak, and spike, to name a few. It’s too big a topic for this post. That said, we do have some thinking that can help you assess your maturity:</p><ul><li>Do not leave this phase for last. We cannot stress enough just how difficult this practice is and how much time we’ve seen sunk into failed efforts. Everything about it is difficult: modeling, standing up an environment, building the harness, assessing results, building it into your deployment pipeline.</li><li>It’s critical to test against specific criteria. Don’t worry about getting your criteria wrong at first. You can change the criteria once you have real production data.</li><li>Don’t assume you’ll reach web-scale in month two. You’ll waste huge cycles prematurely optimizing both your application and your tests. (Don’t read this as us saying, “Don’t consider what your actual scale might be.” Just a suggestion that you be realistic and pragmatic.)</li><li>Utilize production monitoring to the greatest extent possible. A canary release can go a long way toward verifying the performance of a new version of your application.</li></ul><h3>Production monitoring</h3><p>Do you have a production monitoring strategy? Feedback loops aren’t only for pre-production phases. As much as we try to achieve dev/prod parity, production is truly a unique environment for most organizations and things can — and do — go wrong.</p><p>Here are some questions to help you assess your readiness:</p><ul><li>How quickly does your team know something is broken? Do they learn about it via monitoring? And then how fast can they respond?</li><li>Does your team ignore alerts?</li><li>Do your teams tend to invent an approach to monitoring as they go along? Believe it or not, we actually see this a lot and it’s not a good thing. Be as thoughtful about monitoring and alerts as you are with other parts or your application.</li><li>Do you keep a database of events so that you can later query for patterns?</li></ul><h3>User testing</h3><p>Sitting users down in front of your application and try it out is a critical feedback loop. In an enterprise setting, we like to see two type of user testing: usability testing and user acceptance testing. Usability testing verifies that users find the application easy to use. User acceptance testing verifies that users can complete transactions with the application in a real-world setting. There can be fair bit of overlap between the two types.</p><p>If you do not do user testing, you will struggle getting users to accept frequent releases of new versions. Users will only like rapid changes if the experience remains usable, consistent, and effective.</p><p>We also want to call out that these feedback loops are manual processes that often require weeks or months of elapsed time. They are typically not modeled into the deployment pipeline, and that’s fine. But do not leave them both batched up until the end. That’s a long wait period and likely an unknown amount of rework before deploying to prod. If you do this, your process will feel more like waterfall than CD. Run these user tests early and often, while you are writing the code.</p><h3>Exploratory testing</h3><p>All this talk of automation does not mean your testers should retire their analytical thinking and learn to program. In fact, test automation should free up your testers to do what they’re best at: use their brains. <a href="http://testobsessed.com/2006/04/rigorous-exploratory-testing/">Exploratory testing</a> is when a tester is simultaneously learning about the system, designing tests, and executing tests. It is when a tester gets into a deep flow, not even knowing what the next test is. This is where a good tester can really shine, doing some of their most valuable work.</p><p>For most types of applications, a test strategy should include skilled testers performing exploratory testing. This testing will find problems, teach you about your system, and inform your automated regression suite. As with user testing, this testing should be done throughout the development process and not as a gate at the end.</p><h3>Summary</h3><p>This list of feedback loops organizations should have in place before doing CD is not exhaustive (e.g., we didn’t discuss A/B testing). We have presented the more common feedback loops we see where CD has been successful. Obviously every situation presents different problems and has different needs.</p><p>You don’t need to have high marks on everything we have presented to begin your journey to CD. But if you are feeling only so-so against a majority of them, we’d suggest working on the individual pieces before approaching CD. Once you get enough of them in place, you will find that you’ve actually completed a large swath of your journey to Continuous Delivery.</p><p>In future parts of this series, we plan to explore culture, the last mile, and more.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f500e401aef8" width="1" height="1" alt=""><hr><p><a href="https://medium.com/continuous-delivery/are-you-ready-for-continuous-delivery-part-2-feedback-loops-f500e401aef8">Are you ready for Continuous Delivery? (Part 2: Feedback Loops)</a> was originally published in <a href="https://medium.com/continuous-delivery">Continuous Delivery</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[It’s not Continuous Delivery if you can’t deploy right now]]></title>
            <link>https://medium.com/continuous-delivery/its-not-continuous-delivery-if-you-can-t-deploy-right-now-34f2954713b5?source=rss-2aedefc37fcf------2</link>
            <guid isPermaLink="false">https://medium.com/p/34f2954713b5</guid>
            <category><![CDATA[pipeline]]></category>
            <category><![CDATA[continuous-delivery]]></category>
            <category><![CDATA[continuous-integration]]></category>
            <category><![CDATA[security-testing]]></category>
            <category><![CDATA[automation]]></category>
            <dc:creator><![CDATA[GoCD]]></dc:creator>
            <pubDate>Mon, 11 Jul 2016 04:22:40 GMT</pubDate>
            <atom:updated>2016-07-11T04:22:40.058Z</atom:updated>
            <content:encoded><![CDATA[<p><em>Posted by </em><a href="https://twitter.com/kmugrage"><em>Ken Mugrage</em></a><em>. This article was originally published on </em><a href="https://www.go.cd/2016/01/17/not-done-unless-its-done/"><em>GoCD’s blog</em></a><em>.</em></p><p>This is the first in a series of articles that will cover the types of pipelines you should implement to ensure your software is truly ready for production at any time. The culture changes required in most organizations are incredibly important, but I’m going to focus on some technical practices in this series.</p><p>Years ago, when I was in management, I had a favorite rule. If asked “is something done?” the answer could not include the word “except” or any of its synonyms.</p><p>“It’s done except for…” = “no”.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/0*53Z8PtbN4ztgGQng.png" /></figure><p>I hear people say all the time that they’re practicing continuous delivery. This declaration is often followed by something like, “I can let the security team know anytime”, or “I just have to run the performance tests”. If you can’t push your software to production right now, you’re not done with your continuous delivery journey.</p><h3>Some of the things you might not be running but should …</h3><p>In this article I’m going to give an overview of some of the types of pipelines that you should be running if you want your software to be ready to ship at all times. Of course this is not an exhaustive list, there are most likely things that are specific to what you’re doing that you should have, just as there are probably things that I will list that don’t make sense for you. The point is that everything possible should be automated as part of your deployment pipeline.</p><h3>Security testing</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/0*VCxBg0woJH9jb1n0.png" /></figure><p>All too often this is the primary category of tasks that don’t get run until everything else is “done”. This often results in issues that are very hard to track down since the time between tests has been very long. By writing these tests all the time you’ll have a much easier time tracking down issues before they become too hard to fix.</p><p>Many people feel it’s not the greatest idea to have the same person writing the security tests who is writing the code. There’s also the question of skillset; great security people are not common. It’s important that you use a Continuous Delivery server that is capable of using more than one build material for a single pipeline. That way these tests will run whenever the code or the tests are updated.</p><h3>Performance testing</h3><p>This one is probably the hardest to run all the time if for no other reason than hardware costs. To properly performance test many applications takes a serious dedication of resources. Luckily public and private cloud infrastructures have made this somewhat easier. Consider having a pipeline where the first stage spins up the machines you need either as virtual machines or containers, runs the tests, and then shuts down those machines.</p><p>In this day of “search for a term, hit the link, wait no more than 2 seconds for the page to load” performance is critical. To make matters worse, performance issues are often very hard to track down. You want to know as soon as possible if you’ve introduced a problem.</p><h3>Management of the environments</h3><p>It’s been said many times that it’s much easier to break an application by messing up the environment that it is by doing something wrong in the source code. If something like the security advisory comes out and you need to update systems as soon as possible, you should be able to commit the change to a configuration management tool, have that change picked up by your continuous delivery system and run it through exactly the same process as a code change.</p><h3>Testing of the deployment itself</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/0*sSKo9oJT88QwR2WN.png" /></figure><p>This isn’t really a type of pipeline all by itself. This is the concept that you should be deploying the software exactly the same way in every environment that you plan to deploy in production. Unfortunately it’s still not uncommon for people to copy over files to a QA server run test and only then run the actual deployment tool that pushes the same software to a production server.</p><p>No matter how you’re doing your actual production deployment, whether that is shell scripts, dedicated tools, configuration management tools, or others, you should be deploying in exactly the same way everywhere else. Consider using tools that can read environment specific details from environment variables or other inputs.</p><h3>Why wouldn’t you do this?</h3><p>One of the biggest objections I hear to running all of these types of pipelines on every change is that the pipeline will take too long to run. This is why having a continuous delivery server that’s capable of running multiple pipelines in parallel while ensuring that software doesn’t go any further if any of those pipelines fail is so important.</p><p>The other objection I hear the most is that people simply lack the automation around these areas. This is certainly valid, and I don’t want to pretend that any of this is easy to do. Don’t be afraid to start with what you can, and then add other things your pipeline as your capabilities grow. A continuous delivery pipeline is a bit of a living system it should be evolving along with your processes.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=34f2954713b5" width="1" height="1" alt=""><hr><p><a href="https://medium.com/continuous-delivery/its-not-continuous-delivery-if-you-can-t-deploy-right-now-34f2954713b5">It’s not Continuous Delivery if you can’t deploy right now</a> was originally published in <a href="https://medium.com/continuous-delivery">Continuous Delivery</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Why we open sourced our Functional Tests]]></title>
            <link>https://medium.com/continuous-delivery/why-we-open-sourced-our-functional-tests-470c4d9394c3?source=rss-2aedefc37fcf------2</link>
            <guid isPermaLink="false">https://medium.com/p/470c4d9394c3</guid>
            <category><![CDATA[open-source]]></category>
            <category><![CDATA[testing]]></category>
            <category><![CDATA[functional-tests]]></category>
            <category><![CDATA[automation]]></category>
            <category><![CDATA[continuous-delivery]]></category>
            <dc:creator><![CDATA[GoCD]]></dc:creator>
            <pubDate>Thu, 07 Jul 2016 10:20:56 GMT</pubDate>
            <atom:updated>2016-07-11T04:15:19.032Z</atom:updated>
            <content:encoded><![CDATA[<p><em>Posted by Rajiesh from the GoCD Team. This article was originally published on </em><a href="https://www.go.cd/2015/11/18/Open-Source-Tests/"><em>GoCD’s blog</em></a><em>.</em></p><p>Testing open source projects has its own set of problems. Unit and integration tests are added by the contributors, however end to end tests are added later or neglected. There are several reasons for this like not being aware of the end to end flow, complexity of automating tests for end to end systems. However to be confident about a release we need end to end tests. To maintain the healthy balance defined by a <a href="http://martinfowler.com/bliki/TestPyramid.html">test pyramid</a>, every release must have its system test cases reviewed and maintained and this needs collaboration.</p><p><strong>At GoCD we are have open sourced our functional tests.</strong> We believe open sourcing system tests will — improve quality through collaboration, make regression tests efficient, give the community a detailed picture of the system behavior and act as a live document for users.</p><h3>How GoCD is continuously tested</h3><p>Let’s take a brief tour of how GoCD does continuous testing. GoCD is built, tested and deployed using GoCD itself. Here’s a snapshot of the GoCD build pipeline.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Jc8KwWTnJZJfzJNv.png" /></figure><p>GoCD is tested using “Server in-the-box” model. In this model we define the system under test — its scope and its boundaries. External dependencies for the system under test (SUT) say git or yum repo are stubbed out or built into the SUT itself. The pipeline “qa packages” does the necessary jobs to bundle the stub code with production code, and then pass on the packages to “smoke” and “acceptance” pipelines to run the tests. Upon successful runs of the upstream pipelines, “distributions-all” pipeline packages only the production code.</p><h3>Test Classifications</h3><p>Below are the set of functional test types modeled into the GoCD pipelines. Each of them are run on single or multiple agents as per the size of the tests. Every agent will be cleaned of any previous versions of the build when a new build is started.</p><ul><li><em>Smoke</em>: As per the classic definition “smoke tests” validates the basic functionality of the system under test. It runs on 2 GoCD server agents — one on windows and one on linux</li><li><em>Acceptance</em>: These tests validates the necessary set of tests for each functionality or use case flow. It does not execute every scenario in the flow, but validates all possible flows. These tests are run on a total of 17 agents. Smoke and Acceptance are triggered by the upstream pipeline ‘qa packages”.</li><li><em>Regression</em>: A detailed set of tests which is exhaustive and comprehensive. This job is executed parallel in 17 agents. Regression tests are triggered when Smoke and Acceptance pipelines pass.</li><li><em>Performance</em>: This pipeline is under development, will discuss this on a separate blog</li></ul><h3>How this model helps continuous delivery</h3><p>Continuous delivery depends on a faster feedback loop. However Functional and Performance tests end up being bottlenecks. This can be reduced to a great extent by distributed tests.</p><p>Though not the only solution, it’s a first step to achieving the faster feedback loop. Further enhancements and optimizations are on the way.</p><h3>Twist to Gauge Migration</h3><p>GoCD functional tests were initially developed using ThoughtWorks Twist automation tool. Since Twist has hit end-of-life as a product and is being replaced by Gauge, we’ve migrated our tests to <a href="http://getgauge.io/">Gauge</a>. Moving to Gauge now helps us open source these tests (Twist was a commercial product).</p><p>Twist to Gauge migration is handled by the migration plugin bundled in Twist.</p><h3>Gauge Specifications</h3><p>Gauge specifications are in markdown language making it more readable. Gauge specs intend to be live documents of the system behavior</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/619/0*e9MKC-pfHCkB0TAc.png" /></figure><h3>Gauge Reports</h3><p>Gauge produces reports in an easily readable format and provides specification execution details like steps executed, time for each spec execution, overall test execution time, steps and specs passed, what failed and the screen shot of the failure page.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*VKeh9fluhgLKpxo5.png" /></figure><h3>Conclusion</h3><p>A distributed test environment and parallel execution are ways to support CD, by making long running tests short and getting faster feedback. Here we have addressed functional tests, we will soon be working on the performance tests.</p><p>If you would like to contribute to GoCD tests, please visit <a href="https://github.com/gocd/functional-tests">GoCD Functional Tests</a> for contribution.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=470c4d9394c3" width="1" height="1" alt=""><hr><p><a href="https://medium.com/continuous-delivery/why-we-open-sourced-our-functional-tests-470c4d9394c3">Why we open sourced our Functional Tests</a> was originally published in <a href="https://medium.com/continuous-delivery">Continuous Delivery</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Deploy a package, not just a tag, branch or binary]]></title>
            <link>https://medium.com/continuous-delivery/deploy-a-package-not-just-a-tag-branch-or-binary-454acbfaf5f7?source=rss-2aedefc37fcf------2</link>
            <guid isPermaLink="false">https://medium.com/p/454acbfaf5f7</guid>
            <category><![CDATA[continuous-deployment]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[deployment]]></category>
            <category><![CDATA[continuous-delivery]]></category>
            <category><![CDATA[docker]]></category>
            <dc:creator><![CDATA[GoCD]]></dc:creator>
            <pubDate>Mon, 27 Jun 2016 07:58:34 GMT</pubDate>
            <atom:updated>2016-06-27T07:58:34.082Z</atom:updated>
            <content:encoded><![CDATA[<p><em>Posted by Sriram Narayan. This article was originally published on </em><a href="https://www.go.cd/2014/02/24/deploy-package-not-just-tag-branch-or-binary/"><em>GoCD’s blog</em></a><em>.</em></p><p>In a section called <em>Principles and Practices of Build and Deployment Scripting</em>, <a href="http://continuousdelivery.com/">the CD book</a> suggests to <em>Use Your Operating System’s Packaging Tools</em>.</p><blockquote>“Deploying a bunch of files that need to be distributed across the filesystem is very inefficient and makes maintenance — in the form of upgrades, rollbacks, and uninstalls — extremely painful. This is why packaging systems were invented.”</blockquote><p>We concur. This is a good example of cross-pollination of good ideas between development and operations. Software development teams are increasingly packaging their applications using application-specific (<a href="http://maven.apache.org/ref/3.1.0/maven-model/maven.html">maven</a>, <a href="http://guides.rubygems.org/specification-reference/">gem</a>, <a href="https://pypi.python.org/pypi/wheel">wheel</a>, <a href="https://npmjs.org/doc/cli/npm-install.html">npm</a>,<a href="http://www.cpan.org/modules/INSTALL.html">cpan</a>…) or system (<a href="http://rpm5.org/">rpm</a>, <a href="http://www.debian.org/doc/manuals/debian-faq/ch-pkgtools.en.html">deb</a>, <a href="http://docs.nuget.org/">nuget</a>, <a href="http://www.hanselman.com/blog/IsTheWindowsUserReadyForAptget.aspx">chocolatey</a>…) packaging tools. Doing so has several advantages:</p><ol><li>Built in versioning (e.g. <a href="http://rpm5.org/">rpm</a>, <a href="http://www.debian.org/doc/manuals/debian-faq/ch-pkgtools.en.html">deb</a>, <a href="http://docs.nuget.org/">nuget</a>).</li><li>Dependency management.</li><li>Distribution via standardized repository layouts, metadata and protocol.</li><li>Transactional install/upgrade/uninstall via package managers.</li><li>Managing configuration files: OS packages know how to manage files that are expected to change after installation so you don’t lose your changes when you uninstall or override when you upgrade. e.g. rpm’s <a href="http://www-uxsup.csx.cam.ac.uk/~jw35/docs/rpm_config.html">%config macro</a>.</li><li>File verification: Packages have built-in checksums, which can be used for verification before a package is extracted and installed.</li><li>Signature verification (e.g. <a href="http://www.centos.org/docs/5/html/Deployment_Guide-en-US/s1-check-rpm-sig.html">rpm</a>).</li><li>Idempotence — Issuing the same package install/upgrade/uninstall multiple times leaves the system in the same state as issuing it once.</li><li>Auditability: OS packaging tools allows you to track <a href="http://unix.stackexchange.com/questions/4705/how-to-find-out-which-package-a-file-belongs-to">what package installed what file</a> in your system (versus files appearing or being changed at will)</li><li>Traceability — what repository did a package come from? (e.g. deb)</li><li>Infrastructure automation tools like Chef, Puppet and Ansible have good support for popular package management systems. Traditionally used for provisioning servers, and environments, these tools are increasingly being used for <a href="https://github.com/opscode/java-quick-start">application provisioning</a> — more on this point in a follow-up post.</li></ol><p>There you go — eleven good reasons to start creating packages for your components and applications and deploying from packages rather than from a tag, branch or binary.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/688/0*8SMbE9gxuZG0QyVu.png" /></figure><p>Thanks to <a href="http://www.dtsato.com/blog/about/">Danilo</a>, <a href="http://twitter.com/sriramnrn">Ram</a> for their insights on this topic.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=454acbfaf5f7" width="1" height="1" alt=""><hr><p><a href="https://medium.com/continuous-delivery/deploy-a-package-not-just-a-tag-branch-or-binary-454acbfaf5f7">Deploy a package, not just a tag, branch or binary</a> was originally published in <a href="https://medium.com/continuous-delivery">Continuous Delivery</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Using GoCD and Docker to manage your GoCD Agents]]></title>
            <link>https://medium.com/@goforcd/using-gocd-and-docker-to-manage-your-gocd-agents-5e5c91f95863?source=rss-2aedefc37fcf------2</link>
            <guid isPermaLink="false">https://medium.com/p/5e5c91f95863</guid>
            <category><![CDATA[docker]]></category>
            <category><![CDATA[spike]]></category>
            <category><![CDATA[agents]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[gocd]]></category>
            <dc:creator><![CDATA[GoCD]]></dc:creator>
            <pubDate>Wed, 22 Jun 2016 09:36:04 GMT</pubDate>
            <atom:updated>2016-06-22T09:36:04.147Z</atom:updated>
            <content:encoded><![CDATA[<p><em>Posted by </em><a href="https://twitter.com/kmugrage"><em>Ken Mugrage</em></a><em>. This article was originally published on </em><a href="https://www.go.cd/2014/05/18/manage-agents-with-docker/"><em>GoCD’s blog</em></a><em>.</em></p><p><em>[Update: It might be better to use the GoCD Docker images available on </em><a href="https://hub.docker.com/r/gocd/"><em>Docker Hub</em></a><em> as they are newer and better maintained and used by many in the GoCD community]</em></p><p>I’m convinced that the ability to automatically create and destroy build agents is key to having a flexible continuous delivery setup. I’m equally convinced that this particular use case is better satisfied using very fast container technologies instead of virtual machines. This is blog entry talks about using Docker for this challenge.</p><p><strong>IMPORTANT:</strong> It should be noted that this blog entry and code is the result of a spike. This definitely isn’t production ready, but could be useful if you’re thinking about doing the same sort of thing. This will only work on Linux machines, because Docker only works on Linux machines.</p><p>If anyone with more current programmer skills wants to fork and make it more production like, I’d be very happy to assist in any way I can.</p><h3>Setting it up</h3><ul><li>Install Docker</li><li>Install GoCD server</li><li>Install at least one GoCD agent if you want to use the pipeline — Yup, even though the whole idea here is to create and destroy agents automatically, we have to install at least one to run the process. The server needs this to actually run the scripts.</li><li>Once the GoCD agent is installed, go to the Agents tab in your GoCD user interface and assign this agent a resource of “manager” if you intend to use the GoCD pipeline below.</li><li>In order for GoCD (and anyone else) to run this without having to become root, you’ll have to follow the instructions under “Giving non-root access” at <a href="http://docs.docker.io/installation/ubuntulinux/">http://docs.docker.io/installation/ubuntulinux/</a>. I make absolutely no warranties for the security of following those instructions! Again, the point here (for me) was to spike out creating agents on the fly, this is not production code.</li></ul><h3>The pieces</h3><p>All of the scripts I’m using can be found <a href="https://github.com/kmugrage/go-agent-docker">here</a> . Please feel free to clone / fork / send pull requests.</p><ul><li><strong>Dockerfile</strong></li></ul><p>This is the file that defines how the docker image will be created. Normally you would run the docker build program against this file, but I used a shell script so that I could call it from GoCD easier later.</p><ul><li><strong>go-agent-14.1.0–18882.deb</strong> (no longer included)</li></ul><p>Update on 22 June — The Dockerfile has been updated to use wget to download the GoCD 14.1 agent debian installer. If you need the RPM version visit <a href="http://www.go.cd/download">www.go.cd/download</a> and change the Dockerfile to match your system.</p><ul><li><strong>go-agent</strong></li></ul><p>You’ll need to modify this file to set the IP address of your server. Just to make this more interesting, it needs to be the IP address that Docker is aware of, so probaly not the one you’re used to using.</p><p>You can find this IP address using ifconfig…</p><pre>ifconfig | grep -A 1 docker</pre><p>On my system, that returns…</p><pre>docker0   Link encap:Ethernet  HWaddr 56:84:7a:fe:97:99  <br>		  inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0</pre><p>Because that’s my address, that’s what you’ll see in the go-agent file. As much as I might appreciate your help in supplying agents for me, they won’t be able to connect if you don’t make this match your GoCD server.</p><ul><li><strong>autoregister.properties</strong></li></ul><p>This file takes advantage of the autoregister feature in GoCD so that I don’t have to manually approve the new agents. You’ll need to update the key based on the instructions <a href="https://docs.go.cd/current/advanced_usage/agent_auto_register.html">here</a>.</p><ul><li><strong>build_docker_image.sh</strong></li></ul><p>Once you’ve modified the above, you’re ready to build your containers. Execute this script at a command prompt.</p><p>This step could take quite a while depending on the speed of your internet connection. It has to download the base box, add Java and a bunch of other things and then create the image you’ll be using.</p><ul><li><strong>start_agent_containers.sh</strong></li></ul><p>This shell script starts docker containers from the image. You can control how many containers get started by editing the script itself.</p><ul><li><strong>stop_agent_containers.sh</strong></li></ul><p>This shell script <em>stops and removes all docker containers</em> — <strong>WARNING:</strong> I do mean all. If you run this on your box every single Docker container will be stopped and deleted. Did I mention this will remove <em>every single container</em> on your machine?</p><p>If someone that’s better with sed / awk / ? would like to modify to only remove the containers tagged with gocd/go-agent please feel free!</p><ul><li><strong>remove_agents.rb</strong></li></ul><p>This Ruby script removes disables and removes all agents on the GoCD server tagged with a “docker_created” resource.</p><ul><li><strong>go_config_xml_excerpt.txt</strong></li></ul><p>Everything above can be run from the command line just fine. Of course I wanted to have a GoCD pipeline manage all of this. This text file shows the pipeline definition for mine. You’ll need to change the github URL to point to your own. You’re welcome to use mine from above, but I removed it here just so your pipeline doesn’t get executed with my GitHub changes if you don’t want it to.</p><h3>Summary</h3><p>It’s my sincere hope that my first attempt to actually use Docker (and Ruby for that matter) will help you get something real done.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5e5c91f95863" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Build Promotion with GoCD]]></title>
            <link>https://medium.com/@goforcd/build-promotion-with-gocd-497bb5a7ad4d?source=rss-2aedefc37fcf------2</link>
            <guid isPermaLink="false">https://medium.com/p/497bb5a7ad4d</guid>
            <category><![CDATA[continuous-delivery]]></category>
            <category><![CDATA[continuous-integration]]></category>
            <category><![CDATA[build-promotion]]></category>
            <category><![CDATA[gocd]]></category>
            <dc:creator><![CDATA[GoCD]]></dc:creator>
            <pubDate>Wed, 22 Jun 2016 06:21:21 GMT</pubDate>
            <atom:updated>2016-06-22T06:21:21.818Z</atom:updated>
            <content:encoded><![CDATA[<p>A typical build may have to clear several hurdles before it can be considered fit for release. For example:</p><ol><li>Unit tests</li><li>Static and dynamic metric thresholds (e.g. toxicity, coverage)</li><li>Packaging</li><li>Integration tests</li><li>UI tests</li><li>Performance tests</li><li>Regression tests</li><li>Deployment tests (install, uninstall, upgrade)</li><li>Manual exploratory tests</li><li>Regulatory, compliance checks</li><li>Clearance from UAT, staging</li></ol><p>Each of these hurdles may be viewed as a promotion level for the build (although, in practice, formal promotion levels are more coarse-grained). These promotion levels may be activated automatically (by the success of the previous level) or manually (by approved promoters). Note that these levels are very different from what is encountered in a source promotion model.</p><h3>Avoid source or stream promotion models</h3><p>In an earlier post, we said: <a href="http://www.thoughtworks.com/insights/blog/deploy-package-not-just-tag-branch-or-binary">“Deploy packages, not just a tag, branch or binary”</a>. With respect to promotions, we could say:</p><p>“<em>Promote packages</em>, not just a tag, branch/stream or binary”</p><p>Promoting at the level of source (rather than package) violates the build-once rule — one of the key principles outlined in the <a href="http://continuousdelivery.com/">CD book</a>:</p><p>“…the binaries you release should be the same binaries that have been through the rest of your deployment pipeline, so you can be sure that what you release is what you tested. Apart from the fact that nobody has tested the binaries that came from the release stream, there is also a chance that differences could be introduced in the build process, perhaps by the operations team using a different minor revision of the compiler or a different version of some dependency. Such differences can lead to bugs in production that take days to track down.”</p><p>Because of this, a source/stream promotion model is fundamentally unfit for the world of continuous delivery:</p><p>“One of the objectives of the deployment pipeline is to allow frequent check-ins to mainline on large teams which may result in temporary instabilities, while still allowing you to get rock-solid releases out of the door. In this sense, <em>the deployment pipeline is antithetical to the source promotion model</em>. The main advantage of the deployment pipeline lies in the rapid feedback you get on the effect of every change on the fully integrated application — something that is impossible in the source promotion model.”</p><h3>Use your CI/CD server to manage promotions</h3><p>Source based promotion models probably made more sense in a pre-CD era when the version control system was the only source of truth for the level of readiness of a codebase. <em>Today, the CD tool is a more appropriate system of record for builds (and deployments) and their promotions</em>. Again, the CD book backs this up:</p><p>“The other essential facility that must be provided by the tool you use to manage your deployment pipeline is the ability, for each stage, to see which builds have passed all the previous stages in the pipeline and are hence ready for the next stage. It should then be possible to choose one of these builds and press a button to have it deployed. This process is known as promotion.</p><p>Promoting builds at the press of a button is what turns the deployment pipeline into a pull system, giving everybody involved in the delivery process the ability to manage their own work”</p><h3>Model your promotion process into the CD tool</h3><p>In general, a build/deployment pipeline is also a promotion pipeline. GoCD’s support for pipelines and stages with automatic or manual approvals makes it easy to model and <a href="https://docs.go.cd/current/navigation/value_stream_map.html">visualize</a> your promotion process into the <a href="http://www.thoughtworks.com/insights/blog/how-do-i-do-cd-go-part-2-pipelines-and-value-streams">CD value stream</a>. A stage runs only when the previous stage has passed — this is like an automatic promotion gate. <a href="https://docs.go.cd/current/configuration/dev_choose_when_stage_runs.html">Manual</a> stage<a href="https://docs.go.cd/current/configuration/dev_authorization.html#adding-authorization-to-approvals">approvals</a> may also be used where needed.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/0*Pv4H6IDOeABqxfDh.png" /></figure><p><strong>Modeling promotion levels (P1…P4) itno the CD value stream</strong></p><h3>GoCD 13.3 (and up)</h3><p><a href="https://docs.go.cd/current/extension_points/package_repository_extension.html">GoCD</a> adds more support by letting you store your packages in a first-class external package repository and yet activating different promotion levels within the tool. We now have three ways of activating a promotion level manually or automatically:</p><ol><li>Stage n activating stage n+1</li><li>Pipeline X activating Pipeline Y <a href="https://docs.go.cd/current/configuration/managing_dependencies.html">(pipeline dependency)</a></li><li>Pipeline Y getting activated by the updation of a package in a package repository (package material dependency)</li></ol><p>There are situations when we could use either #2 or #3 above to model a promotion. The <a href="https://docs.go.cd/current/extension_points/package_repository_extension.html#value-stream-modeling-tip">package material</a> docs has a section on this.</p><p>Support for package material has been implemented as an extension point. Plugins written to this extension point can provide support for different types of repositories. A <a href="https://docs.go.cd/current/extension_points/yum_repository_poller.html">yum plugin</a> is bundled along with GoCD Server 13.3 (and up). Other non-bundled package material plugins are <a href="http://thoughtworksinc.github.io/go-external-plugins/">listed here</a>.</p><p>Happy packaging and promoting!</p><p><em>Posted by </em><a href="https://twitter.com/sriramnarayan">Sriram Narayan</a><em>. This article was published on </em><a href="https://www.go.cd/2014/02/24/build-promotion-go/"><em>GoCD’s blog</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=497bb5a7ad4d" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Model Everything to fail fast]]></title>
            <link>https://medium.com/@goforcd/model-everything-to-fail-fast-8e188e7bac10?source=rss-2aedefc37fcf------2</link>
            <guid isPermaLink="false">https://medium.com/p/8e188e7bac10</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[continous-integration]]></category>
            <category><![CDATA[continuous-delivery]]></category>
            <category><![CDATA[devops]]></category>
            <dc:creator><![CDATA[GoCD]]></dc:creator>
            <pubDate>Wed, 22 Jun 2016 04:40:49 GMT</pubDate>
            <atom:updated>2016-06-22T04:40:49.122Z</atom:updated>
            <content:encoded><![CDATA[<p>Every time any change is introduced — application, database script, automated test, infrastructure, deployment script, configuration, etc. — the change should kick off a gauntlet of validation. The quicker you can find out if a change breaks something the better off you are and the more confidence you will have in your software. We tell the teams who want to go faster that they need to fail fast. We built <a href="https://go.cd/">GoCD</a> to give teams the power to model and remodel a Build-Test-Release workflow so that they get super quick feedback on every change. And if something breaks, great, find it fast, fix it fast, and then run the new version through the gauntlet.</p><h3>A common workflow to fail fast</h3><p>Here’s a generic but common Build-Test-Release workflow. Each code commit will trigger a new release candidate and run through the gauntlet, left to right. Every workflow step is tasked to find an issue with the version of the software it is building, testing or deploying.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/650/0*YKUn0Y0xTVzuRzHx.png" /></figure><p>To shorten the feedback loop:</p><ul><li>The activities within each workflow step can run in parallel.</li><li>The workflow steps are sequenced to run the most important things first.</li><li>Four build pipelines can run in parallel.</li><li>Four acceptance test pipelines can run in parallel.</li><li>Six different test environments can run in parallel.</li></ul><h3>Know what’s going on in a workflow</h3><p>It’s important a team has a holistic context for every release candidate. Every tool talks about “visibility” and “traceability”. A tool that can easily answer these questions provides visibility and traceability:</p><ul><li>Which dependency or commit broke the build?</li><li>Who broke the build?</li><li>What’s the difference between these 2 builds?</li><li>Which features and bug fixes are in this release candidate?</li><li>Which version of our software is running in this environment?</li><li>Who deployed in this environment and when?</li></ul><h3>How will modeling a workflow help a team fail fast?</h3><p>Let’s say a release candidate needs to pass 11 steps (gauntlet) before it can make it to an enduser. Sequence is important. The goal is to fail fast. A flat workflow will return feedback but it’s slow since only one step will run at a time.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/601/0*I2xHHvlCZHZbrmB4.png" /></figure><p>If it turns out that a few steps can be run in parallel, you will speed up your workflow.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/549/0*8aNuJKRFlgJHHweM.png" /></figure><p>Speed things up even further by increasing the amount of parallelization.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/444/0*oEF-jH7UjACJjFh0.png" /></figure><p>Over time you may find other areas in your Build-Test-Release workflow where you can speed up your feedback loop. This workflow will find an issue much faster than the flat one we started with.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/392/0*03-Yy0eyDoGVx16G.png" /></figure><h4>Sequencing and parallelization in GoCD</h4><p>A GoCD pipeline is a building block (*). Teams using GoCD will come together and model an end-to-end Build-Test-Release workflow by chaining pipelines together. Part of this collaboration is figuring out the sequence of workflow steps and where parallelization makes sense.</p><p>Sequencing workflow steps will define priority:</p><p>i) Execute the most important activities first:</p><ul><li>Automated acceptance tests before performance tests.</li></ul><p>ii) Execute the shortest activities first:</p><ul><li>Unit tests before smoke tests.</li><li>Smoke tests before automated acceptance tests</li></ul><p>Parallelization will speed things up:</p><p>i) Parallelize activities within a workflow step:</p><ul><li>Speed up an acceptance test suite.</li></ul><p>ii) Parallelize different workflow steps:</p><ul><li>Run acceptance tests, performance tests and exploratory testing at the same time.</li></ul><h3>We treat a workflow as a single entity</h3><p>It’s extremely important to us that the core behavior of a single pipeline is maintained in a workflow (chain of pipelines), no matter the model. GoCD allows teams to model as they wish and handles stuff like artifact management and if a release candidate should advance to the next step. A lot of the intelligence comes down to <a href="http://support.thoughtworks.com/entries/22229668-Go-s-Dependency-Management">how GoCD manages dependencies</a>. We’re proud of this intelligence, especially the “fan-in” support. This is where GoCD really shines.</p><p>(*) Jez Humble and David Farley talk about a <a href="http://www.informit.com/articles/article.aspx?p=1621865">“deployment pipeline”</a> in their book, Continuous Delivery. A core domain concept in GoCD is called a “pipeline”. They are not the same thing.</p><ul><li>The book talks about the “deployment pipeline” in a holistic sense, a <strong>pattern</strong> that can be implemented to model your path to production. They summarize a deployment pipeline as “in essence, an automated implementation of your application’s build, deploy, test, and release process”.</li><li>GoCD is a Continuous Delivery tool that allows teams to implement that pattern via GoCD <em>pipelines</em>. A GoCD pipeline is a building block. GoCD pipelines are a way to implement a deployment pipeline. The product overloads the term. On behalf of Jez, sorry!</li></ul><p><em>Posted by </em><a href="https://twitter.com/photaisach"><em>Mark Chang.</em></a><em> This article was published on </em><a href="https://www.go.cd/2014/02/24/model-everything-fail-fast/"><em>GoCD’s blog</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8e188e7bac10" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Tracing our path to Production — Mingle’s Journey using GoCD]]></title>
            <link>https://medium.com/@goforcd/tracing-our-path-to-production-mingles-journey-using-gocd-31ce8d919556?source=rss-2aedefc37fcf------2</link>
            <guid isPermaLink="false">https://medium.com/p/31ce8d919556</guid>
            <category><![CDATA[continuous-delivery]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[mingle]]></category>
            <category><![CDATA[continuous-integration]]></category>
            <dc:creator><![CDATA[GoCD]]></dc:creator>
            <pubDate>Tue, 21 Jun 2016 10:30:39 GMT</pubDate>
            <atom:updated>2016-06-21T10:30:39.724Z</atom:updated>
            <content:encoded><![CDATA[<p>Ever since the <a href="https://www.thoughtworks.com/mingle/">Mingle</a> team started working on its new cloud offering we made a conscious effort to improve our ability to continuously deliver valuable features and enhancements to our production environment. I expected that frequent deployments, tons of automation and lots of learning about Amazon’s AWS would come with the territory — and it did. What I didn’t expect was that I’d end up asking and answering so many questions dealing with when feature X or bug fix Y would be ready for testing and when it would be ready to be promoted to production.</p><p>With a traditional release structure all features and bug fixes are released at once, so it is an easy task to determine which features and bug fixes would be released. When we moved to a schedule that pushed new features and bug fixes into our cloud environment as soon as they were ready, we found ourselves with a new crop of questions on our hands.</p><h3>Tracing features and bugs through a non-trivial build setup was not as easy as it should be</h3><blockquote><em>What features and bugs will be in tonight’s deployment to production?</em></blockquote><blockquote><em>When can we start to dogfood this new feature in our staging environment?</em></blockquote><blockquote><em>That bug fix we put in, where is that in our pipelines?</em></blockquote><blockquote><em>Are we going to start testing it today?</em></blockquote><p>I find myself answering or asking some variant of the questions above multiple times a day. Either because I’m eager to start testing a new fix, or because I want to help set our product managers expectations properly, or because we want to know when a customer will be happy because we’ve responded to their feedback, or… you get the idea.</p><p>We have multiple pipelines in our path to production. For legacy reasons we have pipelines that run tests using different browsers, databases and operating systems. We also run upgrade tests and performance tests at different frequencies based on need. Since we have a number of pipelines chained together it isn’t always easy to know where a given change is in our deployment process. Consequently, it is difficult to answer questions about what features are in a given build or when a bug fix will be available for testing.</p><h3>GoCD’s value stream mapping feature</h3><p>To answer each of the above questions, we now refer a lot to the new value stream mapping feature in <a href="https://go.cd/">GoCD</a>. From any build we can now zoom in to find upstream and downstream pipelines and basically trace a single revision all the way through to production. Below is an example of the overview for a recent build that we are waiting to see promoted to our staging environment (called pasty).</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*nG3Ia43_g0Mopwl7.png" /></figure><p>The map above shows the key pipelines involved in the flow from our tests using Firefox and Oracle 11g all the way through to testing our hosting environment. Once the ‘mingle-saas’ pipeline is green I know that the targeted bug fix will be ready for deployment to our dogfooding environment (called ‘pasty’).</p><h3>Seeing the big picture improves understanding</h3><p>To answer our key questions easily we needed a big picture view of our pipelines. We needed to know more about our pipeline dependencies and where are artifacts are flowing. These days I find myself using the value stream map multiple times a day and I use it in conjunction with our card wall to drive conversations with our product manager around which new features and bug fixes will be included in the next deployment and when that deployment is likely to be done.</p><p>One added benefit we’ve gained from the value stream map is that I now have a much better understanding of the different pieces of our deployment process. This has definitely helped in conversations with the developers:</p><blockquote><em>Developer: “We just have to wait for the GreenInstallers build to pass…”</em></blockquote><blockquote><em>Me: “GreenInstallers… ah yes I know exactly where that fits in the overall process so I have a good idea about when that build will be ready. Thanks.”</em></blockquote><p>I think it’s safe to say that the new value stream map is my new favorite feature in GoCD.</p><p><em>Posted by </em><a href="https://www.linkedin.com/in/sturnquest"><em>Scott Turnquest</em></a><em>. This article was published on </em><a href="https://www.go.cd/2014/02/24/tracing-our-path-production/"><em>GoCD’s blog</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=31ce8d919556" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Are you ready for Continuous Delivery? (Part 1)]]></title>
            <link>https://medium.com/continuous-delivery/are-you-ready-for-continuous-delivery-part-1-22b592294421?source=rss-2aedefc37fcf------2</link>
            <guid isPermaLink="false">https://medium.com/p/22b592294421</guid>
            <category><![CDATA[gocd]]></category>
            <category><![CDATA[continuous-integration]]></category>
            <category><![CDATA[continuous-delivery]]></category>
            <category><![CDATA[automation]]></category>
            <dc:creator><![CDATA[GoCD]]></dc:creator>
            <pubDate>Mon, 20 Jun 2016 15:25:06 GMT</pubDate>
            <atom:updated>2016-06-20T15:25:06.832Z</atom:updated>
            <content:encoded><![CDATA[<p>During the 10 plus years ThoughtWorks has been in the <a href="https://www.thoughtworks.com/continuous-delivery">Continuous Delivery</a> ecosystem, we’ve regularly come across people wanting to try our tools GoCD and Snap CI as they start their journey toward Continuous Delivery (CD). Very often, in attempting to support teams new to CD, we suggest that they pause any tool evaluation and consider whether their organization is actually ready to embark on this journey. If you do not frankly assess your teams’ readiness, the result can be a massive failure. The path to CD should not start by immediately adopting a CD tool.</p><p>This is the first part of a series of posts about Continuous Delivery infrastructure, culture, and process. In this first post, we’ll present questions you need to answer honestly about your own people, teams, and organization to determine your readiness for Continuous Delivery.</p><h3>Part 1: Practices</h3><h3>Do you put everything into version control?</h3><p>A foundation of CD is the ability to put a specific version of your application into a given environment at any point in time. CD is actually quite fussy about this. It’s a must. And this can only be done by:</p><ul><li>Putting everything needed to make your application into a version control system</li><li>Any time you change anything, push the changes to version control.</li><li>Write an automated script that, given a version, checks out everything from version control and assembles your application.</li></ul><p>CD is impossible when software teams (or the people on a single team) work in isolation from each other. When development work happens in isolation, large periods of integration and testing are required at the end of the development phase. This results in long periods during which your application cannot be released. Avoiding these lengthy integration phases requires that your work be as visible to, and usable by, others as soon as possible. Our preferred mechanism for doing this is called trunk-based development:</p><ul><li>Everyone regularly pulls others’ changes from version control.</li><li>Everyone regularly pushes their changes to version control.</li><li>Everyone works in the same place in version control, typically called “trunk” or “master”.</li></ul><p>If you are new to trunk-based development, it might sound ridiculous. But the practices of CI, unit testing, and trunk-based development all playing together, not only makes it reasonable, but a truly pleasant way of working.We don’t have space here to go into the details of making trunk-based development work, but know that it cannot work without version control.</p><p>Even if you aren’t planning to do CD, start putting everything into version control now. And we mean everything. Not just your source code. Everything can include images, database scripts, tests, configuration, libraries, documentation, and more. Source code won’t be enough if you need to get back to a specific version of your application, infrastructure, etc. Also, this encourages your entire team — not just the developers — to collaborate.</p><h3>Do your developers practice Continuous Integration (CI)?</h3><p>For CD to be successful, the entire organization must trust that your software is high quality and always in a working state. In terms of development team practices, CI is the fundamental building block to achieve this level of trust.</p><p>So what is CI? Well, <a href="http://www.martinfowler.com/articles/continuousIntegration.html">much has been written about CI</a>, but here’s the TL;DR version:</p><ul><li>Developers check code into trunk/master multiple times each day.</li><li>Developers maintain a suite of unit tests that verify the code works before merge, locally, and post merge, on an integration machine or CI server.</li></ul><p>The end result is a development team that has high trust that the code in trunk/master actually works. This will leave the development team more willing to push code to testers, or even production, more regularly. With this in place, trust between the groups will quickly grow.</p><p>Our experience has been that development teams can only move quickly by combining unit testing, refactoring, and CI. That’s a discussion too broad for discussion here, but know that your teams will never deliver at a fast pace without CI.</p><p>If your developers are not practicing CI we would recommend putting your move to CD on hold and shift your focus entirely to supporting the adoption of CI.</p><h3>Do you automate relentlessly?</h3><p>CD is very dependent on automation. Automation everywhere is crucial to achieving trusted, one-click, low drama deployments. Manual processes are error-prone and do not lend themselves to repeatability. To practice CD, the entire team needs to get into the mindset of relentless automation of nearly everything.</p><p>This mindset means asking “Why can’t this be automated?” every time anyone on the team does anything manually more than once. Some components and aspects of your process that need automation are:</p><ul><li>Tests at different levels, such as unit, integration, UI, regression, security and performance</li><li>Database schema creation, data migration and rollback</li><li>Installer creation and signing (if you have them)</li><li>Generation of documentation for every release</li><li>Last-mile deployment of your application to any environment</li><li>Provisioning of infrastructure all the way from test environments to production</li><li>Provisioning of developer workspaces</li></ul><p>We mentioned error reduction and repeatability. There are dozens of other compelling reasons to relentlessly automate. We have a few favorites:</p><ul><li>Scripts codify team knowledge. This ups your bus factor. That’s a good thing.</li><li>It encourages consistency across environments. Once you have a script working in one environment, you’ll want to use it everywhere.</li><li>The output of these scripts provides a detailed audit trail that is hard to match manually.</li></ul><p>Relentless automation might seem daunting, particularly if you’re focused on something that truly cannot be automated, such as exploratory testing. In our experience, there will be many more parts of your process that can be automated than those that cannot. The best approach is to figure out the manual processes you are already using, and then make a plan to gradually automate them. As you begin to achieve small successes, you will want to automate more and more.</p><p>If your team is hesitant to automate and cannot be convinced about the need, you might have to consider if there’s enough maturity in your team to move toward CD. An automation mindset is a firm prerequisite for CD.</p><h3>Conclusion</h3><p>There are numerous small steps you can take early in your CD journey that will have immediate, positive impacts. Don’t waste time flailing around with CD tools if you’ve got a bunch of low-hanging fruit that can provide high value quickly. Also, this approach will set you up for success once you do feel the need to adopt an end-to-end CD tool.</p><p>In coming posts we will present similar sets of questions for you to consider in the areas of infrastructure, application design, process, and culture.</p><p><em>Posted by </em><a href="https://twitter.com/david_j_rice"><em>David Rice</em></a><em> &amp; </em><a href="https://twitter.com/arvindsv"><em>Aravind SV</em></a><em>. This article was originally published on </em><a href="https://www.go.cd/2016/01/25/are-you-ready-for-continuous-delivery/"><em>GoCD’s blog</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=22b592294421" width="1" height="1" alt=""><hr><p><a href="https://medium.com/continuous-delivery/are-you-ready-for-continuous-delivery-part-1-22b592294421">Are you ready for Continuous Delivery? (Part 1)</a> was originally published in <a href="https://medium.com/continuous-delivery">Continuous Delivery</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>