{"id":13,"date":"2015-12-10T17:44:11","date_gmt":"2015-12-10T17:44:11","guid":{"rendered":"http:\/\/avil.la\/?p=13"},"modified":"2017-03-06T18:04:23","modified_gmt":"2017-03-06T18:04:23","slug":"branching-and-releasing","status":"publish","type":"post","link":"https:\/\/avil.la\/?p=13","title":{"rendered":"Branching and Releasing"},"content":{"rendered":"<p>Captures ideas around branching and releasing strategy.<\/p>\n<p><strong>Branch to release model<\/strong><\/p>\n<p>I have used branch to release for many years for small, to moderately sized teams, though I think it can be applied to many team sizes and complexity of project. This setup has worked for me in 99% (leaving 1% off in case I forgot somewhere it didn&#8217;t make sense) of my projects. I will use git as my jargon, but can be applied to many different VCS&#8217;.<\/p>\n<p>Some assumptions about this approach are:<\/p>\n<ul>\n<li>You write automated tests.<\/li>\n<li>You take huge projects and dice them up into small, testable chunks.<\/li>\n<li>You only commit to master if it is ready to go live.<\/li>\n<li>You communicate with your committers.<\/li>\n<li>You know what you are changing.<\/li>\n<\/ul>\n<p>Arguments against it:<\/p>\n<ul>\n<li>Sometimes I want to commit something without it being ready\n<ul>\n<li>Your problem is too big then. Dice it up.<\/li>\n<li>You are writing too much code for one commit.<\/li>\n<li>You need to take the time to write tests.<\/li>\n<li>Implement parallel dev or having feature go &#8220;in the dark&#8221; \/ be configurable.<\/li>\n<\/ul>\n<\/li>\n<li>Others won&#8217;t write tests or break my code.\n<ul>\n<li>Communicate more.<\/li>\n<li>Do code reviews.<\/li>\n<li>Weed out the offenders.<\/li>\n<li>Fix your culture, not put in more process.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<div class=\"code panel\">\n<div class=\"codeContent panelContent\">\n<div>\n<div id=\"highlighter_17410\" class=\"syntaxhighlighter nogutter java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\" title=\"Hint: double-click to select code\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">T\u00a0\u00a0\u00a0\u00a0\u00a0 <\/code><code class=\"java value\">0.1<\/code><code class=\"java plain\">.<\/code><code class=\"java value\">0<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java plain\">|<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java plain\">|<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java plain\">B\u00a0\u00a0\u00a0\u00a0\u00a0 <\/code><code class=\"java value\">0.1<\/code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<code class=\"java value\">0.2<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java plain\">\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java plain\">|\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java plain\">M --*--*--*--*--*--*--*--*--*--*<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>In this diagram you are committing to master (M), and the second commit\u00a0you branch (B) 0.1. That gets deployed, tested, and approved. You then tag (T) as 0.1.0 and release that. You start to dev more on master and even\u00a0branch 0.2 to prep another release. Bug is found in production against\u00a00.1.0. If bug still exists in M, you fix the bug (BF) there with tests and\u00a0cherry-pick (CP) the commit to 0.1 and have it flow down the same stream\u00a0resulting in 0.1.1 tag like:<\/p>\n<div class=\"code panel\">\n<div class=\"codeContent panelContent\">\n<div>\n<div id=\"highlighter_756501\" class=\"syntaxhighlighter nogutter java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\" title=\"Hint: double-click to select code\">\n<div class=\"line number1 index0 alt2\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java value\">0.1<\/code><code class=\"java plain\">.<\/code><code class=\"java value\">1<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">T\u00a0\u00a0\u00a0\u00a0\u00a0 <\/code><code class=\"java value\">0.1<\/code><code class=\"java plain\">.<\/code><code class=\"java value\">0<\/code>\u00a0 \u00a0 \u00a0 \u00a0<code class=\"java plain\">\/<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java plain\">|\u00a0\u00a0 \/<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java plain\">|\u00a0 | +-------------------+<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java plain\">B\u00a0\u00a0\u00a0\u00a0\u00a0 <\/code><code class=\"java value\">0.1<\/code><code class=\"java plain\">-CP-+ \u00a0 \u00a0\u00a0<\/code><code class=\"java value\">0.2<\/code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<code class=\"java plain\">|<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java plain\">\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java plain\">|\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java plain\">M --*--*--*--*--*--*--*--*--*--*--BF<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>If the bug doesn&#8217;t exist in M, you fix in 0.1 with tests, commit, wash, rinse, repeat.<\/p>\n<div class=\"code panel\">\n<div class=\"codeContent panelContent\">\n<div>\n<div id=\"highlighter_704178\" class=\"syntaxhighlighter nogutter java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\" title=\"Hint: double-click to select code\">\n<div class=\"line number1 index0 alt2\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java value\">0.1<\/code><code class=\"java plain\">.<\/code><code class=\"java value\">1<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">T\u00a0\u00a0\u00a0\u00a0\u00a0 <\/code><code class=\"java value\">0.1<\/code><code class=\"java plain\">.<\/code><code class=\"java value\">0<\/code>\u00a0 \u00a0 \u00a0 \u00a0<code class=\"java plain\">\/<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java plain\">|\u00a0\u00a0 \/<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java plain\">|\u00a0 |<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java plain\">B\u00a0\u00a0\u00a0\u00a0\u00a0 <\/code><code class=\"java value\">0.1<\/code><code class=\"java plain\">--BF \u00a0 \u00a0 \u00a0<\/code><code class=\"java value\">0.2<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java plain\">\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java plain\">|\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java plain\">M --*--*--*--*--*--*--*--*--*--*<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>If cherry-pick cannot be applied cleanly, you fix in both, with tests, tag and release. This should be\u00a0<strong>a lot<\/strong> less likely if you are dicing up the problem into small chunks and committing small changes.<\/p>\n<div class=\"code panel\">\n<div class=\"codeContent panelContent\">\n<div>\n<div id=\"highlighter_534875\" class=\"syntaxhighlighter nogutter java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\" title=\"Hint: double-click to select code\">\n<div class=\"line number1 index0 alt2\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java value\">0.1<\/code><code class=\"java plain\">.<\/code><code class=\"java value\">1<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">T\u00a0\u00a0\u00a0\u00a0\u00a0 <\/code><code class=\"java value\">0.1<\/code><code class=\"java plain\">.<\/code><code class=\"java value\">0<\/code>\u00a0 \u00a0 \u00a0 \u00a0<code class=\"java plain\">\/<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java plain\">|\u00a0\u00a0 \/<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java plain\">|\u00a0 |<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java plain\">B\u00a0\u00a0\u00a0\u00a0\u00a0 <\/code><code class=\"java value\">0.1<\/code><code class=\"java plain\">--BF \u00a0 \u00a0 \u00a0<\/code><code class=\"java value\">0.2<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java plain\">\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java plain\">|\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java plain\">M --*--*--*--*--*--*--*--*--*--BF<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Captures ideas around branching and releasing strategy. Branch to release model I have used branch to release for many years for small, to moderately sized teams, though I think it can be applied to many team sizes and complexity of project. This setup has worked for me in 99% (leaving 1% off in case I &hellip; <a href=\"https:\/\/avil.la\/?p=13\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Branching and Releasing<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[4,3],"class_list":["post-13","post","type-post","status-publish","format-standard","hentry","category-uncategorized","tag-bestpractices","tag-technology"],"_links":{"self":[{"href":"https:\/\/avil.la\/index.php?rest_route=\/wp\/v2\/posts\/13","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/avil.la\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/avil.la\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/avil.la\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/avil.la\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=13"}],"version-history":[{"count":3,"href":"https:\/\/avil.la\/index.php?rest_route=\/wp\/v2\/posts\/13\/revisions"}],"predecessor-version":[{"id":22,"href":"https:\/\/avil.la\/index.php?rest_route=\/wp\/v2\/posts\/13\/revisions\/22"}],"wp:attachment":[{"href":"https:\/\/avil.la\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=13"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/avil.la\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=13"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/avil.la\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=13"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}