Bash
Git
バージョン管理
開発手法

システムを継続して開発する場合にはバージョン情報を自動で付けると良かったです

「あれっ…、このバグいつから発生してるんだ…?」
「テスターはいつのバージョンで試した結果なんだ?」

という状況ありますよね。
こういうときにバージョン番号やコミットIDが付いていると問題の特定が捗ります。
以前はバージョン番号を手動で変更していたのですが、デプロイするときにこれを自動的に付けるとすごく便利です。
バージョン番号を付ける習慣ができるとNPM、アプリ、プロジェクトなど色んな所が捗ります。

ポイント

ポイントがいくつかあります。

  1. Gitのタグでバージョン番号を付ける
  2. AndroidアプリやPWA、WordPressプラグインなどのバージョン番号と合わせる
  3. 小さい修正の場合でもバージョン番号を上げていく

スクリプト

version.sh
echo $(git tag | sort | tail -1) '-' | tr -d " \n"; git rev-parse HEAD | cut -c1-7 | tr -d "\n"; echo '-'$(date +%Y%m%d)

コードはこちらです。 https://gist.github.com/yousan/34016e297cad5871b27a94135d5e4d43/

コマンド 解説
git tag リポジトリに付けられたタグを出力
sort 昇順に並び替え
tail -1 最後の1行を取得
tr -d " \n" 空行削除
git rev-parse HEAD 現在のコミットID取得
cut -c1-u7 コミットIDを7文字に
echo '-'$(date +%Y%m%d) 日付を付与

使い方

version.shを呼ぶと出てきます。

$ bash version.sh | bash

v1.7.1-b599631-20181203

Gistのオンライン上のスクリプトをそのまま使うことも出来ます。

$ curl -s -L https://gist.githubusercontent.com/yousan/34016e297cad5871b27a94135d5e4d43/raw/46f5662225ffec4bcfc4bc720a42cbb74cd8c9b3/version.sh | bash

付与される情報と目的

上記のスクリプトでは v1.7.1-b591234-20181203といった形で出力されます。

それぞれ 目的
バージョン番号 エンドユーザ、テスターからの報告や開発のやりとりを簡易的にするため
コミットID コミットID決め打ちで再現させるため
日付(YYYYMMDD形式) ぱっと見で発生時期がわかるため

上記のような目的で付けています。
テスターからバグ報告をもらう際にバージョン番号が入るようにすると一目瞭然なのでいい感じになります。

バージョン番号を打つために

バージョン番号を打つためにリリース用のGitのタグを打ちます。
Git-flow1に沿ってリリースを行うと、自動的にリリース用のタグが打たれます。

Git-flowって何?

こんな感じです。

image.png

バージョン番号は数字のみ先頭にvを付けるかに分かれていますが、最近はvを付ける派のほうが多そうなのでそちらにしています。(画像は少し前に作ったリポジトリなのでvが無いです)
今回付けたいそれ以外の情報、コミットIDと日付についてはプログラム側でまかないます。

バージョン番号を入れるタイミング

バージョン番号を入れるタイミングですが、初回リリース時(大体このときをバージョン1.0としています)から始めています。
というのも最初期はバージョンアップも非常にこまめに行っていて、バージョン情報が頻繁に更新され過ぎるのを防ぐためめです。

使い方の例

少し前ですがCakePHPで作ったプロジェクトの際の例です。

スクリプトを元にConfigに書きだし、テンプレートで読み出ししています。

<?= Configure::read('Version') ?>

image.png

Gitで打ったReleaseバージョンをプログラム側で参照できるようにする

是非教えてください

これをつかった方法やもっと便利な方法があれば是非教えてください!開発プラクティスに飢えてます😜

参考記事

GitHubのリリース機能を使う

書いててほぼ網羅されている記事を見つけました、完璧ですね!
タグ付けデプロイの思想的裏付け

謝辞

コードは @ur0nくんに書いてもらいました。ありがとうございます!


  1. Git-Flowなのかgit-flowなのかレターケースがいつも分からなくなります…w