gruntjs と yeoman.io を使用して webapp をビルドします。
ビルドの元になった git リビジョン/コミット/sha を記録できるようにして、デプロイされたバージョンを調べて、それがどこから来たのか、新しいリリースで何が変更されたのかを再確認できるようにしたいと考えています。
Grunt の専門家でもありませんが、現在大規模な AngularJS アプリに使用している git describe に基づくソリューションを次に示します。メジャー バージョンはプロジェクトの package.json に保存されます。それに加えて、すべてのビルドのリビジョンと日付を含む version.json ファイルを生成します。この情報は、後でクライアントがアクセスして、テスターとメンテナーが使用しているアプリのバージョン/リビジョンを確認するのに役立ちます。
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']);
そのため、ビルド タスクに version タスクを含めることで、各ビルドに version.json ファイルでタグを付けることができます。
gruntjs スペシャリストではありませんが、ビルドステップにgruntjs-git-describeモジュールへの呼び出しを含めることができます。これはそのタスクを呼び出します:
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);
});
});
};
git-describe を使用すると、Git で「バージョン番号」を記録できます。これは、SHA1 ベース (明確な ID) であるためです。
そのトピックの詳細を参照してください。
inukshuk の回答に対する Lucas Pottersky のコメントを詳しく説明すると、grunt-git-describe >= 2.2.0 で同じことを行う正しい方法は次のとおりです。
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
'git-describe': {
options: {
},
me: {}
},
...
});
grunt.registerTask('saveRevision', function() {
grunt.event.once('git-describe', function (rev) {
grunt.option('gitRevision', rev);
});
grunt.task.run('git-describe');
});
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.option('gitRevision'),
date: grunt.template.today()
}));
});
grunt.registerTask('version', ['saveRevision', 'tag-revision']);