LoginSignup
6
5

More than 5 years have passed since last update.

heroku buildpackを自作してmysqldumpをした話

Posted at

背景

初めての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にパスの設定ファイルを作成

compile
#!/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


releasedetectは他の人のを参考に

release
#!/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
detect
#!/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を記述

.buildpacks
https://github.com/heroku/heroku-buildpack-ruby.git #railsプロジェクトの為必須
https://github.com/buildpackのURL

あとは

$ git push heroku master --app App名

これでmysqldumpがheroku上で使えるようになりました!

参考:
heroku-buildpack-mysql
herokuにbinary組み込むbuildpack

6
5
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
6
5