開発するときにリポジトリからwebhookでPOSTをリクエストして自動でデプロイしたいのですがうまくいかなかったので、詰まったポイントと解決策を記していきたいと思います。
まずは前提です。
- WordPress のテーマをGitHubからpull
- VPSでCentos7系、apache
- deploy.phpにshell_execでシェルを実行
今回詰まったポイントは権限がどういう風に動いてるのかいまいちちゃんと理解していなかったので、どこが問題なのかと言う切り分けに時間がかかりました。WordPress のテーマを開発してGitにプッシュが来たらwebhookでリクエストしてPHPファイルからシェルコマンドを実行するといった流れでデプロイしていきます。
解決方法
- リポジトリとdeploy.phpの実行権限をapache:apacheにする(CentOS 6系だとwwwらしい)
- git which で Git の絶対パスを探して直実行する
- git status 2>&1 のようにしてエラーログを確認する
解決方法は以下の3.2箇条書きでまとめました。まずはリポジトリとデプロイ用のPHPファイルの権限をapache:apacheにします。今回はリライトの問題で404が出てしまうため、ディレクトリ直下にdeploy.phpを置いています。
chown -R apache:apache [ここにテーマのパス]
chown -R apache:apache [ここにdeloy.phpのパス]
次にGitの絶対パスを取得してコマンドが必ず実行されるようにしましょう。
git which
下記の例のように表示されたパスとGitコマンド合わせると通常通り実行することがわかると思います。
/usr/bin/git status
次はdeploy.phpにデプロイ用のコマンドをshell_execを使って書きます。最後に記載されている 2>&1 は失敗や成功した時のメッセージを受け取るためのものなので動かない時のデバックのためにも記載しておきましょう。
<?php echo shell_exec("cd [リポジトリまでのパス] && /usr/bin/git pull 2>&1");
僕の場合はここでうまくpullができなく「Could not create directory ‘/usr/share/httpd/.ssh’. Host key verification failed. fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.」とエラーメッセージが表示されました。Root権限ではsshキーが共有されていたので、そのsshキーを/usr/share/httpd/.sshに設置することで無事自動でデプロイできる環境が整いました。