自動デプロイ時にYour local changes to ~と出る場合の対処
ある日いつものようにソースを色々いじって、さあ、プッシュしてマージからのCircleCIで自動デプロイするかと思いgit push origin developを実行し問題なくビルドが完了。
変化を確認するために、該当のサイトにアクセスしても変化が無い…
反映されるのに時間がかかるのかな?更新しまくっても一切変化しない。
そこでCircleCIのデプロイジョブをよく確認してみると失敗していることに気付きました。
error: Your local changes to the following files would be overwritten by merge: composer.json
要するに、ローカルのcomposer.jsonが変わってしまっているからコミットしてくれ~って感じにエラーだと思う。
早速、ローカルのディレクトリに移動してgit diffコマンドを実行する。
しかし、何も返されない…
git statusでも特に変化なし…。ん~どういうことだ?と考えると数分。
もしかしたら、本番用のサーバーのディレクトリが変わっているのかもしれないと思い、sshで接続し確認したら modified: composer.jsonの記述がありました。
んじゃローカルのcomposer.jsonも同じように変えたら解決するじゃん!
結果解決せず、同じエラーがでました。
CircleCIのデプロイジョブを確認する。
deploy:
docker:
- image: circleci/php:7.3-node-browsers
steps:
- add_ssh_keys
- run: sudo composer self-update --1
- run:
name: deploy
command: |
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"
git pullを利用してソースを更新しているのですが、本番環境のサーバのファイルの修正が邪魔しているのかな?ってのは分かるのですが、本番環境のでgit pushをするととんでもないことが起きそうなのでCircleCIのconfigを修正して解決する手段を探しました。
結果から言うとgit pull origin master && \の前にgit resetを記述することで正常にデプロイすることができました。
実際に記入したコマンドはgit reset HEAD --hard && \です。
Aの状態からBにコミットしているとすると、
A→B
これをgit reset HEADでコミットしてる情報をAに戻します。
--hard オプションにより、ワーキングツリーにも反映されます。
とりあえず今回のエラーはこれで何とかなりました、自動化CI/CDの基本は正規以外のデプロイ手順を取るとアプリは壊れてそれが障害になる可能性があるというのは今回のエラーで得た教訓ですね。
Discussion