背景
初めてのMyPCを手に入れてから早3年、Webサービスを作りたいという一心で勉強してきました。レベル感としてはRailsアプリケーションが人並みに書ける程度の実力です。表題に至ったのは以下の理由
- herokuでcleardbを使ってAPIサーバー運用してる
- ステージングサーバーを作ったので、定期的に本家のデータを流し込みたい
- rakeタスク作った!流し込もう!
- mysqldumpが見つからない…だと?
postgresqlを使う場合はherokuがもともと提供しているコマンドを使えばいいのですが、 cleardbを使っているので、どうしてもmysqldump
を使いたいと思ったのが背景。
buildpack
buildpackを使えば、heroku上で望んだ実行環境が簡単に作れるらしい。
mysqlのbuildpackがないか色々と調べましたが、既存のものはheroku createの段階で読み込むことを前提にしているようで、私みたいに後から入れたい!って人には冷たい仕様になっていました。
buildpackのファイル構成は以下のようになっていて、
注釈のような役目をそれぞれ担っています。冷たかったのは、releaseでしか環境変数の設定がされてないので、パスがうまく通せてなかったのが原因だったんですね。
bin
├── compile #buildpackが実行可能かどうかを判断し、実行可能であれば0を返す
├── detect #build処理本体
└── release #環境変数の設定とアドオン追加は初回のgit push時にのみ実行
.profile.d
環境変数の設定などはrelease
意外にも.profile.d
で設定できるぜ!
というかbuildpack-multi
を使うならそれが尚更いいよ!
とherokuさんがおっしゃっていたので、.profile.d
を作成し、そこにPATHを通すための設定を書けばいいのでは?ということで実践。
実践
mysqlのファイルを解凍、ビルドしたのち、.profile.d
にパスの設定ファイルを作成
#!/usr/bin/env bash
echo "------> Installing Mysql 5.1"
BUILD_DIR=$1
BUILD_PATH=$(cd $1 && pwd)
PROFILE=${BUILD_PATH}/.profile.d
cd $BUILD_DIR
# download the minimal mysql tar file
echo "------> Downloading minimized tarball"
wget https://raw.githubusercontent.com/gaumire/mysql-binary/master/mysql.tar.gz
# make a directory to untar (like unzip) the binary
mkdir -p $BUILD_DIR/.heroku/vendor/mysql
# untar the binary to a directory inside /app/.heroku
tar -C $BUILD_DIR/.heroku/vendor/mysql -xvf mysql.tar.gz
# remove the tar file
rm -f mysql.tar.gz
mkdir -p ${PROFILE}
touch ${PROFILE}/mysql_buildpack_paths.sh
echo "export PATH=$PATH:/app/.heroku/vendor/mysql/bin" >> ${PROFILE}/mysql_buildpack_paths.sh
echo "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/app/.heroku/vendor/mysql/lib" >> ${PROFILE}/mysql_buildpack_paths.sh
echo "export LIBRARY_PATH=$LIBRARY_PATH:/app/.heroku/vendor/mysql/lib" >> ${PROFILE}/mysql_buildpack_paths.sh
release
とdetect
は他の人のを参考に
#!/usr/bin/env bash
cat << EOF
---
config_vars:
PATH: $PATH:/app/.heroku/vendor/mysql/bin
LD_LIBRARY_PATH: $LIBRARY_PATH:/app/.heroku/vendor/mysql/lib
LIBRARY_PATH: $LIBRARY_PATH:/app/.heroku/vendor/mysql/lib
EOF
#!/usr/bin/env bash
echo "Mysql 5.1"
exit 0
githubにpushして、リポジトリのURLをコピー、
buildpack-multiを使って複数の実行環境を読み込めるようにする。
$ heroku buildpacks:set https://github.com/ddollar/heroku-buildpack-multi.git --app App名
自分のプロジェクトに.buildpacksファイルを作り、プロジェクトに必要な環境設定と、自分で作った設定ファイルのURLを記述
https://github.com/heroku/heroku-buildpack-ruby.git #railsプロジェクトの為必須
https://github.com/buildpackのURL
あとは
$ git push heroku master --app App名
これでmysqldump
がheroku上で使えるようになりました!