MENU

shell_exec を使ってGitの自動デプロイでうまくいかない時の解決方法 [WordPress]

2020 5/04
shell_exec を使ってGitの自動デプロイでうまくいかない時の解決方法 [WordPress]

開発するときにリポジトリからwebhookでPOSTをリクエストして自動でデプロイしたいのですがうまくいかなかったので、詰まったポイントと解決策を記していきたいと思います。

まずは前提です。

  1. WordPress のテーマをGitHubからpull
  2. VPSでCentos7系、apache
  3. deploy.phpにshell_execでシェルを実行

今回詰まったポイントは権限がどういう風に動いてるのかいまいちちゃんと理解していなかったので、どこが問題なのかと言う切り分けに時間がかかりました。WordPress のテーマを開発してGitにプッシュが来たらwebhookでリクエストしてPHPファイルからシェルコマンドを実行するといった流れでデプロイしていきます。

目次

解決方法

  1. リポジトリとdeploy.phpの実行権限をapache:apacheにする(CentOS 6系だとwwwらしい)
  2. git which で Git の絶対パスを探して直実行する
  3. 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に設置することで無事自動でデプロイできる環境が整いました。

参考記事

Stack Overflow
'git pull' command work from terminal but not with php shell_exec() via git repository hook
'git pull' command work from terminal but not with php shell_exec() via git repository hookI have create a webhook in my github repository which post on the hook url on my live server to run pull command for update my repo files on the server. The p...
https://jondavidjohn.com/git-pull-from-a-php-script-not-so-simple/

この記事を書いた人

aniuma はデジタルパブリッシングのお手伝いをおこないます。 WordPress のエキスパートがシステムの企画・開発・保守をお手伝いします。

コメント

コメントする

目次
閉じる