展開の目的でフックを使用しないでください。ビルドツール(Ant、Mavenなど)と継続的インテグレーションツール(CruiseControl、CruiseControl.rb、Hudsonなど)を使用します。フックの使用は、いくつかの理由で間違っています。
- スケーリング。フックはスケーリングしません。フックスクリプトに、たとえばデプロイメントとして想定されていないことを実行させることは困難です。これは、正常に実行するために常にいくつかのトリックを必要とします。
- 柔軟性。フックは十分な柔軟性がありません。プロセスに変更があるたびに、それらを書き直す必要があります。そして、あなたの修正は、あなたが以前にフックで何とかしていたことを壊すかもしれません。
- セキュリティ。ftp / sshデプロイメントのログイン/パスワードをフックに直接保存しますか?それは大きな間違いになります。回避策が見つかるかもしれませんが、フックがセキュリティ管理の場所でない限り、それも良くありません。
- 複雑さ。展開には通常、最初はそうではないと思われる場合でも、実行するための多くの特定のアクションが必要です。フックスクリプトでデプロイを開始すると、フックスクリプトが膨らみ、管理できなくなることがわかります。
- ソース管理。フックをソース管理下に置くことはできません。それをソース管理下に置くことを試みる場合、プロジェクトソースと一緒にフックを1つの場所に格納することが難しい限り、後で間違いなく後悔するでしょう。
あなたがする必要があるのは:
- 展開手順を説明するビルドスクリプトを作成する
- 継続的インテグレーションツールをインストールする
- 継続的インテグレーションツールでビルドスクリプトとリポジトリを使用する
- コミット時にビルドを実行するように継続的インテグレーションツールを構成する
- リポジトリへのコミットを実行し、作成したビルドスクリプトに従って変更が自動的にビルドおよびデプロイされる方法を確認します。
個人的には、あなたが説明した目的のためにAntとCruiseControl.rbを使用しています。変更をftpプロトコルでデプロイするためのビルドスクリプトの例を次に示します。
<?xml version="1.0"?>
<project name="myproject" default="deploy-local">
<property file="build.properties"/>
<target name="deploy-local">
<echo message="Deploying version ${version}" />
<delete dir="${deploy.path.local}" />
<copy todir="${deploy.path.local}">
<fileset dir="." includes="**/*" >
<exclude name=".svn/**" />
<exclude name="build.*" />
</fileset>
</copy>
</target>
<target name="deploy-remote">
<echo message="Deploying project" />
<ftp action="del"
server="${deploy.remote.server}"
userid="${deploy.remote.login}"
password="${deploy.remote.pass}">
<fileset>
<include name="${deploy.path.remote}"/>
</fileset>
</ftp>
<ftp action="mkdir"
server="${deploy.remote.server}"
userid="${deploy.remote.login}"
password="${deploy.remote.pass}"
remotedir="${deploy.path.remote}">
</ftp>
<ftp server="${deploy.remote.server}"
userid="${deploy.remote.login}"
password="${deploy.remote.pass}"
remotedir="${deploy.path.remote}"
passive="yes">
<fileset dir="." includes="**/*" >
<exclude name=".svn/**" />
<exclude name="build.*" />
</fileset>
</ftp>
</target>
</project>
build.properties
ファイルには次の内容が含まれています。
deploy.path.local = C:\\apache\\htdocs\\myproject
deploy.path.remote = /http/deploy
deploy.remote.server = ftp.myproject.com
deploy.remote.login = mylogin
deploy.remote.pass = mypass
時間をかけてビルド管理(Ant)と継続的インテグレーション(CruiseControl)の基本を学び、最も適切な方法でデプロイを実行することをお勧めします。それはあなたが要求したものではなく、もう少し複雑に見えるかもしれませんが、それは正しいことです。