質問: GithubにプッシュしてCircleCIで自動デプロイをしたときに正常にビルドは完了しましたが以下のエラーが出てしまいます。 ``` #!/bin/bash -eo pipefail ssh -o StrictHostKeyChecking=no -t webapp@${HOST_NAME} "cd laravel && \ git pull origin master && \ composer install -n --no-dev --prefer-dist && \ npm ci && \ npm run prod && \ php artisan migrate --force && \ php artisan config:cache" Warning: Permanently added '*************' (ECDSA) to the list of known hosts. ^@^@remote: Enumerating objects: 29, done. remote: Counting objects: 100% (29/29), done. remote: Compressing objects: 100% (7/7), done. remote: Total 17 (delta 10), reused 16 (delta 10), pack-reused 0 Unpacking objects: 100% (17/17), done. From github.com:Tikka710/Laravel-ci * branch master -> FETCH_HEAD a935525..4dbc765 master -> origin/master Updating c4b465a..4dbc765 error: Your local changes to the following files would be overwritten by merge: composer.json Please commit your changes or stash them before you merge. Aborting Connection to ************* closed. Exited with code exit status 1 ``` composer.jsonがコミットできていないという事だと思いますが。どのようにすれば解決しますでしょうか?
回答: もっとも大事なことはgit pull をソース展開の手順とするのであれば、 本番環境の修正は直接行ってはいけない運用を徹底する必要があります。 どんなデプロイ手順でもそうですが、正規以外のデプロイ手順を取るとアプリは壊れてそれが障害につながります。 これが自動化CI/CDの基本になりますので注意しましょう。 今回の戻し方については git pullを利用してソースの更新を実行しようとしていらっしゃいますが、 リモートのサーバのファイルに修正がありpullが実行されないものと思います。 gitの履歴とコンフリクトが起きる可能性がある修正がある状態で、pullしようとすると該当のエラーが発生します。 gitで管理している以上はその歴史(コミット修正)とは違う修正の歴史があるとコンフリクトが起こるのでマージ作業が必要です。 ただ今回の場合は本番環境でコンフリクトが起きてしまっているので、本番環境でマージを直そうとすると一時的にアプリが動かなくなる可能性があるので手順としては (1)一旦本番で行った修正をgitに取り込む。 (2)本番の修正を戻してgitの現在いるコミットと同じ状態にする (3)もう一度履歴を取り込む という作業が必要です。 もともとAというコミットにいたとすると 今回の開発修正でBが修正されたとしましょう。 A→B しかしながら本番を修正してしまって いつの間にかCの状態になっているのです。 A→C そこでまず(1)の作業でCの修正をBのコミットに追加します。 A→B→C ́ ここで注意点はC ́(ダッシュ)なのでCの修正ではないのです。 なのでこのままマージしようとしてもコンフリクトが起こります。 なので(2)の作業で本番環境をAに戻します。 これはgit resetかもし修正をしてcommitをしていないのであればgit checkoutでファイルを戻すことができます。 ただ戻す場合は本番環境のソースを一時的に修正することになるのでその動作をしてアプリが問題なく動くか確認しておく必要があります。 最後に(3)の作業で改めてgit pullを実行します。 ここまでくれば新しいアプリが展開できるでしょう