# Thor::SCMVersion Thor tasks to manage a VERSION file based on SCM tags, for use in continuous delivery pipelines. One of the key points of continuous delivery is that every build has a version number, and that version number is unique and only points to one build. Thor::SCMVersion adds some tasks to a Thorfile to use SCM tags as the authoritative source of version status, so your continuous integration server can create versions without having to worry about file conflicts. ## Integrating into your project Since Thor is written in Ruby, you'll need Ruby to make this work, on your workstation and on your CI server. See <http://whatisthor.com/> for more in how to use Thor. ### Get the gem If you don't already have a Gemfile, you should probably get one. See <http://gembundler.com/> for more details on Bundler and Gemfiles. Not required, but will save you a lot of hassle. Add this line to your application's Gemfile: gem 'thor-scmversion' And then execute: $ bundle Or install it yourself as: $ gem install thor-scmversion ### Add it to your Thorfile All you need to do is require it at the top of your Thorfile: require 'thor/scmversion' Now when you list your thor tasks you'll see 2 new ones. $ thor list version ------- thor version:bump TYPE [PRERELEASE_TYPE] # Bump version number (type is major, minor, patch, prerelease or auto) # Prerelease allows an additional parameter to be passed which is used # as the prerelease type. thor version:current # Show current SCM tagged version Usage Examples: $ thor version:current 1.2.1 $ thor version:bump auto 1.2.2 $ thor version:bump major 2.0.0 $ thor version:bump prerelease 2.0.1-alpha.1 $ thor version:bump prerelease 2.0.1-alpha.2 $ thor version:bump prerelease beta 2.0.1-beta.1 $ thor version:bump minor 2.1.0 ### Remove your VERSION file from source control Since your CI server will be managing your VERSION file, you don't want it to be stored in your SCM anymore. Make a note of your current version, then $ git rm VERSION $ echo VERSION >> .gitignore` $ git add .gitignore $ git commit -m "Drop VERSION as it is managed by thor-scmversion now" ### Create a tag for the current version Now tag the current version manually. If it was 1.2.3: $ git tag 1.2.3 $ git push --tags You can make sure it worked by running `thor version:current` and making sure it is what you expected. ### Integrate with CI Now, as part of your CI job, before it builds your artifacts, have it run `thor version:bump patch`. This will increment the patch, push the new tag, and write the VERSION file. Now the artifact you build will have the right version information, every time. ### You manage the major, minor patch and prerelease When you make significant changes, you can bump the major, minor or patch number yourself with `thor version:bump minor`. This will create a tag with a .0 patch level, so the next build made by the server will be .1 patch level. ### Auto bumping If you include #major, #minor or #patch in the subject of commits, and run `thor version:bump auto` it will see if any major, minor or patch level changes are included since the last tag, and use the appropriate version. This works especially well with a CI server, allowing you to never have to directly manage versions at all. If no commits are tagged, the build number for the current version will be bumped instead. NOTE: auto bumping currently only works for Git repos. For Perforce repos, auto is the same as build. ## Contributing 1. Fork it 2. Create your feature branch (`git checkout -b my-new-feature`) 3. Commit your changes (`git commit -am 'Added some feature'`) 4. Push to the branch (`git push origin my-new-feature`) 5. Create new Pull Request ## Contributors * Michael Ivey <ivey@gweezlebur.com> * Kyle Allan <kallan@riotgames.com> * Josiah Kiehl <josiah@skirmisher.net> * Based on code developed by Jamie Winsor <jamie@vialstudios.com> * Originally derived from some Bundler internals by Yehuda Katz