Septeni Engineer's Blog

セプテーニエンジニアが綴る技術ブログ

post-checkoutフックを使ってブランチ切り替え時にちょっとだけ自動でDB環境をセットアップできるようにした

こんにちは、杉山です。

最近、ブランチ切り替えの度にDBの構造が違ってたりするので、切り替えるたびにDBマイグレーションしたりダンプとって読み込んだりとかいうことをやってました。手動でやるのがそろそろだるくなってきたのでこれを機に自動化したいと思います。

Gitフック

Gitフックは超ざっくり説明するとgitの操作にフックして独自の処理を差し込める便利な機能です。クライアントサイドでコミット前とかプッシュ後に何か処理させたり、サーバーサイドでpush後にリモートで何か処理させたりできます。

今回やる事

今回はチェックアウト後に処理を差し込めるフック(post-checkout)を使って以下のようなことをやりました。

  • チェックアウト後にmysqldumpして移動前のブランチ名でダンプファイルを保存
  • 移動先のブランチ名のダンプファイルをdbに読み込ませる
  • ファイルのチェックアウトの時はなにもしない

あとはmysqldumpには個人的な理由でいくつかオプションを加えてます。

  • --defaults-extra-files コマンドにパスワード書けなかったのでパスワードを外部ファイルから読み込ませるため
  • --add-drop-database ブランチの移動前と移動後でDBの構造が違うときに差分のテーブルが残らないようにするため
  • --skip-lock-tables INFORMATION_SCHEMAの情報もダンプさせるため

パスワードを読み込むファイルはこんな感じで書いておけば問題ないです。

[client]
password="hoge"

コード

では早速コードを。 シェルスクリプトは全然書いた事ないので変な書き方してたらすみません。

#!/bin/sh

# エラーになった時点で終了
set -e

# 外部ツールから使えるようにするため
PATH="/usr/local/bin:$PATH"

readonly PREV_HEAD=$1
readonly CURRENT_HEAD=$2
readonly CHECKOUT_TYPE=$3

readonly DUMP_FILE_DIR='ダンプファイルの保存先/'
readonly DUMP_FILE_TYPE='ダンプファイルの拡張子'
readonly DB_PW_FILE_PATH='パスワードが書かれたファイルのパス'

readonly DB_USER='ユーザー名'
readonly DEFAULT_DB_NAME='DB名'
readonly TEST_DB_NAME='テストDB名'
readonly DB_NAMES="${DEFAULT_DB_NAME} ${TEST_DB_NAME}"

# ファイルのチェックアウトの場合はここで終了
if [ ${CHECKOUT_TYPE} -eq 0 ]; then
  exit 0
fi

# 同じコミットを指しているとブランチ名はどちらも同じになる
# ブランチ名に含まれるスラッシュはハイフンに置き換え
readonly PREV_BRANCH_NAME=$(git name-rev --name-only ${PREV_HEAD} | sed "s#/#-#g")
readonly CURRENT_BRANCH_NAME=$(git name-rev --name-only ${CURRENT_HEAD} | sed "s#/#-#g")

readonly DUMP_FILE_PATH=${DUMP_FILE_DIR}${PREV_BRANCH_NAME}${DUMP_FILE_TYPE}
readonly READ_FILE_PATH=${DUMP_FILE_DIR}${CURRENT_BRANCH_NAME}${DUMP_FILE_TYPE}

dump() {
  mysqldump --defaults-extra-file=${DB_PW_FILE_PATH} -u ${DB_USER} --add-drop-database -B ${DB_NAMES} --skip-lock-tables --single-transaction -r ${DUMP_FILE_PATH}
}

setup() {
  if [ ${PREV_BRANCH_NAME} = ${CURRENT_BRANCH_NAME} ]; then
    exit 0
  # 読み込みたいダンプファイルがあるとき
  elif [ -e ${READ_FILE_PATH} ]; then
    mysql --defaults-extra-file=${DB_SETTING_FILE} -u ${DB_USER} < ${READ_FILE_PATH}
  fi
}

dump

setup

exit 0

以上です。 あとはパスとかDB設定周りを書き換えてコードを.git/hooks/post-commitに保存してchmod a+x post-commitすれば使えるようになります。 同じコミットを指してる時はブランチ名が同じになっちゃってますが動作には特に問題ないと思います。

まとめ

数日使ってみましたが割と良い感じです。Gitフック便利です。 最後まで読んだいただいてありがとうございました。

参考

  1. mysqldump https://dev.mysql.com/doc/refman/5.6/ja/mysqldump.html
  2. Gitフック https://git-scm.com/book/ja/v2/Git-のカスタマイズ-Git-フック