初級エンジニアとしての関門 gitでデプロイ。。
これができなきゃエンジニアとして話にならないし、Laravelを使ってWEBアプリの開発するなんて全然遠い話。
検索しまくって、さまざまな方のブログ記事などを読んだが、自分の理解力が足りないためさっぱりわからない。
ターミナル、Laravel、soucetree、git、github、bitbucket、レンタルサーバーなどなど、人によって開発環境も違うし利用するツールも違う。
自分の実現したいことと、ブログ記事で紹介しているやり方、ツールや目的が微妙に違ったりして
その通りやってはみるんだけど、ターミナルでエラーが頻発したり、いまいち望んでない結果になったり。
そして、エラーになる度に調べると、また知らない言葉が出てきて、それを調べるとまた違う言葉がでてきて
どんどん知りたいことから離れていって、またエラーがでて・・・・
なんてことを繰り返して疲れ果てて、やっぱりFTPソフトでちまちまやっていくかとあきらめかけた時に出会ったブログ記事。
★Git 本番と開発環境の連携 初めてのデプロイ ←この通りにやったら初デプロイ成功!
https://qryheavy.com/2018/05/24/git_deploy/
非常に助かりました。
備忘録も兼ねて自分用に要点を書き出してみます。
※本ブログ記事では、あくまで初学のエンジニアが、自分の開発環境で作ったLaravelファイルをsourcetreeのgit環境を構築してエックスサーバーのドメインに初めてデプロイ成功したときまでの内容になります。
様々なやり方や、実際のチームでの開発環境とは大いに異なると思いますが、ご容赦ください。
自分のPC環境でファイル編集をして、sourcetreeでステージングアップ→コミット→プッシュをすると、自動的にエックスサーバーの任意のドメインに編集した内容がデプロイされるまで。
使用PC : mac
git管理 : sourcetree
サーバー : エックスサーバー
前提
※レンタルサーバーにsshログインができる
※sourcetreeでgithubやbitbucketまではコミットできるぐらいの知識がある
※FTPを使ってレンタルサーバーにファイルをアップすることができる
手順
自分のPCの任意の場所にLaravelをインストールします。
$ composer create-project laravel/laravel projectの名前
上記のコマンドでは「test-app」というフォルダを作って、そこにLaravelをインストールしてねという意味なので、もともと自分が作成したフォルダにインストールさせるには
$ composer create-project laravel/laravel .
とする。
もしLaravelのバージョンを指定してインストールしたい場合は
$ composer create-project “laravel/laravel=6.*” projectの名前
など
sourcetree を立ち上げ
以下のようにローカルリポジトリを作成
自分のPCのプロジェクト(上記でLaravelがインストールされているフォルダ)を選択
すると下記のようになります。
試しに、プロジェクトフォルダに移動して
ls -a
とうつと、.git フォルダが作成されていることがわかります。
sourcetreeのタブで先ほど作ったローカルリポジトリのタイトルをクリックすると
プロジェクトが開く(この時点ではまだ、プロジェクトフォルダ内のファイル、フォルダはインデックスされてない。コミット&プッシュはまだしない)
エックスサーバーにsshログインするやり方はこちら
https://haleid.jp/archives/82
ログイン後すぐの状態は
[myname@sv10011 ~]$
$ pwd
と叩くと
/home/myname/
となるはずです
ここでベアリポジトリを設置するフォルダを作成します。
$ mkdir -p /git/project1.git
※project1というのはなんでもいいです。
作ったproject1.gitに移動
$ cd /git/project1.git
ベアリポジトリを作成
$ git init --bare --shared
リモートリポジトリは複数人で管理することになるので、念の為共有リポジトリにするために–sharedをつける
以下のように表示されればOK
Initialized empty shared Git repository in /home/yourname/git/project1.git/
sourcetreeを立ち上げ2で作成したローカルリポジトリを開き、右上の設定(歯車マーク) > リモート を選択し、リモートリポジトリのパスのURLを入力すると、ローカルとリモートリポジトリが連携される
sourcetreeの下記の画面を開き
右上の歯車マーク(設定)をクリックすると以下が開く
リモートをクリックし追加をクリック
URL / パス の部分に、エックスサーバーのリモートリポジトリを設置した場所を入力しOKを押す
URL / パスにはエックスサーバーでsshログインする時のパスと、先ほど設置したベアリポジトリまでのパスを書く
例
ssh://yourname-xserver/home/yourname/git/projectname.git/
すると以下の画面に戻ります。
これで無事リモートリポジトリとローカルリポジトリが連携しました。
エックスサーバーにログインし、該当のドメインまで移動。(public_htmlなどのフォルダがある階層)
※もともと存在するpublic_htmlフォルダはリネームしておき避けておく
以下コマンドを入力し3で作成した共有リモートリポジトリを、希望のドメイン配下にクローンする
※project1というフォルダはmkdirしておかなくてもいい。
$ git clone /home/yourname/git/project1.git project1
以下が表示されればOK
Cloning into 'project1'...
warning: You appear to have cloned an empty repository.
done.
上記で共有リポジトリを本番環境にクローンしただけでは、ファイル編集してコミットと同時にファイルは公開されません。
このためにgitのフックを利用します。
共有リポジトリにプッシュされたことを検知して、「本番サーバーのgit」から「共有サーバーのgit」へ情報を自動的に「引っ張ってくる」ことをフックと言います。
→はい、ここが理解できてなかったポイントの一つです。
共有リポジトリ(ベアリポジトリ)のフックに移動
$ cd /home/youename/git/project1.git/hooks
viコマンドでvimというエディタを開きつつpost-receiveという名前でファイルを作成します。
$ vi post-receive
ターミナルがエディタに変わります。
キーボードの i を押すと編集可能状態になります。
以下のように打ちます。
#!/bin/sh
cd /home/yourname/yourdomain.com/project1/
git --git-dir=.git pull
うち終わったら esc キーを押し :w で保存して :p で編集を終わります。
中身の内容は、
(SourceTreeからPushされたら)
本番ドキュメントルート(/home/yourname/yourdomain.com/project1/)に行き、
共有リポジトリからファイルの更新情報を引っ張る(pull)するという意味です。
共有が情報を本番に送るんじゃなくて、本番が共有から引っ張ってくるんですね。
そして最後にpost-receiveの権限を変更します。
$ chmod 755 post-receive
他のユーザからも実行できるように、実行のパーミッションを設定する必要があります。
これで設定は以上。
そこでgit pull
を行えばproject1フォルダ内に編集後のファイルが反映されます。
sourcetreeからコミット&プッシュしてみて、ドメイン配下のプロジェクトフォルダ内にLaravelプロジェクトが生成されてるのを確認
もしproject1フォルダにLaravelのファイル等が何も無ければ失敗です。
一度上記の5番、6番などに戻ってフォルダ削除し再度作り直しなどしてみます。
作成したプロジェクトをURLからアクセスできる様にするために、
ドメインのドキュメントルートとLaravelの公開ディレクトリのひもつけの作業をする必要があります。
エックスサーバーでは『ドメイン名/public_html』というディレクトリが各ドメインのドキュメントルートとして設定されています。
一方でのLaravelは『プロジェクト名/public』がインターネット上への公開ディレクトリとして定められています。
例)/home/sample/sample.xsrv.jp/public_html
※上記はいずれもSSH接続したホームディレクトリから参照できます
②Laravelの公開ディレクトリ:『test-app/public』
例)/home/sample/sample.xsrv.jp/project1/public
何をするのかというと
『①ドメインのドキュメントルート』から『②Laravelの公開ディレクトリ』に対してシンボリックリンクを作成します。
※わかりやすくいうと、エックスサーバーのドキュメントルート(public_html)を読みに行ったときに、Laravelのプロジェクトフォルダのpublicの中のindex.phpを代わりに読み込みさせるということです。
まず、もともとエックスサーバーのドメインのドキュメントルートに存在するpublic_htmlをリネームしてどこかに回避しておきます。
$ mv /home/sample/sample.xsrv.jp/public_html /home/sample/sample.xsrv.jp/_public_html
↑ mv [現在の場所のフォルダ名] [新しい場所フォルダ名]
これで既存のpublic_htmlフォルダを一旦「_public_html」とリネームしておきます。
※別に不要であればrm -rf で削除してもいいです。
次にシンボリックリンクを作成します。
$ ln -s /home/sample/sample.xsrv.jp/project1/public /home/sample/sample.xsrv.jp/public_html
↑ ln -s [インストールしたLaravelプロジェクトの読みにいかせたい場所] [エックスサーバーの本来の場所]
※Laravelプロジェクトの中のpublicの中と、上記で作ったエックスサーバーのもともとのpublic_htmlをリンクさせます。
ちなみにシンボリックを解除するには
unlink test-app
※public_htmlの後にスペースなど入れてシンボリックリンクを作成しないこと!
Laravelをブラウザで確認しようも、404エラーが発生。
パス自体は全て合っているのに何故?と思って試行錯誤するも解決せず。
unlink public_html を打っても「そのようなファイルやディレクトリはありません」と言われ続ける。
もしやと思い、unlink public_html__ (_は全角) とコマンドを打つと解除された。
知らずに全角が入っていて、シンボリックを解除することも出来ずハマった例。
Fatal error: require(): Failed opening required '/project/vendor/autoload.php' (include_path='.:') in ・・・
というエラーが出るのは vendor フォルダがエックスサーバーの Laravelにインストールされていないためです。
composer install
を実行することでvendorをインストールできます。
もし以下のエラーが出た場合
Your lock file does not contain a compatible set of packages. Please run composer update.
Problem1
- laravel/serializable-closure v1.0.5 requires php ^7.3|^8.0 -> your php version (7.2.34) does not satisfy that requirement.
というエラーが出たら、Problem1〜読んでいきましょう。
エックスサーバーのPHPのバージョンが古いことが原因。
ちなみにエックスサーバーの管理画面のPHPのverを変更してもターミナルでphp -vしてもターミナル内でのバージョン表示は変わらりません。
なのでHomebrewでPHPをインストールしphpのバージョンを7.4に変更しインストールPATH を変更
<参考>
https://blog-and-destroy.com/29755
新しいバージョンのPHPのPATHを変更した後はターミナルを一度閉じて、
再度sshログインして、
php -v
でバージョン確認する必要があります。
バージョンが変わってたら成功したので、プロジェクトフォルダに行き、
composer update
vendor がインストールされているか確認してください。
改めてブラウザーで表示されるか確認します。
500 SERVER ERROR と表示されていたら、MySQLの情報などが書かれた.envファイルが無いことが原因。
エックスサーバーでMySQL設定。
.envファイルの12〜16行目を編集し、FTPソフトなどを使ってファイルをLaravelプロジェクトフォルダにアップロード
これが表示されたら成功です。
これで無事「デプロイ」ができるようになるはずです。
あまりに理屈がわからず、もうFTPソフトでちまちまやっていこうかなと思っていた矢先だったので
うまくいった時は感動ものでした。
自分でもそうなのですが、初学の状態では、右も左もわからない状態で、専門的なものを読んで実行しようとしても、自分が何をしようとしているのか、何に躓いているのかさえ理解できません。
多くのエンジニア向けのブログ記事は、本人だけのための備忘録レベルだったり、技術がわかっていること前提での内容がほとんどなので、初心者がそれをみて実行しようとしても思ったようにできません。
まずは、自分にとってシンプルな方法をとにかく根気強く探し出して、一旦「できた!」という状態になれば、なんとなく全体像が見えてきて、次に何を知らなくてはいけないかがわかってきます。
初学者でデプロイをどうやればいいか困っている方は是非トライしてみてください。
参考
https://shiro-changelife.com/laravel-git-xserver/
laravel デプロイ エックスサーバー MySQL
コメント