AWS CodeDeploy AfterInstall钩子提示yarn命令不存在
问题根因
报错核心原因是CodeDeploy各生命周期钩子的Shell环境相互独立,nvm相关环境变量没有在后续脚本中加载:
- CodeDeploy执行每个部署钩子(BeforeInstall、AfterInstall、ApplicationStart)时,都会启动一个全新的独立非交互式Shell进程。你在
before_install.sh里执行的export NVM_DIR、加载nvm脚本的操作,仅对当前BeforeInstall阶段的Shell进程有效,进程结束后临时设置的环境变量会直接销毁,不会自动传递给后续启动的AfterInstall阶段的新Shell。 - nvm安装的Node、以及通过npm全局安装的yarn、pm2等命令,都存放在nvm的版本管理目录下(默认路径为
~/.nvm/versions/node/<对应Node版本号>/bin/),这个路径没有加入系统全局PATH,后续新启动的Shell如果不主动加载nvm初始化脚本,就找不到这些命令的位置,触发command not found报错。 - BeforeInstall阶段能正常执行
yarn global add pm2,是因为你在同一个脚本内先完成了nvm加载,当前进程的PATH已经包含了nvm下的Node命令路径,和日志里显示的pm2安装成功的结果完全匹配。
修复方案
最稳妥的修复方式是在所有需要调用node/yarn/pm2命令的部署脚本开头,统一添加nvm初始化逻辑,保证每个独立Shell进程都能正确加载命令路径,具体操作如下:
- 修改
after_install.sh,在脚本头部补充nvm加载代码:
#!/bin/bash # 初始化nvm环境 export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" cd /home/ubuntu/my-app yarn install yarn run build
- 后续用于启动服务的
application_start.sh,也需要在开头加上完全相同的nvm初始化代码,否则会触发pm2命令找不到的同类报错。 - 不推荐通过给yarn/pm2创建全局软链接的方式解决问题,后续nvm切换Node版本时软链接会直接失效,维护成本很高。
注意:不要依赖
.bashrc里的自动加载配置,CodeDeploy以指定用户执行非交互式脚本时,默认不会加载用户目录下.bashrc中的配置内容,直接在脚本内加载nvm是兼容性最高的方案。
内容的提问来源于stack exchange,提问作者Susitha Ravinda Senarath
相关产品推荐
相关产品推荐

