{"id":949,"date":"2021-10-19T15:48:10","date_gmt":"2021-10-19T15:48:10","guid":{"rendered":"https:\/\/smartnet.ua\/?p=949"},"modified":"2021-10-19T15:49:09","modified_gmt":"2021-10-19T15:49:09","slug":"how-to-migrate-legacy-code-bases-to-continuous-delivery","status":"publish","type":"post","link":"https:\/\/smartnet.ua\/en\/blog\/how-to-migrate-legacy-code-bases-to-continuous-delivery\/","title":{"rendered":"How to migrate legacy code bases to continuous delivery"},"content":{"rendered":"<div>\n<p role=\"heading\" aria-level=\"1\">When starting a greenfield project, it&#8217;s easy to take advantage of the most modern development practices. An engineering team can create a new project in Azure or AWS and, with a few clicks, have it auto-deploying onto the team&#8217;s\u00a0platform of choice in no time.<\/p>\n<\/div>\n<div>\n<p>But what about the rest of us, who are working on codebases that are more than five minutes old? How do you take code that&#8217;s four years old and hundreds of thousands of source lines long\u00a0and turn that into a\u00a0lean, mean, continuous-deploying machine? How do you build a road map to go from a product that may take weeks or months to deploy out to customers into one that may deploy several times an hour?<\/p>\n<p>And how do you ensure that your product that&#8217;s deploying several times an hour is doing so safely and sanely, and isn&#8217;t shoveling bad patch after bad patch onto your production system?<\/p>\n<div>\n<h3>Start with an honest assessment<\/h3>\n<p>There\u2019s more to the process than simply &#8220;go slow and iterate.&#8221;\u00a0It starts with identifying clearly and honestly where your codebase and team are with regard to deployments and knowing where you want to go.<\/p>\n<p>Not every project will be appropriate to continuously deploy to production, and that&#8217;s okay! Any step taken down the road to automate the build-and-deploy pipeline will pay dividends in overall developer productivity and code quality.<\/p>\n<\/div>\n<div>\n<p>But what are those dividends? Why does continuous delivery matter? In their book,\u00a0<em>Accelerate: The Science of Lean Software and DevOps: Building and Scaling High Performing Technology Organizations,<\/em>\u00a0Nicole Forsgren,\u00a0Jez Humble, and\u00a0Gene Kim\u00a0elaborate on several studies they have carried out over the last few years.<\/p>\n<div>\n<p>They\u00a0tracked performance metrics ranging from company success to employee retention across organizations with varying levels of continuous delivery practices. Among the tangible benefits that were statistically significant, they found specifically that high-performing organizations:<\/p>\n<\/div>\n<div>\n<div>\n<ul>\n<li>Had a 50% advantage in market capitalization growth over three years when compared to low-performing organizations<\/li>\n<li>Spent 50% less time remediating security issues<\/li>\n<li>Were twice as likely to be recommended as a great place to work\u00a0by their employees<\/li>\n<\/ul>\n<\/div>\n<div>\n<p>Then\u00a0what does it mean to be a high-performing organization? And how does a low-performing organization transition to a high-performing one?<\/p>\n<div>\n<div>\n<h3>The four pillars of continuous capabilities<\/h3>\n<\/div>\n<\/div>\n<div>\n<div>\n<p>To achieve full continuous delivery, you need\u00a0four main pillars of capabilities. Each has its own distinct stages.<\/p>\n<div>\n<div>\n<h4>Source control<\/h4>\n<p>Does the entire team use source control? Do they have practices that are conducive to continuous delivery, such as\u00a0GitHub\u00a0Flow\u00a0or\u00a0trunk-based development?<\/p>\n<div>\n<div>\n<h4>Software quality<\/h4>\n<p>Are there automated tests? Do they pass reliably? Do they extend beyond simple\u00a0unit tests and into the more specialized testing areas? Can you run them at will?<\/p>\n<\/div>\n<\/div>\n<div>\n<div>\n<h4>Deployment<\/h4>\n<p>Are production builds created and deployed entirely by automation? Is there\u00a0infrastructure as code\u00a0to allow predictability and maintainability in the deployment architecture? Can you deploy services individually, or does everything deploy as a monolith?<\/p>\n<h4>Monitoring<\/h4>\n<p>Do you\u00a0collect logs?\u00a0Do you collect metrics?\u00a0Are they set up to alert for failures? Do you have traceability for failures across the entire stack?<\/p>\n<figure id=\"attachment_950\" aria-describedby=\"caption-attachment-950\" style=\"width: 1024px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/smartnet.ua\/wp-content\/uploads\/2021\/10\/continuous_delivery_pillars.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-950 size-large\" src=\"https:\/\/smartnet.ua\/wp-content\/uploads\/2021\/10\/continuous_delivery_pillars-1024x385.png\" alt=\"Figure 1: The four main pillars of capabilities you need to achieve full continuous delivery.\" width=\"1024\" height=\"385\" srcset=\"https:\/\/smartnet.ua\/wp-content\/uploads\/2021\/10\/continuous_delivery_pillars-1024x385.png 1024w, https:\/\/smartnet.ua\/wp-content\/uploads\/2021\/10\/continuous_delivery_pillars-600x226.png 600w, https:\/\/smartnet.ua\/wp-content\/uploads\/2021\/10\/continuous_delivery_pillars-300x113.png 300w, https:\/\/smartnet.ua\/wp-content\/uploads\/2021\/10\/continuous_delivery_pillars-768x289.png 768w, https:\/\/smartnet.ua\/wp-content\/uploads\/2021\/10\/continuous_delivery_pillars-1536x577.png 1536w, https:\/\/smartnet.ua\/wp-content\/uploads\/2021\/10\/continuous_delivery_pillars-2048x770.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption id=\"caption-attachment-950\" class=\"wp-caption-text\">Figure 1: The four main pillars of capabilities you need to achieve full continuous delivery<\/figcaption><\/figure>\n<div>\n<div>\n<p>It&#8217;s important to know not just what stage your project currently is in, but what it means to be in that\u00a0stage. At each point, significantly different types of work are needed to advance to the next stage in the process, and each stage is correlated with a reasonable delivery strategy along the spectrum, from fully\u00a0manual to fully automated.<\/p>\n<\/div>\n<\/div>\n<div>\n<div>\n<p>Similarly, it doesn\u2019t make sense to\u00a0tackle the work from a far-future stage if you have not yet cleared all the requirements for the next one. For example, there&#8217;s not much benefit to tracking your UI code coverage metrics across builds if you&#8217;re not even reliably running your unit tests during those builds.<\/p>\n<\/div>\n<\/div>\n<div>\n<div>\n<p>This is very much a new-and-evolving field of software engineering. Processes that were previously imaginable at only the very largest and most engineering-wealthy companies, such as Google and Twitter, are now achievable for those of us in small and medium-sized organizations as well.<\/p>\n<\/div>\n<div>\n<h3>How the practices break down<\/h3>\n<\/div>\n<div>\n<p lang=\"EN-US\">The maturity of each practice breaks down into four stages, where a 1 indicates a relatively immature practice and a 4 indicates an extremely mature one that&#8217;s based on currently available technology.<\/p>\n<\/div>\n<div>\n<h4>Source control practices<\/h4>\n<\/div>\n<div>\n<ol>\n<li>A source control system might exist. Maybe. Probably.<\/li>\n<li>A source control system definitely exists but makes\u00a0inefficient use of branches\u2014either too many with deeply nested levels, or too few. Merges might be a complex and fraught practice.<\/li>\n<li>Developers generally use a current source control system and follow a defined practice, such as GitHub Flow. Branches probably live for one week on average, and merges are medium-to-large.<\/li>\n<li>All developers practice main trunk-based development\u00a0with frequent, easily digestible commits to master\u2014perhaps even daily.<\/li>\n<\/ol>\n<div>\n<div>\n<h4>Quality practices<\/h4>\n<\/div>\n<div>\n<ol>\n<li>Very few automated tests, and definitely no automated test runs. Not all tests pass. The most common refrain is, &#8220;It works on my machine!&#8221;<\/li>\n<li>Automated unit tests exist and are run with every merge to master and are generally reliable. Integration\/service tests may exist but are probably manual or else small in number.<\/li>\n<li>Test metrics such as code quality are routinely collected and tracked, and are used as gates to merging commits. Integration\/service tests are automated and reliable. Specialty tests exist but are probably run manually.<\/li>\n<li>Specialty tests such as performance, security, etc. are run automatically. All test passes are automatic and can run on demand for any change at any state in development.<\/li>\n<\/ol>\n<\/div>\n<\/div>\n<div>\n<div>\n<h4>Deployment practices<\/h4>\n<\/div>\n<div>\n<ol>\n<li>Builds are sometimes created and deployed from a developer&#8217;s machine and pushed into production.<\/li>\n<li>Builds are created from an automated build system and are deployed from within the automated system. There may be some manual steps, but they are of extremely limited scope and count.<\/li>\n<li>Components are built automatically and can be deployed independently from the whole. There are no manual steps in a deployment beyond pushing a button.<\/li>\n<li>Everything is containerized. Developers can run a release build as easily on their machine as they could in production.<\/li>\n<\/ol>\n<div>\n<div>\n<h4>Monitoring practices<\/h4>\n<\/div>\n<\/div>\n<div>\n<div>\n<ol>\n<li>Logs exist on individual servers but aren\u2019t aggregated in any way. Tracing issues is a problem.<\/li>\n<li>Logs are semi-structured at least, and are centrally aggregated for searching across machines and environments<\/li>\n<li>Metrics\/counters exist to answer aggregate questions about system health and to supplement server logs providing deep dives on individual issues.<\/li>\n<li>Full observability achieved; logs are well-structured and appropriately leveled. Counters are standardized. It is possible to readily trace a request across many different parts of a system.<\/li>\n<\/ol>\n<div>\n<div>\n<h3>Putting it all together<\/h3>\n<\/div>\n<\/div>\n<div>\n<p role=\"heading\" aria-level=\"1\">To build a reasonable road map, an organization must first determine at what stage it is currently operating. Do an honest survey of the displayed capabilities for each of the four pillars to determine\u00a0which level you&#8217;re at.<\/p>\n<figure id=\"attachment_951\" aria-describedby=\"caption-attachment-951\" style=\"width: 1024px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/smartnet.ua\/wp-content\/uploads\/2021\/10\/continuous_delivery-stages.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-951 size-large\" src=\"https:\/\/smartnet.ua\/wp-content\/uploads\/2021\/10\/continuous_delivery-stages-1024x413.png\" alt=\"Figure 2: When the four stages of each of the pillars are laid out together, it's easy to see what delivery stage is appropriate for each aggregate of capabilities.\" width=\"1024\" height=\"413\" srcset=\"https:\/\/smartnet.ua\/wp-content\/uploads\/2021\/10\/continuous_delivery-stages-1024x413.png 1024w, https:\/\/smartnet.ua\/wp-content\/uploads\/2021\/10\/continuous_delivery-stages-600x242.png 600w, https:\/\/smartnet.ua\/wp-content\/uploads\/2021\/10\/continuous_delivery-stages-300x121.png 300w, https:\/\/smartnet.ua\/wp-content\/uploads\/2021\/10\/continuous_delivery-stages-768x310.png 768w, https:\/\/smartnet.ua\/wp-content\/uploads\/2021\/10\/continuous_delivery-stages-1536x619.png 1536w, https:\/\/smartnet.ua\/wp-content\/uploads\/2021\/10\/continuous_delivery-stages-2048x826.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption id=\"caption-attachment-951\" class=\"wp-caption-text\">Figure 2: When the four stages of each of the pillars are laid out together, it&#8217;s easy to see what delivery stage is appropriate for each aggregate of capabilities.<\/figcaption><\/figure>\n<div>\n<p>Ideally, your\u00a0team will be evenly spread across all capabilities. Practically speaking, however, most organizations will have an uneven spread. Perhaps they are heavily invested in their quality technology\u2014a 3\u2014but have put very little effort into monitoring\u2014a 1.<\/p>\n<\/div>\n<div>\n<p>The team must then decide where it would like to go. It is neither appropriate nor necessary for every software organization to achieve full, continuous, automated deployment, with every change releasing immediately to production. Many organizations will be satisfied with level 3 functionality, where it is straightforward and routine for someone to &#8220;push the button&#8221;\u00a0to ship a change or set of changes live.<\/p>\n<\/div>\n<div>\n<p>Once your team knows where it is\u00a0and where it would like to go, it can determine what it needs to accomplish to arrive at that destination. Consider the team in the previous example. It has determined that a push-button deployment is an appropriate goal, given stakeholders&#8217; concerns and the investment they are willing to make (delivery stage 3). Assume\u00a0they have self-assessed to the following scores:<\/p>\n<p><a href=\"https:\/\/smartnet.ua\/wp-content\/uploads\/2021\/10\/self-assessment_scores_example.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-952 size-full\" src=\"https:\/\/smartnet.ua\/wp-content\/uploads\/2021\/10\/self-assessment_scores_example.png\" alt=\"\" width=\"482\" height=\"118\" srcset=\"https:\/\/smartnet.ua\/wp-content\/uploads\/2021\/10\/self-assessment_scores_example.png 482w, https:\/\/smartnet.ua\/wp-content\/uploads\/2021\/10\/self-assessment_scores_example-300x73.png 300w\" sizes=\"auto, (max-width: 482px) 100vw, 482px\" \/><\/a><\/p>\n<div>\n<p>With its current scores, the team\u00a0can appropriately deliver software at stage 2 (early automation). If it is not currently delivering that way, then with no additional improvements upon the pillars, it would be safe for the team to implement up to this level. If it wishes to move on to push-button deployments, however, the\u00a0course of action is clear.<\/p>\n<\/div>\n<div>\n<p lang=\"EN-US\">The most bang for the buck\u00a0tends to come from moving from level 1 to level 2 capability. Thus,\u00a0the team\u00a0should begin by improving its monitoring practices. The team\u00a0would get relatively little additional utility for choosing instead to, say, improve source control practices (from level 3 to 4).<\/p>\n<\/div>\n<div>\n<h3>Step back to move forward<\/h3>\n<\/div>\n<div>\n<p>If your organization is still early in its continuous delivery journey, deciding where to begin can seem like a daunting task. But if you take a step back and evaluate both your current capabilities and how much investment you&#8217;re willing to make, you can build a road map that will get you, step by step, to whatever destination you desire.<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #808080;\">Primary source: techbeacon.com<\/span><\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>When starting a greenfield project, it&#8217;s easy to take advantage of the most modern development practices. An engineering team can [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":955,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[],"tags":[],"class_list":["post-949","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.9 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>How to migrate legacy code bases to continuous delivery - Smartnet<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/smartnet.ua\/blog\/how-to-migrate-legacy-code-bases-to-continuous-delivery\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to migrate legacy code bases to continuous delivery - Smartnet\" \/>\n<meta property=\"og:description\" content=\"When starting a greenfield project, it&#8217;s easy to take advantage of the most modern development practices. An engineering team can [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/smartnet.ua\/blog\/how-to-migrate-legacy-code-bases-to-continuous-delivery\/\" \/>\n<meta property=\"og:site_name\" content=\"Smartnet\" \/>\n<meta property=\"article:published_time\" content=\"2021-10-19T15:48:10+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-10-19T15:49:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/smartnet.ua\/wp-content\/uploads\/2021\/10\/rm.png\" \/>\n\t<meta property=\"og:image:width\" content=\"719\" \/>\n\t<meta property=\"og:image:height\" content=\"428\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Mykyta Tsuranov\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mykyta Tsuranov\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/smartnet.ua\/blog\/how-to-migrate-legacy-code-bases-to-continuous-delivery\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/smartnet.ua\/blog\/how-to-migrate-legacy-code-bases-to-continuous-delivery\/\"},\"author\":{\"name\":\"Mykyta Tsuranov\",\"@id\":\"https:\/\/smartnet.ua\/#\/schema\/person\/0c5fe7bb9b1b9d277b74e2cfd9d6b1c1\"},\"headline\":\"How to migrate legacy code bases to continuous delivery\",\"datePublished\":\"2021-10-19T15:48:10+00:00\",\"dateModified\":\"2021-10-19T15:49:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/smartnet.ua\/blog\/how-to-migrate-legacy-code-bases-to-continuous-delivery\/\"},\"wordCount\":1545,\"publisher\":{\"@id\":\"https:\/\/smartnet.ua\/#organization\"},\"image\":{\"@id\":\"https:\/\/smartnet.ua\/blog\/how-to-migrate-legacy-code-bases-to-continuous-delivery\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/smartnet.ua\/wp-content\/uploads\/2021\/10\/rm.png\",\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/smartnet.ua\/blog\/how-to-migrate-legacy-code-bases-to-continuous-delivery\/\",\"url\":\"https:\/\/smartnet.ua\/blog\/how-to-migrate-legacy-code-bases-to-continuous-delivery\/\",\"name\":\"How to migrate legacy code bases to continuous delivery - Smartnet\",\"isPartOf\":{\"@id\":\"https:\/\/smartnet.ua\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/smartnet.ua\/blog\/how-to-migrate-legacy-code-bases-to-continuous-delivery\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/smartnet.ua\/blog\/how-to-migrate-legacy-code-bases-to-continuous-delivery\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/smartnet.ua\/wp-content\/uploads\/2021\/10\/rm.png\",\"datePublished\":\"2021-10-19T15:48:10+00:00\",\"dateModified\":\"2021-10-19T15:49:09+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/smartnet.ua\/blog\/how-to-migrate-legacy-code-bases-to-continuous-delivery\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/smartnet.ua\/blog\/how-to-migrate-legacy-code-bases-to-continuous-delivery\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/smartnet.ua\/blog\/how-to-migrate-legacy-code-bases-to-continuous-delivery\/#primaryimage\",\"url\":\"https:\/\/smartnet.ua\/wp-content\/uploads\/2021\/10\/rm.png\",\"contentUrl\":\"https:\/\/smartnet.ua\/wp-content\/uploads\/2021\/10\/rm.png\",\"width\":719,\"height\":428},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/smartnet.ua\/blog\/how-to-migrate-legacy-code-bases-to-continuous-delivery\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/smartnet.ua\/en\/network-security-solutions\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to migrate legacy code bases to continuous delivery\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/smartnet.ua\/#website\",\"url\":\"https:\/\/smartnet.ua\/\",\"name\":\"Smartnet\",\"description\":\"\u0420\u0456\u0448\u0435\u043d\u043d\u044f \u043c\u0435\u0440\u0435\u0436\u0435\u0432\u043e\u0457 \u0431\u0435\u0437\u043f\u0435\u043a\u0438\",\"publisher\":{\"@id\":\"https:\/\/smartnet.ua\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/smartnet.ua\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/smartnet.ua\/#organization\",\"name\":\"Smartnet\",\"url\":\"https:\/\/smartnet.ua\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/smartnet.ua\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/smartnet.ua\/wp-content\/uploads\/2026\/01\/logo.svg\",\"contentUrl\":\"https:\/\/smartnet.ua\/wp-content\/uploads\/2026\/01\/logo.svg\",\"width\":299,\"height\":157,\"caption\":\"Smartnet\"},\"image\":{\"@id\":\"https:\/\/smartnet.ua\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/smartnet.ua\/#\/schema\/person\/0c5fe7bb9b1b9d277b74e2cfd9d6b1c1\",\"name\":\"Mykyta Tsuranov\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/smartnet.ua\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/ebda358c8a5e199a2b385e3af2bc6fde3102a1a55e4ca21db30313b922a89a94?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/ebda358c8a5e199a2b385e3af2bc6fde3102a1a55e4ca21db30313b922a89a94?s=96&d=mm&r=g\",\"caption\":\"Mykyta Tsuranov\"},\"url\":\"https:\/\/smartnet.ua\/en\/blog\/author\/mykyta\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How to migrate legacy code bases to continuous delivery - Smartnet","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/smartnet.ua\/blog\/how-to-migrate-legacy-code-bases-to-continuous-delivery\/","og_locale":"en_US","og_type":"article","og_title":"How to migrate legacy code bases to continuous delivery - Smartnet","og_description":"When starting a greenfield project, it&#8217;s easy to take advantage of the most modern development practices. An engineering team can [&hellip;]","og_url":"https:\/\/smartnet.ua\/blog\/how-to-migrate-legacy-code-bases-to-continuous-delivery\/","og_site_name":"Smartnet","article_published_time":"2021-10-19T15:48:10+00:00","article_modified_time":"2021-10-19T15:49:09+00:00","og_image":[{"width":719,"height":428,"url":"https:\/\/smartnet.ua\/wp-content\/uploads\/2021\/10\/rm.png","type":"image\/png"}],"author":"Mykyta Tsuranov","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Mykyta Tsuranov","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/smartnet.ua\/blog\/how-to-migrate-legacy-code-bases-to-continuous-delivery\/#article","isPartOf":{"@id":"https:\/\/smartnet.ua\/blog\/how-to-migrate-legacy-code-bases-to-continuous-delivery\/"},"author":{"name":"Mykyta Tsuranov","@id":"https:\/\/smartnet.ua\/#\/schema\/person\/0c5fe7bb9b1b9d277b74e2cfd9d6b1c1"},"headline":"How to migrate legacy code bases to continuous delivery","datePublished":"2021-10-19T15:48:10+00:00","dateModified":"2021-10-19T15:49:09+00:00","mainEntityOfPage":{"@id":"https:\/\/smartnet.ua\/blog\/how-to-migrate-legacy-code-bases-to-continuous-delivery\/"},"wordCount":1545,"publisher":{"@id":"https:\/\/smartnet.ua\/#organization"},"image":{"@id":"https:\/\/smartnet.ua\/blog\/how-to-migrate-legacy-code-bases-to-continuous-delivery\/#primaryimage"},"thumbnailUrl":"https:\/\/smartnet.ua\/wp-content\/uploads\/2021\/10\/rm.png","inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/smartnet.ua\/blog\/how-to-migrate-legacy-code-bases-to-continuous-delivery\/","url":"https:\/\/smartnet.ua\/blog\/how-to-migrate-legacy-code-bases-to-continuous-delivery\/","name":"How to migrate legacy code bases to continuous delivery - Smartnet","isPartOf":{"@id":"https:\/\/smartnet.ua\/#website"},"primaryImageOfPage":{"@id":"https:\/\/smartnet.ua\/blog\/how-to-migrate-legacy-code-bases-to-continuous-delivery\/#primaryimage"},"image":{"@id":"https:\/\/smartnet.ua\/blog\/how-to-migrate-legacy-code-bases-to-continuous-delivery\/#primaryimage"},"thumbnailUrl":"https:\/\/smartnet.ua\/wp-content\/uploads\/2021\/10\/rm.png","datePublished":"2021-10-19T15:48:10+00:00","dateModified":"2021-10-19T15:49:09+00:00","breadcrumb":{"@id":"https:\/\/smartnet.ua\/blog\/how-to-migrate-legacy-code-bases-to-continuous-delivery\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/smartnet.ua\/blog\/how-to-migrate-legacy-code-bases-to-continuous-delivery\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/smartnet.ua\/blog\/how-to-migrate-legacy-code-bases-to-continuous-delivery\/#primaryimage","url":"https:\/\/smartnet.ua\/wp-content\/uploads\/2021\/10\/rm.png","contentUrl":"https:\/\/smartnet.ua\/wp-content\/uploads\/2021\/10\/rm.png","width":719,"height":428},{"@type":"BreadcrumbList","@id":"https:\/\/smartnet.ua\/blog\/how-to-migrate-legacy-code-bases-to-continuous-delivery\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/smartnet.ua\/en\/network-security-solutions\/"},{"@type":"ListItem","position":2,"name":"How to migrate legacy code bases to continuous delivery"}]},{"@type":"WebSite","@id":"https:\/\/smartnet.ua\/#website","url":"https:\/\/smartnet.ua\/","name":"Smartnet","description":"\u0420\u0456\u0448\u0435\u043d\u043d\u044f \u043c\u0435\u0440\u0435\u0436\u0435\u0432\u043e\u0457 \u0431\u0435\u0437\u043f\u0435\u043a\u0438","publisher":{"@id":"https:\/\/smartnet.ua\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/smartnet.ua\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/smartnet.ua\/#organization","name":"Smartnet","url":"https:\/\/smartnet.ua\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/smartnet.ua\/#\/schema\/logo\/image\/","url":"https:\/\/smartnet.ua\/wp-content\/uploads\/2026\/01\/logo.svg","contentUrl":"https:\/\/smartnet.ua\/wp-content\/uploads\/2026\/01\/logo.svg","width":299,"height":157,"caption":"Smartnet"},"image":{"@id":"https:\/\/smartnet.ua\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/smartnet.ua\/#\/schema\/person\/0c5fe7bb9b1b9d277b74e2cfd9d6b1c1","name":"Mykyta Tsuranov","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/smartnet.ua\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/ebda358c8a5e199a2b385e3af2bc6fde3102a1a55e4ca21db30313b922a89a94?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ebda358c8a5e199a2b385e3af2bc6fde3102a1a55e4ca21db30313b922a89a94?s=96&d=mm&r=g","caption":"Mykyta Tsuranov"},"url":"https:\/\/smartnet.ua\/en\/blog\/author\/mykyta\/"}]}},"_links":{"self":[{"href":"https:\/\/smartnet.ua\/en\/wp-json\/wp\/v2\/posts\/949","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/smartnet.ua\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/smartnet.ua\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/smartnet.ua\/en\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/smartnet.ua\/en\/wp-json\/wp\/v2\/comments?post=949"}],"version-history":[{"count":3,"href":"https:\/\/smartnet.ua\/en\/wp-json\/wp\/v2\/posts\/949\/revisions"}],"predecessor-version":[{"id":956,"href":"https:\/\/smartnet.ua\/en\/wp-json\/wp\/v2\/posts\/949\/revisions\/956"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/smartnet.ua\/en\/wp-json\/wp\/v2\/media\/955"}],"wp:attachment":[{"href":"https:\/\/smartnet.ua\/en\/wp-json\/wp\/v2\/media?parent=949"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/smartnet.ua\/en\/wp-json\/wp\/v2\/categories?post=949"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/smartnet.ua\/en\/wp-json\/wp\/v2\/tags?post=949"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}