Open1

xserverにssh接続してgit操作

kazuaki uedakazuaki ueda

公開サーバーにssh接続

SSH設定 - xserver

xserverへのssh接続設定を ~/.ssh/config に書いておく。

Host xserver
  HostName サーバーID.xsrv.jp
  Port 10022
  User サーバーID
  IdentityFile ~/.ssh/秘密鍵のファイル名
  ServerAliveInterval 60

ssh接続

 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! 

のようなメッセージで接続できない場合は known_hosts を確認する。
公開鍵を更新した場合など known_hosts から対象サーバーの行を削除。

xserver側でテーマフォルダをリポジトリ化

cd example.jp/public_html/wp-content/themes/mytheme
git init
git add .
git commit -m "first commit"

とした時に

fatal: empty ident name (...) not allowed

のようなエラーメッセージでコミットできない場合。
エラーメッセージの説明に沿って、メールアドレスとユーザー名を登録しておく。

git config --global user.email "you@example.com"
git config --global user.name "Your Name"

branch名が master の場合は main に変更。

git branch -m main

GitHubのリポジトリから pull してみると、

git pull origin main

次のエラーが発生。

Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

ということで、xserverのシェルで公開鍵を作って GitHubに登録する。

cd ~/.ssh
ssh-keygen -t rsa -b 4096 -C "you@example.com"

これで ~/.ssh の中に id_rsa, id_rda.pub が生成される。
id_rsa.pub を vi で開くなどして内容をGitHubへ登録。
SSH keys - GitHub

xserverのシェルから接続できるか確認する。

ssh -T git@github.com

リポジトリの設定でwebhook

GitHubのリポジトリで設定 -> Webhook を開く。

Webhookから呼び出すスクリプト(PHP)

結論から言うと stripslashes($_POST['payload']) が必要だった。

$payload = stripslashes($_POST['payload']);
$payload = json_decode($payload, true);

Webhookの実行

GitHubのリポジトリへのpushをトリガーとしてWebhookを実行させる。
Webhookに所定のURLを設定。
URLが呼び出されることでpayloadが配信される。
公開サーバー側のスクリプトでpayloadを受け取って所定のpullコマンドを実行。
公開サーバー側のgit管理下のファイルが更新される。

GitHub WebHook POSTs not going through - stackoverflow

Creating webhooks - GitHub Docs

参考にさせていただいた記事