這陣子在用 CodeDeploy 的時候,如果要 deploy 的目錄有相同的檔案都會出現 「File already exists at location」的錯誤,造成 deploy 失敗。
一開始因為工作時程的關係一直沒有去正視這個問題為何發生,只是應急先把目錄清空讓 Deploy 正常。
剛好今天在爬問題的時候突然爬到一篇文章提到了 CodeDeploy 「File already exists at location」的問題
發文者和我的疑問完全相同:
- CodeDeploy 是如何處理已存在的檔案?
- CodeDeploy 不會覆蓋或刪除已存在的檔案,造成佈署失敗
- 如果不將已存在檔案刪除或覆蓋,CodeDeploy 如何運作才是正確?
- 可以使用 CodeDeploy hook (BeforeInstall) 來解決這個問題,但感覺有點笨?
這個發文的內容完全正中我心 …
文中提到:
when you deploy, CodeDeploy will look for a file (on the instance) with information on previously deployed files for the application/deployment-group in question, if it finds the file it then it uses it to cleanup (delete) the existing files, preparing for copying of the new revision files.
CodeDeploy 的 deployment 的依據是已經 deployment 過的 history,
- 先搜尋這些檔案是否曾經 deploy 過,如果是,就刪除本地檔案,上傳新的檔案
- 若為否則不會刪除本地檔案,所以在 deploy 的時候就會出現「File already exists at location」的錯誤
也就是說 CodeDeploy 在 deploy 的依據是 history 記錄,而 Rollbacks 也是相同原理找尋上一版 deploy 的 history。
所以在看一些 AWS CodeDeploy 的 video 在 hooks 的 BeforeInstall 都會建議進行 Erase application data,雖然不確定為何 AWS 不直接 delete all,但或許可能有考慮的點是我目前沒有想到的。