将Git提交版本号作为Rails应用版本号

应用的版本管理和代码的版本管理通常是分开的,作为两套独立的版本系统来维护。对于小型应用来说有些浪费精力。最早在GitLab这款开源软件上看到其使用Git的提交版本号作为版本号,本文将借鉴这种做法。

获得Git版本号

  1. 开发环境,当前的工作目录里包含了.git目录,直接执行下面的命令git describe --always。该命令通常返回形如1f36a3b的SHA-1短序列,但是如果该提交版本有对应的Tag的话,将返回该Tag名称。真实应用发布场景显得非常有用,毕竟随机序列不如自定义的有意义的名称便于记忆、沟通和传播。
  2. 对于Capistrano工具发布的生产环境,应用根目录不包含.git目录,所以如果通过git命令直接获得代码版本号,好在Capistrano发布时会自动生成REVISION文件,其内容为代码版本号。

综合两种情况的代码如下

if File.exist? 'REVISION' then `cat REVISION`.chomp else `git describe --always` end <!--more--> ### 版本号作为静态变量 上面我们讨论了在rails应用里通过代码获得版本号,但是版本号在应用系统相当于静态变量,在启动时候初始化,通过更有意义的名称(app_version)来引用会方便一些。

下面我们介绍如何结合settingslogic,将版本号变成应用级的全局变量(通过Settings.app_version引用)。

Gemfile里添加下面一行

gem 'settingslogic'

然后执行bundle install.

config/application.yml文件添加如下内容:

#config/application.yml
defaults: &defaults
	app_version: <%= `git describe --always`%>

development:
	<<: *defaults

test:
	<<: *defaults

production:
	<<: *defaults

修改config/application.rb文件 在module AppName(AppName 随应用名称而变)行之后添加 class Settings < Settingslogic source File.expand_path(“../application.yml”, FILE) namespace Rails.env end

HTTP响应包含版本号

用Rails实现一个纯API应用,仅接受和响应JSON格式数据,将版本号添加到响应头部是一种不错的方法。

编辑config/application.rbclass Application < Rails::Application里面加入

config.action_dispatch.default_headers.merge!({ 
	'X-App-Version' => Settings.app_version 
})

参考阅读

  1. Show the version number of your Rails app using Git
  2. Setting headers in Rails 4