そろそろ、上げれるものが出来てきたので、リリーススクリプトが必要になってきた。
Subversionを使用しているのに、毎回チェックアウトorエクスポートしてFTP経由でサーバーに上げるのもナンセンスなので、サーバー上で動くリリーススクリプトを作成した。
とりあえず思いついた実装内容は、
- Subversionリポジトリから、指定のバージョンやタグのApacheのルート部分からごっそりExportする。
- CGIのパスを「c:/perl/bin/perl」から、「/usr/local/bin/perl」に書き換える
- MySQLの設定をローカルの物から、サーバー用に置き換える。
- 指定したディレクトリ(Apacheが外部に公開しているディレクトリ=/home/myways/www配下)へExportしたディレクトリを置き換えるor更新されている部分だけを上書きする。
複数あるローカルの環境はWindowsなので、2番は便利になる。
3番目も、ローカルの設定は同じなので便利になる。
サーバー上でSubversionからExportするには、
/home/myways/local/bin
にパスを通して、(.bashrcで通してある)
svn export --force file:///home/myways/var/svn/myway/trunk/htroot /home/myways/work/rel/
のコマンドで、
/home/myways/var/svn/myway/trunk/htrootから/home/myways/work/rel/へエクスポートが出来る。
シェルスクリプトを作成して、引数でSubversionのディレクトリと、Export先のディレクトリを設定できるようにする。
このコマンドを、
svn export --force /home/myways/var/svn/myway/$1 $2
とすれば、
第1引数で、Subversion上のディレクトリ、第2引数でExport先のディレクトリを指定できる。
Exportしたディレクトリ、ファイルに対して、
CGIのパスと、MySQLの設定を書き換え、置き換えするスクリプトを書くのですが、
シェルスクリプトで書くよりPerlで書いた方が楽だったので、Perlで該当の処理を記述。
長くなるので、コードは割愛して、
内容は、$1と$2を引数で与えて、$1から$2へディレクトリを作成しつつ、コピーをして、
ファイルの場合コピーをする際に、拡張子を見て、「.cgi」なら、
正規表現を使って、Perlのパスを書き換える。
MySQLの設定が記述されたファイルなら、これもまた書き換えるといった内容。
コマンドはこんな感じで実行。
/usr/local/bin/perl release.cgi $3 $2 >> release.log
出来上がったシェルスクリプトは、
#!/bin/sh
LOGFILE=release.log
SVNDIR=$1
EXPORTDIR=$2
TARGETDIR=$3
rm -r $EXPORTDIR
mkdir $EXPORTDIR
svn export --force file:///home/myways/var/svn/myway/$SVNDIR
$EXPORTDIR > $LOGFILE
if [$4 = "clean"]; then rm -r $TARGETDIR fi
perl
release.cgi $TARGETDIR $EXPORTDIR >> $LOGFILE
すべて絶対パスで記述。
第1引数 Subversion上のExportするディレクトリ
第2引数 ExportするWorkディレクトリ
第3引数 Exportしたファイルを配置するディレクトリ
第4引数 cleanなら第3引数のディレクトリを一回削除してから、コピーする
即席なのでこんなもんかな・・・
ログファイルのローテイトと、ディレクトリの確認ぐらいはすればよかったかな。
これを「.bashc」に使いそうなバージョンをaliasで登録しておけばOK。
alias mwyrel="/home/myways/work/rel/release.sh trunk/htroot
/home/myways/work/rel/svn /home/myways/www"
とかしようかなw
パターンが増えてきたらrelease用にsourceするファイルを作成する。
最後にサーバ上のシェルスクリプトのパーミッションの変更を忘れずにする。
chmod 700 /home/myways/work/rel/release.sh
chmod 700 /home/myways/work/rel/release.cgi
これで、FTPは用なしです。