今天同時遇到兩個同事在使用 CodeDeploy 的時候處理 appspec.yml 中 ApplicationStop 這個 hooks 都會去抓到舊的 appspec.yml 設定 … 導致一直無法 fix 在 ApplicationStop 的錯誤
先排除幾個問題
- 從 appspec.yml 原始碼確認真的有修改 appspec.yml 成功
- 從 S3 bucket 下載 zip 檔解出來也是修改好的 appspec.yml
從這兩個狀況來看 Travis CI 打 code 到 S3 是沒問題的 …
AWS 有個好查問題的去處:AWS forums 裡面有一篇提到「ApplicationStop hook not executed for first deployment」
先複習一下 CodeDeploy hooks 的流程
原因是 CodeDeploy 在做 CD 的時候,ApplicationStop 在 DownloadBundle 之前就已經執行,所以跑 ApplicationStop 的時候還沒有從 S3 下載新的 appspec.yml,所以自然會去執行上一次的 appspec.yml (ApplicationStop)
同理,如果你之前的 appspec.yml 沒有寫 ApplicationStop 的 hooks 的話,在第一次也不會執行 ApplicationStop。
這樣的設計其實仔細思考並不是沒有道理,因為當你第一次 deploy 的時候理論上並沒有 application (如 npm start)
如果你遇到了這個問題,要排除只能進到 OS 裡面去 fix 上一版的 appspec.yml
/opt/codedeploy-agent/deployment-root/**/${deployment_id}/deployment-archive/appspec.yml
或是砍掉之前的 deployment
$ rm -rf /opt/codedeploy-agent/deployment-root/*