LoginSignup
0
0

More than 3 years have passed since last update.

post-checkout + direnvでブランチ切り変え時に新しくDBを作成して、向き先を変更する

Posted at

こんにちは、ミツバです。
今回はタイトル通り、ブランチ切り変え時に新しくDBを作成して向き先を変更ようにします。

前提

  • Rails4
  • mysql

.git/hooks/post-checkoutを作成

こちらを利用したいプロジェクトに配置します。

#!/bin/bash

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

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

# ファイルのチェックアウトの場合はここで終了
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")

echo "prev branch: $PREV_BRANCH_NAME"
echo "current branch: $CURRENT_BRANCH_NAME"

dump() {
  # create dir
  if [ ! -d $HOME/dump ]; then
    mkdir $HOME/dump
  fi

  # create dump file
  if [ ! -f $HOME/dump/$1.sql ]; then
    mysqldump -h 0.0.0.0 --skip-lock-tables --single-transactio --user=<user_name> --password=<password> -B $1 -r $HOME/dump/$1.sql
  fi
}

setup() {
  readonly NEW_DB_NAME=$(echo "$1_${CURRENT_BRANCH_NAME}" | sed "s#-#_#g")

  echo "exists check: $(mysql -h 0.0.0.0 --user=<user_name> --password=<password> -e 'show databases;' | grep $NEW_DB_NAME)"

  # dbの存在check
  if [ -z $(mysql -h 0.0.0.0 --user=<user_name> --password=<password> -e 'show databases;' | grep $NEW_DB_NAME) ] ;then
    mysql -h 0.0.0.0 --user=<user_name> --password=<password> < <(sed "s/$2/${NEW_DB_NAME}/g" $HOME/dump/$2.sql)

    # direnvでは変更されなかったので、直に変更する
    DB_NAME=$NEW_DB_NAME
    echo "target database: $DB_NAME"

    bundle ex rake db:seed
  fi
}

dump ${DEVELOPMENT_DB_NAME}
setup "prefix" ${DEVELOPMENT_DB_NAME}

direnv reload

exit 0

direnv editで環境変数を設定

以下のように設定しておきます。

BRANCH_NAME=$(git branch | grep \* | cut -d ' ' -f2 | sed 's/-/_/g')
export DB_NAME=$(if [ $BRANCH_NAME = "develop" ]; then echo 'development_db' ;else echo $BRANCH_NAME ;fi)

export DEVELOPMENT_DB_NAME=development_db

あとは chmod +x <file_name>で実行できるようにして、 checkoutするだけ。

所感

使用感としては良さげなのですが、git checkout -bとかでブランチ移動した時に挙動が変になったりしてしまいます。
そこらへんを上手いこと解決できたら最高っぽいなぁと感じます。
後、よくわかっていないのですが、database nameに - は入れてはいけないっぽかったので全部 _ に直すようにしました。

他にも良さそうなのがあったら教えてください🙏

懸念点

database増えすぎる問題

ありすぎるので定期的にdatabase全消し祭を行なってください。

参考

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0