VS Code 如何连接AWS EC2实例上的远程代码仓库
嘿,这个需求太常见了!我给你整理了几个从简单到进阶的方案,你可以根据自己的技术栈和团队规模来选:
方案1:手动/定时脚本拉取(快速上手,适合个人小项目)
这个方案最容易实现,不需要额外的服务,适合快速验证需求:
首先确保EC2实例已经配置了GitHub的SSH密钥,避免每次拉取都输密码:
- 在EC2上执行
ssh-keygen -t ed25519 -C "your-email@example.com",一路回车生成密钥对 - 复制公钥内容(
cat ~/.ssh/id_ed25519.pub),到GitHub仓库的Settings > Deploy keys里添加这个公钥,勾选「Allow write access」(如果只需要拉取的话可以不勾,但留着也没坏处)
- 在EC2上执行
编写一个部署脚本,比如命名为
deploy-staging.sh,放在你方便的路径下:
#!/bin/bash # 切换到你的预发布仓库目录 cd /path/to/your/staging/repo # 拉取最新代码(替换成你的目标分支,比如staging) git pull origin staging # 如果你的应用需要重启/构建,在这里加对应的命令,比如: # npm install && pm2 restart your-app-name # 或者 Python 项目:pip install -r requirements.txt && sudo systemctl restart your-uwsgi-service
给脚本添加执行权限:
chmod +x deploy-staging.sh如果想实现自动定时拉取(比如每分钟检查一次更新),可以用Linux的crontab:
- 执行
crontab -e打开定时任务编辑器 - 添加一行:
* * * * * /path/to/deploy-staging.sh >> /var/log/staging-deploy.log 2>&1 - 保存退出后,系统就会每分钟执行一次脚本,日志会存在
/var/log/staging-deploy.log里,方便排查问题
- 执行
方案2:GitHub Webhook触发实时部署(代码提交即更新,适合追求实时性的场景)
如果想要代码一推送到GitHub就自动更新预发布环境,Webhook是更优的选择:
- 第一步,在EC2上搭建一个简单的Web服务来接收GitHub的Webhook请求(这里用Python Flask举例,你也可以用Node.js/Go等熟悉的语言):
- 安装Flask:
pip install flask - 编写
webhook-server.py文件:
- 安装Flask:
from flask import Flask, request, jsonify import subprocess import hmac import hashlib app = Flask(__name__) # 替换成你自己的Webhook密钥(后面GitHub配置会用到) WEBHOOK_SECRET = "your-custom-secret-key" @app.route('/webhook', methods=['POST']) def handle_deploy(): # 验证GitHub的请求签名,防止恶意触发 signature_header = request.headers.get('X-Hub-Signature-256') if not verify_signature(signature_header, request.data): return jsonify({"status": "error", "msg": "Invalid signature"}), 403 # 调用之前写的部署脚本 result = subprocess.run(['/path/to/deploy-staging.sh'], capture_output=True, text=True) if result.returncode == 0: return jsonify({"status": "success", "output": result.stdout}) else: return jsonify({"status": "fail", "error": result.stderr}), 500 def verify_signature(signature_header, payload): if not signature_header: return False expected_signature = hmac.new(WEBHOOK_SECRET.encode(), payload, hashlib.sha256).hexdigest() return hmac.compare_digest(f"sha256={expected_signature}", signature_header) if __name__ == '__main__': # 生产环境建议用gunicorn/uwsgi替代Flask自带的服务器,比如: # gunicorn -w 4 -b 0.0.0.0:5000 webhook-server:app app.run(host='0.0.0.0', port=5000)
- 把Web服务做成后台守护进程(用systemd):
- 创建
/etc/systemd/system/webhook-deploy.service文件:
- 创建
[Unit] Description=GitHub Webhook Server for Staging Deploy After=network.target [Service] User=ec2-user # 替换成你的EC2用户名 WorkingDirectory=/path/to/webhook/server ExecStart=/usr/bin/python3 webhook-server.py Restart=always [Install] WantedBy=multi-user.target
- 执行以下命令启动并启用服务:
sudo systemctl daemon-reload sudo systemctl start webhook-deploy sudo systemctl enable webhook-deploy
在GitHub仓库配置Webhook:
- 进入仓库的Settings > Webhooks > Add webhook
- Payload URL填
http://你的EC2公网IP:5000/webhook - Content type选
application/json - Secret填刚才设置的
your-custom-secret-key - 触发事件选择「Just the push event」
- 勾选「Active」,点击保存
最后别忘了在EC2的安全组里开放5000端口,允许GitHub的IP访问(可以查GitHub官方的Webhook IP列表来限制,更安全)
方案3:GitHub Actions CI/CD(规范流程,适合团队协作)
如果是团队项目,用GitHub Actions做自动化部署会更规范,不需要在EC2上维护Webhook服务:
- 在你的GitHub仓库里创建
.github/workflows/staging-deploy.yml文件:
name: Deploy to Staging EC2 # 当推送到staging分支时触发部署 on: push: branches: [ staging ] jobs: deploy: runs-on: ubuntu-latest steps: - name: Checkout latest code uses: actions/checkout@v4 - name: Deploy to EC2 via SSH uses: appleboy/ssh-action@v1.0.3 with: host: ${{ secrets.EC2_HOST }} # 你的EC2公网IP(存在GitHub Secrets里) username: ${{ secrets.EC2_USER }} # EC2用户名(比如ec2-user,存在Secrets里) key: ${{ secrets.EC2_SSH_PRIVATE_KEY }}# EC2的私钥(存在Secrets里) script: | cd /path/to/your/staging/repo git pull origin staging # 添加你的应用构建/重启命令,比如: # npm install && npm run build && pm2 restart app
- 在GitHub仓库的Settings > Secrets and variables > Actions里添加三个Secret:
EC2_HOST: 你的EC2公网IP地址EC2_USER: EC2实例的登录用户名(比如ec2-user)EC2_SSH_PRIVATE_KEY: EC2实例的私钥内容(注意是私钥,不是公钥)
一些额外注意事项:
- 不管用哪种方案,都要确保EC2上的用户有足够的权限操作仓库和应用(比如修改文件、重启服务)
- 如果你的应用需要构建(比如React/Vue项目),一定要在部署脚本里加上构建步骤,否则更新的只是源码,不会生效
- 记得保留部署日志,方便排查部署失败的问题(比如脚本的输出日志、Webhook的请求日志)
内容的提问来源于stack exchange,提问作者Ranjeet Eppakayala




