自分の備忘録です。正直自分にわかるようにしか書いていません。
真似て事故っても責任は持てませんのでご了承ください。でも何かの参考になれば幸いです。
開発環境は自席WindowsPCのXAMPP
本番環境は本番サーバ機Linux/Apache/DB2/PHP/Laravel
バージョン管理はGitを使って、本番サーバ機の/opt直下にベアリポジトリを作り、/var/www直下にApacheのドキュメントルートがある。
hookを使ってWindowsPCからPUSHしたときに、/var/www直下の本番からPULLするように仕掛ける。
これで問題なく動いていたが、作っていたアプリをAdminLTEというのを使っていたせいか、ちょっと自由度が低くて気になっていた。
このたびフロントはBootstrap4だけを使って画面を作ろうと改良した。
その道のりは大変で、かなりの箇所を直すことになるだろう。
さらに、開発側はnothing to commit状態なのに、本番機のドキュメントルートでgit statusをすると変なファイルがいっぱい未コミット状態で残っている。
それも前々から気になっていた。
こうなると、私の性格上は一度リフレッシュしたい気分。気持ち悪いし。
バックアップを取ったうえで、新しいソースだけを残して、ベアリポジトリも、リポジトリも全部ぶっ壊すことにした。
XAMPPのバーチャルホストで新アプリを開発
とりあえずAdminLTEから脱却してBootstrap4のみに載せ替える。
最悪失敗したときのことを考えて元の環境はそのまま、XAMPPのバーチャルホストを使って別テスト環境を使って作り直す。
旧環境はC:\xampp\htdocsで、新環境はC:\xampp\htdocs2にした。
やはりかなりのフォルダを削除することになった。
バックアップをとる
とりあえずXAMPPのアプリデータの旧と新をまるまるバックアップを取っておく。
本番とテストとではデータベース等のconfig設定が少し違って.gitignoreで無視するようにしてるので、本番にあるそれ系のデータも避難しておく。
案内する
本番側のデータをぶっ壊すので、今日一日使えないぞと案内する。
開発側をお引越し
C:\xampp\htdocsのデータを完全クリアして、htdocs2のデータを移行した。
この中にはgitリポジトリは入れていない。gitの呪縛は.gitフォルダがあるかだけの違いなので、.gitを引っ越ししないか削除すればいい。
これで完全にまっさらからスタート。
後は新開発環境で動けばOK。
本番側をリフレッシュする
ドキュメントルート、ベアリポジトリ、gitユーザ全てを無かったことにする。
ルートに変身
ルートでないと何もできないので変身する
$ su -
ドキュメントルートを空にする
ドキュメントルートはapp。それごと抹殺する。ソースは開発側のものを使うので、既存のものは用済み。全て電子のチリにする。
# cd /var/www # rm -fr app
ベアリポジトリを削除
これも抹殺。
# cd /opt # rm -fr server.git
git用のユーザを削除
この際なのでユーザも削除してリフレッシュ。-rはホームディレクトリごと削除。
# userdel -r git_user
git用のユーザを再作成して、パスワードを設定する
ユーザを作る。以前の名前は気にくわなかったのでね。使わないけど-mでホームディレクトリも作る。パスワードも設定する。
# useradd -m git_repo # passwd git_repo
ベアリポジトリを再作成
現在は/opt直下にいる。ここでベアリポジトリ用のディレクトリを再作成する。ベアリポジトリ用のディレクトリは.gitで終わる名前にする必要がある。
# mkdir repo.git
ベアリポジトリ用のディレクトリをgit_repoユーザ所有にする
ベアリポジトリはgit_repoユーザで扱えるようにする。exitでログアウト。
# chown git_repo:git_repo repo.git # exit
repo.gitディレクトリをベアリポジトリにする
もちろんgit_repoユーザでログインしなおしてから作業する。最初にcdでディレクトリの中に入ってからinitする。
$ cd repo.git $ git init --bare --shared
開発側からプッシュ
新ソースにリポジトリを作る。
まずはcdで移動してから。git initコマンドでhtdocsはgitの管理下に置く
> cd c:\xampp\htdocs > git init
新ソースをコミットする
まずはコミットをしないと始まらない。初回だからかなりの量だけど気長に待つ。コミットメッセージは定番のfirst commitにした。
> git add . > git commit -m "first commit"
新ソースから本番サーバのベアリポジトリにプッシュする
git remoteでリモートリポジトリを登録して、プッシュする。これで本番サーバのベアリポジトリに開発ソースが入る。パスワードを聞かれるかもしれないが、それはさきほどpasswdで決めたパスワード。
> git remote add origin ssh://git_repo@192.168.0.10:22/opt/repo.git > git push origin master
本番機から再度操作
今度はドキュメントルートからベアリポジトリに登録されたデータを引き取る。
ドキュメントルートからクローン
まずはドキュメントルートを置くディレクトリに移動。次にcloneを行う。これでappディレクトリが出来て、その中に開発側で作ってベアリポジトリに送ったデータが一式登録される。
$ cd /var/www $ git clone /opt/repo.git app
このとき
git clone /opt/repo.git
のようにappを指定せずにすると、repo.gitというベアリポジトリのrepoを引っ張ってきて、勝手にその名前でディレクトリが作られるので注意。
なので、mkdirで/var/www/appを作った上で、cd /var/www/appに移動し、git clone /opt/repo.gitとすると、/var/www/app/repo/本番ソースという構造のディレクトリになってしまう。
ブラウザでアクセス
さて本番ドキュメントルートにソースが設置されたのでブラウザからアクセスしてみる。
すると意味不明なエラー。これはLaravelだけの話かもです。
エラーその1
The stream of file “/var/www/app/storage/logs/laravel.log” could not be opened: failed to open stream: Permission denied
これはlogs直下のlaravel.logを開けないよと怒られている。といってもlogsディレクトリの中には何も入っていないので、logsを誰でもアクセスできるようにしよう。
$ su - $ cd /var/www/app/storage $ chmod 777 logs/
管理者になり、storageに移動し、logsのパーミッション変更し、外部ユーザでも書き込み可能に変更する。
ところでこのファイルにアクセスしようとしているユーザは、apacheユーザになるのか。ならばファイルは全てapacheユーザにしてあげてもよいが、ちょっとその辺よく解らない。
外注の人はgitユーザを作ってその所有権に設定していたので、それでいいと思う。
後で見るとこのディレクトリの中にlaravel.logができていた。
エラーその2
The /var/www/app/bootstrap/cache directory must be present and writable.
これまた書き込みできないと怒られているようだ。
# cd /var/www/app/ # chmod -R 777 bootstrap/cache
でcacheディレクトリへのパーミッションを変更した。
エラーその3
エラーメッセージ忘れた。IBM ODBCドライバーがおかしいとのこと。
調べてみたら/var/www/app/config内にあるdatabase.phpが消えていた。
これは.gitignoreで管理していたせいか、開発側からコピーされなかったようだ。
やれやれバックアップを取っておいてよかった。本番側にこれだけをftpでコピーして、本番用の項目をバックアップを見て直す。
一応開通
これで一応開通したみたい。
エラーその4
unserialise(): error at offset 0 of 40bytes
composer updateをすれば直るみたい。
# exit $ cd /var/www/app $ composer update
エラーその5
.gitignoreが効かない
これはキャッシュが残っていることが原因らしい。
$ git rm -r --cached .
これで解決したみたい。
エラー6
相変わらず本番ドキュメントルート側でgit statusすると変なファイルが未コミットで存在して消えない
開発側から見ると特にコミットするべきものはなく、開発側からPUSHして、本番側からPULLしても変わらない。
これは本番側で、
- git rm -r cached(キャッシュクリア)
- composer update(コンポーザのアップデート)
- エラー1と2のようなアクセスエラー
時にできたファイルの残骸か、何かだと思う。deleteとあったので自動的に削除したものなのかもしれない。
といはいえこれもステージング&コミットすれば問題ないかと思ったが、私のgitバージョン1.8環境だと、git add .してもステージングできなかった。
そんなときはgit add –allとすればいいみたい。
$ /var/www/app $ git add --all $ git commit -m "all commit" $ git push origin master
コミットとプッシュをしてベアリポジトリに上げておく。
$ git status
これでgit statusをしてもクリーンになった。
開発側からプルしておく。
> cd c:\xampp\htdocs > git pull origin master
これで取得か削除か解らないが、ベアリポジトリと同期された。
最後にhookの設定をしておく
サーバ側で操作を行う。hooksディレクトリに移動してファイルを作る
$ cd /opt/repo.git/hooks $ vi post-receive
中身は
cd /var/www/app git --git-dir=.git pull
とする。
こうすることにより、開発側でプッシュしたら、本番側に取り込まれる手はずになる。
しかし実際に開発側でプッシュしても反映しない。
本番側でプルするとしっかり反映される。これはいったいどういうことだ。
エラーその7
hooks内に作成したpost-receiveファイルの実行権がない
ベアリポジトリはgit_repoユーザでinitしたので、所有権はgit_repoユーザ。
開発からPUSHすると受けるベアリポジトリ側が自動実行するのがhooksという役割。
これはおそらくgit_repoユーザ権限で行うはず。
だけど、このpost-receiveファイルのパーミッションは644になっている。
6といえば読みこみと書き込みのはず。これでは実行ができない。
なのでパーミッションを替えてあげる。
$ su - # cd /opt/repo.git/hooks chmod 755 post-receive
これで上手くいく。ちなみに読みこみと実行だけでいいのだから、555でもいいはず。
まぁ555だとrootユーザでないと内容変更できないので755で良いと思う。
その他
Laravel-Excelがおかしくなった
私の環境はIBMi/AS400なので文字コードの関係上、Laravel-Excelデフォだと使えない。
なので簡単な文字変換の命令を一行追加している。
だが、さきほど行ったcomposer updateでLaravel-Excelがキレイに上書きされたみたいだ。
なのでその文字変換の命令を再度追加してあげたら治った。
コメント