上一篇讲了服务器购买到上线的流程,也讲了网站部署和域名相关内容。如果每次更新项目后,都要手动部署项目,显得很麻烦,这篇我们就来尝试 github Actions 实现自动化部署
这是 deepseek 对 github Actions 做的简单介绍
GitHub Actions 通过仓库内 .github/workflows/ 目录下的 YAML 文件定义工作流。当指定事件(如 push、PR)触发时,平台自动创建虚拟机运行器,按步骤执行代码检出、依赖安装、构建测试等任务,最终通过 SSH、API 或 CLI 将构建产物部署至服务器或云平台
下面就按照这个介绍,一步步实现自动化部署
仓库配置
项目根目录下新建文件.github/workflows/deploy.yml
bash
# 任务名
name: Deploy to Server
# 触发条件
on:
push:
branches: [ master ]
jobs:
deploy:
# 运行容器
runs-on: ubuntu-latest
steps:
# 检出代码
- name: Checkout code
uses: actions/checkout@v4
# 连接 ssh 部署
- name: Deploy via SSH
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
set -e # 遇到错误立即退出
# 1. 添加GitHub.com的主机密钥(为了git pull)
mkdir -p ~/.ssh
ssh-keyscan github.com >> ~/.ssh/known_hosts 2>/dev/null || true
# 2. 定义部署目录
DEPLOY_DIR="/var/www/utils-web"
BACKUP_DIR="/var/www/utils-web-backup"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
# 3. 检查部署目录是否存在
if [ ! -d "$DEPLOY_DIR" ]; then
echo "错误: 部署目录 $DEPLOY_DIR 不存在"
exit 1
fi
# 4. 切换到目标目录
cd "$DEPLOY_DIR"
# 5. 备份当前版本(如果存在)
if [ -d "$DEPLOY_DIR" ] && [ "$(ls -A $DEPLOY_DIR)" ]; then
echo "正在备份当前版本..."
sudo mkdir -p "$BACKUP_DIR"
sudo cp -r "$DEPLOY_DIR" "$BACKUP_DIR/utils-web_$TIMESTAMP" || true
echo "备份完成: $BACKUP_DIR/utils-web_$TIMESTAMP"
fi
# 6. 拉取最新代码(使用SSH方式,公开仓库无需token)
echo "正在拉取最新代码..."
git fetch origin master
git reset --hard origin/master
git clean -fd
# 7. 验证nginx配置
echo "正在验证nginx配置..."
if sudo nginx -t; then
echo "nginx配置验证通过"
else
echo "错误: nginx配置验证失败,正在回滚..."
# 回滚到备份版本
if [ -d "$BACKUP_DIR/utils-web_$TIMESTAMP" ]; then
sudo cp -r "$BACKUP_DIR/utils-web_$TIMESTAMP"/* "$DEPLOY_DIR"/
echo "已回滚到备份版本"
fi
exit 1
fi
# 8. 重启nginx服务
echo "正在重启nginx..."
sudo systemctl restart nginx
# 9. 验证nginx服务状态
sleep 2
if sudo systemctl is-active --quiet nginx; then
echo "✅ 部署成功!nginx服务运行正常"
else
echo "⚠️ 警告: nginx服务可能未正常启动,请检查日志"
sudo systemctl status nginx || true
fi
接下来配置 github Actions
github Actions
找到项目 github 仓库,在仓库主界面选择Settings/Secrets and variables/Actions,分别添加脚本需要的密钥
- SERVER_HOST:服务器地址
- SERVER_USER:用户名,默认 root
- SSH_PRIVATE_KEY:ssh 登录密钥,服务器生成
配置服务器密钥
生成密钥对
css
ssh-keygen -t rsa -b 4096
公钥添加到~/.ssh/authorized_keys:
javascript
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
将服务器私钥(id_rsa内容)添加到SSH_PRIVATE_KEY, 上一节我们配置了密码登录服务器,现在需要 ssh 登录,也需要在服务器设置
服务器设置
登录腾讯云后台,创建密钥,复制上面我们创建的公钥信息

进入服务器详情,绑定密钥,选择已经添加的密钥

验证登录密钥配置
css
ssh -i .ssh/id_rsa root@localhost
返回以下信息,表示登陆成功

在自动化脚本第 6 步,使用 ssh 方式拉取远端仓库,因此还需要在 github 配置
确保 ssh 开启密钥登录
cat /etc/ssh/sshd_config

重启 ssh 服务
systemctl restart sshd
服务端生成 github ssh
bash
# 生成专用密钥(不要覆盖现有的id_rsa)
ssh-keygen -t ed25519 -f ~/.ssh/github_key -N ""
# 查看公钥
cat ~/.ssh/github_key.pub
访问链接,添加 New SSH key
配置 ssh 客户端
bash
# 创建或编辑SSH配置文件
nano ~/.ssh/config
添加内容
bash
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/github_key
IdentitiesOnly yes
# 可选:禁用严格检查(调试用)
# StrictHostKeyChecking no
配置完成测试连接
perl
# 测试SSH连接到GitHub
ssh -T git@github.com
# 应该看到:
# Hi 你的用户名! You've successfully authenticated, but GitHub does not provide shell access.
# 测试拉去
git pull origin master --dry-run
这样就完成了自动化的基本配置,在我们本地修改项目 push 后,就会触发 github Actions 中的工作流,在项目主页面 Actions 标签下,可以看到正在运行的工作流,点击工作流查看每一步的运行状态