前面文章记录了手动部署 Spring Boot 后端到阿里云 ECS 的过程。每次改完代码都要手动打包上传,效率很低。本文记录如何利用 GitHub Actions 实现代码推送到私有仓库后,自动部署后端到 ECS。
一、整体流程
本地 push → GitHub 私有仓库 → GitHub Actions → SSH 连接 ECS → git pull → mvn package → 重启服务
核心思路:GitHub Actions 通过 SSH 连接到 ECS,在服务器上执行部署脚本。
二、配置 SSH 免密登录
生成专用密钥对
在 ECS 服务器上生成一份给 GitHub Actions 用的密钥:
ssh-keygen -t ed25519 -C "github-actions-deploy" -f ~/.ssh/github_actions
# 一路回车,不设密码
配置 authorized_keys
cat ~/.ssh/github_actions.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
获取私钥
cat ~/.ssh/github_actions
# 复制完整内容(包括 -----BEGIN OPENSSH PRIVATE KEY----- 和 -----END-----)
三、GitHub 仓库配置
添加 Secrets
进入仓库 → Settings → Secrets and variables → Actions → New repository secret:
| Secret 名称 | 值 |
|---|---|
ECS_HOST | ECS 公网 IP,如 47.xx.xx.xx |
ECS_USER | SSH 用户名,如 root |
ECS_SSH_KEY | 上一步的私钥内容 |
私有仓库额度
GitHub Actions 在私有仓库中每月有 2000 分钟免费额度,个人项目完全够用。
四、首次克隆私有仓库到 ECS
GitHub Actions 需要在 ECS 上有一份代码,所以先在服务器上 clone 下来:
cd /opt/app
# 方式一:Deploy Key(推荐)
# 在 GitHub 仓库 Settings → Deploy keys → Add deploy key
ssh-keygen -t ed25519 -C "ecs-deploy-key"
cat ~/.ssh/id_ed25519.pub # 复制公钥添加到 GitHub
git clone git@github.com:你的用户名/你的仓库.git myapp-backend
# 方式二:Personal Access Token
git clone https://TOKEN@github.com/你的用户名/你的仓库.git myapp-backend
五、编写 Workflow
在项目根目录创建 .github/workflows/deploy-backend.yml:
name: Deploy Backend to ECS
on:
push:
branches:
- main
paths:
- 'backend/**' # 只在后端代码变更时触发
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Deploy via SSH
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.ECS_HOST }}
username: ${{ secrets.ECS_USER }}
key: ${{ secrets.ECS_SSH_KEY }}
script: |
cd /opt/app/myapp-backend
git pull origin main
mvn clean package -DskipTests
mv target/*.jar /opt/app/myapp.jar
systemctl restart myapp
echo "后端部署完成"
关键配置说明:
paths: ['backend/**']:只在后端代码变更时触发,前端改动不会重启后端appleboy/ssh-action:社区最常用的 SSH Action,Star 10k+script中的命令在 ECS 上串行执行,任一步失败则 workflow 标记为失败
六、版本回滚
出问题需要回滚时,手动执行回滚:
# ECS 上回滚到上一个版本
cd /opt/app/myapp-backend
git log --oneline -5 # 找到要回滚的 commit
git reset --hard <commit>
mvn clean package -DskipTests
mv target/*.jar /opt/app/myapp.jar
systemctl restart myapp
也可以在 GitHub Actions 中添加一个可手动触发的回滚 workflow:
name: Rollback Backend
on:
workflow_dispatch:
inputs:
commit:
description: '要回滚到的 commit hash'
required: true
jobs:
rollback:
runs-on: ubuntu-latest
steps:
- uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.ECS_HOST }}
username: ${{ secrets.ECS_USER }}
key: ${{ secrets.ECS_SSH_KEY }}
script: |
cd /opt/app/myapp-backend
git fetch --all
git reset --hard ${{ github.event.inputs.commit }}
mvn clean package -DskipTests
mv target/*.jar /opt/app/myapp.jar
systemctl restart myapp
echo "已回滚到 ${{ github.event.inputs.commit }}"
七、查看部署状态
push 后在 GitHub 仓库 → Actions 查看:
- 🟡 黄色:正在执行
- 🟢 绿色:部署成功
- 🔴 红色:部署失败(点击查看日志)
失败时 GitHub 会自动向你的邮箱发送通知。
八、安全注意事项
- SSH Key 隔离:给 GitHub Actions 用的密钥单独生成,不要用个人密钥
- ECS 安全组:不需要为此开放新端口,SSH 是 GitHub 主动连你
- Secrets 保护:GitHub Actions 日志会自动隐藏 Secrets 值
- 分支保护:建议只监听
main分支,开发分支不触发部署
总结
GitHub Actions 本质是 GitHub 提供的免费 CI 服务器。后端自动部署核心步骤:
Secrets 存密钥 → push 触发 → SSH 连 ECS → git pull → mvn package → systemctl restart
相比手动 scp 上传:提交即部署、出错可回溯、不用记命令。