Git
MySQL
xserver
homestead
laravel5.5

Laravel5.5(Homestead)をXSERVERにGitでデプロイする努力の過程

参考資料

なぞってみました。

SSH接続

手順通りで問題なく完了。

gitインストール、パス通し

最初から入っているのは以下のバージョンでした。

$ git --version
git version 1.8.3.1

最新はGitを見た限りだと2.15.1とかそんなでした。
……まあいいか。

Composerインストール

これも入っているのでいいんじゃないかなとか思ったんですが。

$ composer --version
Composer version 1.5.2 2017-09-11 16:59:25

結局ダメだったので後段でupdateとかしてます。
ただ、現時点だとphpのバージョン的に、欲しい状態にならないのでここではスルーします。

XSERVERへのデプロイ

さて、準備はできたということで、XSERVERへデプロイ、してみようかと思ったんですが。

そもそもGit用意できてない

これです。
正直Gitに関しては利用経験があまりなく、今回もサーバーにアップロードしたりしているものの、Gitは完全にスルーしていました。
というわけでそのあたりの環境を整えるべく、別途調べ始めました。

参考資料

基本的にこれを見つつ、

XSERVERをリモートに指定する方法はこれを見てやりました。

やりたいことは

やりたいこととしては、こんな感じです。

  • ローカルのLaravelディレクトリ配下をgitで管理したい
  • このディレクトリはvagrantとの共有フォルダになっている
  • GitHubじゃなくて自前で管理したい
  • 管理の場所をサーバーにしたい

というわけで、用語があやふやでしたがおそらくやりたいこととしては
『レンタルサーバーにリモートリポジトリをベアリポジトリとして作成し、ローカルリポジトリと同期させたい』
みたいな感じになるのかな(あやふや)。

Gitのリモートリポジトリをどこに置くか?というのは文化ごとにいろいろあるみたいで、だいぶ混乱しました。

  • リモートリポジトリはホーム直下に置いて、公開ディレクトリからシンボリックリンクで飛ばす
  • リモートリポジトリを公開ディレクトリに置いて、ベアリポジトリを別途配置。同期するようにhooksで設定する

そして今回やりたいのはこのどっちとも違うという……。

共有フォルダを作成する

共有フォルダはローカルを真として仮想環境に反映されるんですね。
最初、仮想環境のプロジェクトをローカルの空ディレクトリと共有させてしまい、プロジェクトが消えて焦りました。

初期からある共有フォルダのhome_vagrant_code(その名の通り、/home/vagrant/codeに紐付いてます)に、ローカルのLaravelプロジェクトのパスを指定しました。

……あ、もしかしたらHomestead.yamlのfoldersかもしれません。

folders:
    - map: ~/app/share/test1
      to: /home/vagrant/code

sites:
    - map: homestead.test
      to: /home/vagrant/code/Laravel/public

どっちだろ。
どっちみちsitesも設定するだろうから一緒に確認するってことでひとつ。

レンタルサーバーにリポジトリを作る

冒頭の資料だとGitHubからコードを取得していますが、サーバーにリポジトリを作りたいです。
というわけで、一旦そのためにいろいろとします。

サーバー
##ベアリポジトリを作成する
mkdir ~/XXXXX.xsrv.jp/git
cd ~/XXXXX.xsrv.jp/git
git init --bare YYYYY.git
git config --get-all core.bare
#falseと出たらなんか設定変更が必要らしいけど出なかったのでスルー

##公開用リモートリポジトリを作成する
cd ../public_html
mkdir YYYYY
cd YYYYY
git init

##ベアリポジトリと公開用リポジトリが同期するようにスクリプトをベア側に仕込む
cd ~/XXXXX.xsrv.jp/git/YYYYY.git/hooks/
touch post-receive
vi post-receive
###仕込むのは以下の2行
####cd /home/XXXXX/YYYYY
####git --git-dir=.git pull /home/XXXXX/XXXXX.xsrv.jp/git/YYYYY.git master
chmod +x post-receive
ローカル
##Laravelプロジェクト直下で実行
cd Laravel
git init
git add .
git commit -m "1st commit."
git remote add origin ssh://XXXXX@XXXXX.xsrv.jp:10022/home/XXXXX/XXXXX.xsrv.jp/git/YYYYY.git

とかそんな感じで。

改めてデプロイ

さて、ようやく本来の資料に戻ります。
githubじゃないところからクローンする方法は以下を参考にしました。

$ cd
$ mkdir YYYYY
$ cd YYYYY
$ ls

$ git clone /home/XXXXX/XXXXX.xsrv.jp/git/YYYYY.git/ .
Cloning into '.'...
done.

$ ls
app            composer.lock  phpunit.dusk.xml  resources   tests
artisan        config         phpunit.xml       routes      webpack.mix.js
bootstrap      database       public            server.php
composer.json  package.json   readme.md         storage

$ composer install
#なんかすごい怒られた

怒られました。
しかしこれが実行できないとvendorが作成されないので困ってしまいます。

phpのバージョンを変更する

エラーをよく見ると、なんかだいたいphpのバージョンで怒られてました。

  Problem 1
    - This package requires php >=7.0.0 but your PHP version (5.4.16) does not satisfy that requirement.
  Problem 2
    - Installation request for barryvdh/laravel-debugbar v3.1.0 -> satisfiable by barryvdh/laravel-debugbar[v3.1.0].
    - barryvdh/laravel-debugbar v3.1.0 requires php >=7.0 -> your PHP version (5.4.16) does not satisfy that requirement.
  Problem 3
    - Installation request for doctrine/inflector v1.2.0 -> satisfiable by doctrine/inflector[v1.2.0].
    - doctrine/inflector v1.2.0 requires php ^7.0 -> your PHP version (5.4.16) does not satisfy that requirement.

#以下延々と続く

デフォルトのphpを変えればいいんだろうか。
というわけでググりました。

方法的には二つあって、ひとつはcomposerの設定をサーバー側のphpでも動くようにする方法。
もうひとつは、サーバー側のphpを変更する方法らしいです。
確かFB認証でphp7以上が必要だったので、ここで必要なのか……はちょっとわかりませんが、ここではサーバー側のphpをいじくることにします。

どうせなら仮想環境と揃えたい……と思って確認したところ、仮想環境は7.2でローカルは7.0でした。

なにもかもが違う。

せめてローカルと揃えよう……と思ったのですが、ローカルの正確なバージョンは7.0.14で、こちらはXSERVERには存在しません。

$ php -v
PHP 7.0.14 (cli) (built: Dec  8 2016 23:34:17) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
$ find /opt/php-7*/bin -type f -name 'php'
/opt/php-7.0.0/bin/php
/opt/php-7.0.16/bin/php
/opt/php-7.0.17/bin/php
/opt/php-7.0.18/bin/php
/opt/php-7.0.3/bin/php
/opt/php-7.0.7/bin/php
/opt/php-7.0.9/bin/php
/opt/php-7.1.2/bin/php
/opt/php-7.1.3/bin/php
/opt/php-7.1.4/bin/php

なんなの。
仕方ないので最新にします。

$ ln -s /opt/php-7.1.4/bin/php $HOME/bin/php
$ vi .bash_profile
#$PATH:$HOME/binを$HOME/bin:$PATHに変更する

で、この状態でcomposer install……はまだ早い。
まんまとやってしまいましたが。
環境変数の再読み込みが必要でした。

$ source ~/.bash_profile

duskをdiscoverしない

というわけで改めてcomposer installとかcomposer updateとか。

エラー。
今度は何。
duskが引っかかってるみたいです。
あーね。

laravel/duskをdont-discoverに指定すると通るようになりました。
えらい苦労した。

.envの追加

さていよいよデプロイ。
と思ったらまだエラー。

$ php artisan key:generate

In KeyGenerateCommand.php line 96:

  file_get_contents(/home/XXXXX/YYYYY/.env): failed to open stream: No  
   such file or directory                                                      

あーね。
.envはgitに含まれないんでしたね。
とりあえずDBの部分をXSERVERのものに変更しておきます。

$ vi .env
$ php artisan key:generate
Application key [XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX] set successfully.
$ chmod 600 .env
$ chmod -R 777 storage
$ chmod -R 777 bootstrap/cache
$ php artisan migrate

で、通りました。
やったぜ。

公開用リポジトリにpublic_htmlからリダイレクトさせる

参考にした記事の方は、XXXXX.xsrv.jpに行くとXXXXX.xsrv.jp/publicにリダイレクトする設定です。
中身的な動きとしては、public_htmlに行くとpublic_html/publicにリダイレクトされる、ということになります。

サービスは複数作りたいので、publicではなくてサービス名にしてみます。
また、そうなるとリダイレクト設定も不要になり、YYYYYのシンボリックリンクだけでよいことになります。

cd ~/XXXXX.xsrv.jp/public_html
ln -s ~/YYYYY/public ./YYYYY

また、ここまでの手順でいろいろいじっているうちにYYYYYになぜかリモートリポジトリが作成されていました。
名前が重複するので、そのままだとシンボリックリンクを作成できません。

リモートリポジトリはXXXXX.xsrv.jp/git/YYYYY.git/に作成しているものが正しいので、こちらは不要です。
(試行錯誤していたにしろ、なぜpublic_htmlにいるのか我ながら不思議ですが……)
そのため、rm -rf YYYYYで無理やり削除します。

ともあれ、これでやりたいことができるようになりました。
長かった……。