Webアプリケーション上から git clone をする際にはまったのでメモしておきます。
ちなみにgitコマンドはphp上からパイプで実行しました。
今日もニコニコ カチャカチャカチャ・・・ッターン!
手順
1.デプロイ用アクセスのためのssh秘密鍵/公開鍵を生成します。
ssh-keygen -t rsa
2.公開鍵をGitHub/GitLabリポジトリの Deploy Key に登録します。
3.秘密鍵の所有者をapache、パーミッション600に設定します。
chown apache:apache deploy_key
chmod 600 deploy_key
必要ならsudoを使います。
4.git-ssh.sh を作成します。
git-ssh.sh
# !/bin/sh
exec ssh -i /path/to/deploy/key "$@"
chmod 755 git-ssh.sh
5.clone用のシェルスクリプトも作成しておきます。
clone.sh
# !/bin/sh
# cloneの準備, 引数でパスを受け取ったり...
CLONE_TARGET=git@github.com:youraccount/yourrepository.git
export GIT_SSH=/path/to/git-ssh.sh
git clone ${CLONE_TARGET}
6.いずれのシェルスクリプトもapacheユーザーが実行できるようにしておきます。
chmod 755 git-ssh.sh
chmod 755 clone.sh
7.apacheユーザーになってssh接続します。
sudo -u apache ssh -i path/to/deploy/key -T git@github.com
8.きっと怒られます。
stderr
Could not create directory '/path/to/apache/homge/.ssh'.
Host key verification failed.
fatal: The remote end hung up unexpectedly
解決策1:.ssh ディレクトリを作成する場合
上記で怒られた場所に.sshディレクトリを作成し、再度手順7を行います。
mkdir /path/to/apache/homge/.ssh
chmod 755 /path/to/apache/homge/.ssh
sudo -u apache ssh -i path/to/deploy/key -T git@github.com
解決策2:.ssh ディレクトリを作成したくない場合
一時的に.sshディレクトリを作成するか、別のリポジトリ認証済みのPCにて、~/.ssh/known_hosts
に登録されている 接続先の指紋 をapacheさんが稼動するPCの/etc/ssh/ssh_known_hosts
にコピペします。
解決後
Webページのスクリプトからapacheさんの権限でclone.shを実行します。
動いたら成功!
もし動かない場合はstderrをしっかり出力して原因を確かめてみましょう!
さいごに
はまっている時に助けてくれた神こと l3msh0@github氏 に感謝。