基于GitHub Actions与AWS EC2实现Django CI/CD(staging分支PR触发)
问题分析与解决方案
你当前用GitHub Actions搭配AWS EC2搭建CI/CD的配置存在几个关键问题,结合截图显示的连接超时情况,以下是问题点和修正方案:
核心问题
- 命令执行环境错误:最后一步的
run命令是在GitHub Actions的runner机器(ubuntu-latest)上执行,而非目标EC2实例,自然找不到EC2上的目录和文件。 - 目录切换语法错误:直接写
/home/ubuntu/plane-project-staging/plane_api/无法切换目录,必须用cd命令。 - 敏感信息输出风险:调试步骤中打印
EC2_PRIVATE_KEY,即便GitHub会屏蔽敏感内容,这种操作也存在安全隐患,建议移除。 - SCP传输范围不合理:
source: "./"会传输仓库所有文件(包括.git、冗余目录等),既浪费带宽又可能覆盖不必要的内容。
修正后的配置文件
name: build-and-deploy on: pull_request: types: - closed branches: - staging # 仅针对staging分支的PR关闭触发,匹配你的需求 env: TARGET_BRANCH: ${{ github.event.pull_request.base.ref }} jobs: # 构建项目 build: runs-on: ubuntu-latest steps: - name: 拉取代码 uses: actions/checkout@v3 - name: 配置Python环境 uses: actions/setup-python@v2 with: python-version: 3.10.12 - name: 安装依赖 run: | python -m pip install --upgrade pip pip install -r req.txt deploy_staging: runs-on: ubuntu-latest needs: build if: github.event.pull_request.base.ref == 'staging' steps: - name: 拉取代码用于传输 uses: actions/checkout@v3 - name: 部署至Staging环境 uses: appleboy/scp-action@master with: host: ${{ secrets.EC2_HOST }} username: ${{ secrets.EC2_USERNAME }} key: ${{ secrets.EC2_PRIVATE_KEY }} source: "*.py, req.txt, manage.py, ./plane_api/" # 按需指定要传输的文件/目录 target: "/home/ubuntu/plane-project-staging/" overwrite: true # 允许覆盖现有文件 - name: 在Staging环境执行部署命令 uses: appleboy/ssh-action@master with: host: ${{ secrets.EC2_HOST }} username: ${{ secrets.EC2_USERNAME }} key: ${{ secrets.EC2_PRIVATE_KEY }} script: | cd /home/ubuntu/plane-project-staging/plane_api/ python manage.py migrate # 可添加重启服务等命令,比如:sudo systemctl restart your-app.service
额外排查要点
- EC2安全组:确保安全组开放22端口(SSH),并且允许GitHub Actions的IP段访问,或临时允许所有IP(生产环境不建议)排查连接超时问题。
- 密钥权限:EC2实例上
~/.ssh/authorized_keys文件权限需设为600,目录权限设为700,否则会导致SSH连接失败。 - Python环境:确认EC2实例安装了3.10.12版本的Python,或在SSH脚本中指定Python绝对路径(如
/usr/bin/python3.10)。
内容的提问来源于stack exchange,提问作者Mohammed Rifad
相关产品推荐
相关产品推荐

