Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can you record the git revision with gruntjs

Tags:

git

gruntjs

I build my webapp with gruntjs and yeoman.io.

I'd like to be able to record the git revision/commit/sha that a build come from, so that i can look in the deployed version and double check where it came from and what has changed with the new release.

like image 333
Stephen Avatar asked Oct 29 '12 22:10

Stephen


People also ask

What is Git revision?

So "revision" refers to the id you can use as a parameter to reference an object in git (usually a commit). HEAD@{5 minutes ago} is a revision which reference the commit present 5 minutes ago.


2 Answers

Not a Grunt expert either, but here's a solution based on git describe which I currently use for a large AngularJS app. We store the major version in the project's package.json. In addition to that I generate a version.json file containing the revision and date for every build. This information can later be accessed by the client to help testers and maintainers to see which version/revision of the app they're using.

grunt.initConfig({
  pkg: grunt.file.readJSON('package.json'),

  'git-describe': {
    options: {
      prop: 'meta.revision'
    },
    me: {}
  },

  ...
});

grunt.registerTask('tag-revision', 'Tag the current build revision', function () {
  grunt.task.requires('git-describe');

  grunt.file.write('public/version.json', JSON.stringify({
    version: grunt.config('pkg.version'),
    revision: grunt.config('meta.revision'),
    date: grunt.template.today()
  }));
});

grunt.registerTask('version', ['git-describe', 'tag-revision']);

So by including the version task in our build tasks we can tag each build with a version.json file.

like image 72
inukshuk Avatar answered Sep 19 '22 13:09

inukshuk


Not a gruntjs specialist, but maybe you can include in your build step a call to the gruntjs-git-describe module, which will call that task:

module.exports = function( grunt ) {
  grunt.registerTask("describe", "Describes current git commit", function (prop) {
    var done = this.async();

    grunt.log.write("Describe current commit: ");

    grunt.util.spawn({
      cmd : "git",
      args : [ "describe", "--tags", "--always", "--long", "--dirty" ]
    }, function (err, result) {
      if (err) {
        grunt.log.error(err);
        return done(false);
      }

      grunt.config(prop || "meta.version", result);

      grunt.log.writeln(result.green);

      done(result);
    });
  });
};

Using git-describe is a good way to record a "version number" with Git, as it is SHA1-based (unambiguous id).
See more on that topic:

  • "Deriving application build version from git describe - how to get a relatively straightforward string?"
  • "Moving from CVS to git: $Id:$ equivalent?"
  • "what is the git equivalent for revision number?"
like image 33
VonC Avatar answered Sep 19 '22 13:09

VonC