index.html (8336B)
1 <!DOCTYPE html> 2 3 <html lang="fr"> 4 5 <head> 6 <meta charset="utf-8"> 7 <meta http-equiv="content-type" content="text/html; charset=utf-8" /> 8 9 <link rel="start" href="https://vincent.demeester.fr" /> 10 11 <title>Vincent Demeester</title> 12 <link rel="canonical" href="https://vincent.demeester.fr/posts/2012-07-23-maven-release-gitflow/"> 13 <link href="https://vincent.demeester.fr/index.xml" rel="alternate" type="application/rss+xml" title="Vincent Demeester" /> 14 15 <link rel="openid.server" href="https://indieauth.com/openid" /> 16 <link rel="openid.delegate" href="http://vincent.demeester.fr/" /> 17 <link rel="shortcut icon" type="image/x-icon" href="favicon.ico"> 18 19 <link rel="stylesheet" href="/css/screen.css" type="text/css" /> 20 <link rel="stylesheet" href="/css/sbrain.css" type="text/css" /> 21 <link rel="stylesheet" href="/css/syntax.css" type="text/css" /> 22 23 </head> 24 25 <body lang="fr" class="gray"> 26 27 28 29 30 31 32 <div id="main-container"> 33 <div id="page"> 34 <article class="post"> 35 <header> 36 <h1 class="emphnext">Maven Release Gitflow</h1><a href='https://vincent.demeester.fr/posts/2012-07-23-maven-release-gitflow/'></a> 37 <address class="signature"> 38 <span class="date">Mon, 23 July, 2012</span> 39 <span class="words">(400 Words)</span> 40 </address> 41 <ul class="tag_box inline"> 42 43 <li class="category"><a href="/categories/#developement">developement</a></li> 44 45 46 47 48 49 <li class="tag tag-maven"><a href="/tags/#maven">maven<span>2</span></a></li> 50 51 52 <li class="tag tag-java"><a href="/tags/#java">java<span>4</span></a></li> 53 54 55 <li class="tag tag-git"><a href="/tags/#git">git<span>3</span></a></li> 56 57 58 <li class="tag tag-gitflow"><a href="/tags/#gitflow">gitflow<span>1</span></a></li> 59 60 61 <li class="tag tag-release"><a href="/tags/#release">release<span>1</span></a></li> 62 63 <br/> 64 65 </ul> 66 </header> 67 68 69 70 71 72 <p>I like a lot the <a href="http://nvie.com/posts/a-successful-git-branching-model/">gitflow</a> way of managing project. 73 When working on maven project, there is few great plugins that helps to get 74 the work done. One of them is <a href="http://maven.apache.org/plugins/maven-release-plugin">maven-release-plugin</a>.</p> 75 76 <p>Inspired on this <a href="https://gist.github.com/1043970">gist</a>, I’ve come with 77 a cool way of doing things (let say we want to release a 0.1 version of an 78 artifact) :</p> 79 80 <h1 id="prepare-the-pom-xml">Prepare the pom.xml.</h1> 81 82 <p>It needs <code><scm></code> entries, <code><distributionManagement></code> entries 83 (to know where to deploy the release artifact) and few options for the 84 maven-release-plugin :</p> 85 86 <div class="highlight"><pre class="chroma"><code class="language-xml" data-lang="xml"><span class="nt"><project></span> 87 88 <span class="c"><!-- […] --></span> 89 <span class="nt"><build></span> 90 <span class="nt"><plugins></span> 91 <span class="c"><!-- […] --></span> 92 <span class="nt"><plugin></span> 93 <span class="nt"><groupId></span>org.apache.maven.plugins<span class="nt"></groupId></span> 94 <span class="nt"><artifactId></span>maven-release-plugin<span class="nt"></artifactId></span> 95 <span class="nt"><version></span>2.3.2<span class="nt"></version></span> 96 <span class="nt"><configuration></span> 97 <span class="nt"><tagNameFormat></span>v@{project.version}<span class="nt"></tagNameFormat></span> 98 <span class="nt"><pushChanges></span>false<span class="nt"></pushChanges></span> 99 <span class="nt"><localCheckout></span>true<span class="nt"></localCheckout></span> 100 <span class="nt"></configuration></span> 101 <span class="nt"></plugin></span> 102 <span class="c"><!-- […] --></span> 103 <span class="nt"></plugins></span> 104 <span class="nt"></build></span> 105 <span class="c"><!-- […] --></span> 106 107 <span class="nt"></project></span></code></pre></div> 108 109 <p>Few explanation here :</p> 110 111 <ul> 112 <li><code>tagNameFormat</code> is here to change the default tag name (which is <code>${project.artifactId}-${project.version}</code>) to a better one.</li> 113 <li><code>pushChanges</code> set to <code>false</code> tells maven-release-plugin not to push 114 changes (this will become useful)</li> 115 <li><code>localCheckout</code> set to <code>true</code> tells maven-release-plugin to clone from 116 local repository (not distant). This is especially useful here because we 117 didn’t push anything (so not setting this option would result in a failure).</li> 118 </ul> 119 120 <h1 id="the-real-stuff">The real stuff</h1> 121 122 <p>First create a release branch from develop.</p> 123 124 <div class="highlight"><pre class="chroma"><code class="language-bash" data-lang="bash">$ git checkout -b release/v0.1 develop</code></pre></div> 125 126 <p>Then run the maven release stuff.</p> 127 128 <div class="highlight"><pre class="chroma"><code class="language-bash" data-lang="bash">$ mvn release:prepare <span class="c1"># change the pom, commit and tag version, and</span> 129 <span class="c1"># re-change pom (by incrementing SNAPSHOT version)</span> 130 $ mvn release:perform <span class="c1"># get the tagged version, compile and deploy</span></code></pre></div> 131 132 <p>And the real fun begins.</p> 133 134 <div class="highlight"><pre class="chroma"><code class="language-bash" data-lang="bash">$ git checkout develop <span class="c1"># get back to the develop branch</span> 135 $ git merge --no-ff release/v0.1 <span class="c1"># merge the version back into develop</span> 136 $ git checkout master <span class="c1"># go to the master branch</span> 137 $ git merge --no-ff release/v0.1~1 <span class="c1"># merge the version back into master but</span> 138 <span class="c1"># the tagged version instead of the release/v0.1 HEAD</span> 139 $ git branch -D release/v0.1 <span class="c1"># Removing the release branch</span> 140 $ git push --all <span class="o">&&</span> git push --tags <span class="c1"># Finally push everything</span></code></pre></div> 141 142 <p>The real magic here is the <code>git merge --no-ff release/v0.1~1</code> which will 143 merge into master the commit before the HEAD of the branch <code>release/v0.1</code>.</p> 144 145 <p>The next step would be to create a helper script that automates this and 146 verify that the <code>pom.xml</code> has the right configuration options.</p> 147 148 <p><strong>Edit 17:58</strong> : You can take a look <a href="https://github.com/vdemeester/java-config/blob/master/bin/mvn-release-flow">here</a></p> 149 150 151 </article> 152 <hr /> 153 <div class="prev-next"> 154 155 <a class="paging-link prev" href="/posts/2012-12-16-gollum-comme-wiki-personnel/" title="Gollum Comme Wiki Personnel">← Previous post</a> 156 157 158 159 <a class="paging-link next" href="/posts/2012-07-21-news/" title="News">Next post →</a> 160 161 </div> 162 163 </div> 164 </div> 165 166 <footer> 167 <nav> 168 169 <a href="/">home</a> 170 <span class="text-muted"> | </span> 171 172 <a href="/about">about</a> 173 <span class="text-muted"> | </span> 174 175 <a href="/archive">archive</a> 176 <span class="text-muted"> | </span> 177 178 <a href="/categories">categories</a> 179 <span class="text-muted"> | </span> 180 181 <a href="/tags">tags</a> 182 <span class="text-muted"> | </span> 183 184 <a href="https://twitter.com/vdemeest">twitter</a> 185 <span class="text-muted"> | </span> 186 187 <a href="https://github.com/vdemeester">github</a> 188 <span class="text-muted"> | </span> 189 190 <a href="https://vincent.demeester.fr/index.xml">rss</a> 191 </nav> 192 <br/> 193 <address> 194 <span class="copyright"> 195 Content and design by Vincent Demeester 196 (<a rel="licence" href="http://creativecommons.org/licenses/by-nc-sa/3.0/">Some rights reserved</a>) 197 </span><br /> 198 <span class="engine"> 199 Powered by <a href="https://gohugo.io/">Hugo</a> and <a href="https://github.com/kaushalmodi/ox-hugo/">ox-hugo</a> 200 </span> 201 </address> 202 </footer> 203 </body> 204