问题描述
在AWS EC2实例上运行了一个简单的Node.js应用,并希望通过CircleCI实现持续部署。用户遵循了一篇文章,该文章描述了在EC2实例上通过SSH运行部署命令的步骤。用户已经在EC2实例上创建了一个名为deploy.sh
的脚本,该脚本的内容是切换到项目目录,然后运行npm i
和pm2 delete all
,最后通过pm2 start server.js
启动应用。用户尝试了两种方法来运行deploy.sh
脚本,一种是在EC2实例上手动运行,另一种是通过本地机器通过SSH运行,但后者出现了问题。
问题的主要焦点是如何在CircleCI中通过SSH连接到EC2实例,并成功运行deploy.sh
脚本,以便实现持续部署。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
使用AWS Systems Manager代替直接SSH连接
一种更可靠的方法是使用AWS Systems Manager(SSM)来代替直接的SSH连接。您可以创建一个SSM文档,其中包含要执行的部署命令。然后,您可以通过AWS CLI命令从CI/CD流水线中调用该SSM文档。
以下是实现该方法的步骤:
- 创建一个包含部署命令的SSM文档。您可以使用AWS管理控制台或CLI来完成此操作。
- 在您的CI/CD流水线中,使用AWS CLI命令来调用SSM文档,并指定要运行的命令。
以下是一个基本的实现示例:
创建SSM文档
您可以创建一个名为DeployAppDocument
的SSM文档,其中包含以下命令:
#!/bin/bash
cd /path/to/your/project
npm install
pm2 delete all
pm2 start server.js
在CI/CD流水线中调用SSM文档
在您的CircleCI配置中,添加一个步骤来调用SSM文档。请确保在步骤中使用正确的AWS访问凭证。
jobs:
deploy:
docker:
- image: circleci/node:14
steps:
- checkout
- run:
name: Run Deployment
command: |
aws ssm create-document --name "DeployAppDocument" --document-type "Command" --content file:///path/to/your/DeployAppDocument.json
command_id=$(aws ssm send-command --instance-id "your-ec2-instance-id" --document-name "DeployAppDocument" --query "Command.CommandId" --output text)
aws ssm wait command-executed --instance-id "your-ec2-instance-id" --instance-id $command_id
请注意,上述示例仅为演示目的。您需要根据您的实际情况进行适当的修改。
解决npm和pm2命令未找到的问题
如果在通过SSH连接运行脚本时遇到npm和pm2命令未找到的问题,可能是因为环境变量不正确。您可以尝试在脚本中使用完整路径来引用这些命令,以确保它们能够正确执行。例如:
#!/bin/bash
cd /path/to/your/project
/path/to/npm install
/path/to/pm2 delete all
/path/to/pm2 start server.js
注意事项
- 使用AWS Systems Manager代替SSH可以更好地管理权限和执行环境,从而提高可靠性。
- 请确保在CI/CD流水线中正确配置AWS凭证,并限制对实例的访问权限。
总结
通过使用AWS Systems Manager,您可以更可靠地在CircleCI中实现持续部署,而无需直接通过SSH连接到EC2实例。这种方法可以更好地管理权限和执行环境,从而提高部署的可靠性。如果您在SSH连接运行脚本时遇到命令未找到的问题,可以尝试使用完整路径来引用命令。