手动部署 WordPress 主题和插件太麻烦?我之前的站点每次更新都要 SSH 连服务器,git pull、清缓存、测功能,一套下来 10 分钟。后来用 GitHub Actions 实现了自动化,现在 push 代码后 2 分钟自动完成部署,还能自动回滚。今天把完整方案分享出来。
一、为什么选择 GitHub Actions
试过几种部署方案:
1. 手动 FTP 上传 – 慢、易出错、无版本控制
2. Git hooks 自动部署 – 配置复杂、安全性一般
3. Jenkins/Travis CI – 太重、维护成本高
4. GitHub Actions – 免费、集成好、配置简单、安全性高
最终选择了 GitHub Actions,每月免费 2000 分钟,个人项目完全够用。
二、准备工作
1. 服务器要求
- Ubuntu/CentOS 系统
- 已安装 Git
- 已安装 WP-CLI(用于清缓存等操作)
- SSH 服务开启
2. GitHub 仓库
将你的 WordPress 主题或插件代码托管到 GitHub 私有仓库。
3. 生成 SSH 密钥对
# 本地生成密钥 ssh-keygen -t ed25519 -C "github-actions-deploy" # 查看公钥内容 cat ~/.ssh/id_ed25519.pub # 复制公钥内容,后续添加到 GitHub Secrets
三、服务器端配置
步骤 1:创建部署用户(推荐)
# 创建专用部署用户 useradd -m -s /bin/bash wpdeploy # 切换到新用户 su - wpdeploy # 创建.ssh 目录 mkdir -p ~/.ssh chmod 700 ~/.ssh
步骤 2:配置 SSH 公钥
# 编辑 authorized_keys vim ~/.ssh/authorized_keys # 粘贴 GitHub Actions 的公钥 # 保存后设置权限 chmod 600 ~/.ssh/authorized_keys chown -R wpdeploy:wpdeploy ~/.ssh
步骤 3:限制部署用户权限
# 编辑 SSH 配置
vim /etc/ssh/sshd_config
# 添加以下内容(限制只能执行特定命令)
Match User wpdeploy
ForceCommand echo "This account is for deployment only"
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no
# 重启 SSH 服务
systemctl restart sshd
步骤 4:测试 SSH 连接
# 从本地测试 ssh -i ~/.ssh/id_ed25519 wpdeploy@你的服务器 IP
四、配置 GitHub Secrets
进入 GitHub 仓库 → Settings → Secrets and variables → Actions,添加以下 Secrets:
1. SSH_PRIVATE_KEY
粘贴私钥内容(~/.ssh/id_ed25519 文件内容)
2. SSH_HOST
服务器 IP 地址或域名
3. SSH_USERNAME
部署用户名(wpdeploy)
4. DEPLOY_PATH
WordPress 网站根目录(如:/var/www/html)
五、编写 Workflow 文件
创建 .github/workflows/deploy.yml:
name: Deploy WordPress Theme
on:
push:
branches: [ main ]
paths:
- 'themes/your-theme/**'
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
with:
fetch-depth: 2
- name: Setup SSH
uses: webfactory/[email protected]
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
- name: Deploy to server
env:
SSH_HOST: ${{ secrets.SSH_HOST }}
SSH_USERNAME: ${{ secrets.SSH_USERNAME }}
DEPLOY_PATH: ${{ secrets.DEPLOY_PATH }}
run: |
# 禁用 SSH 主机密钥检查
mkdir -p ~/.ssh
echo "Host *" > ~/.ssh/config
echo " StrictHostKeyChecking no" >> ~/.ssh/config
echo " UserKnownHostsFile /dev/null" >> ~/.ssh/config
chmod 600 ~/.ssh/config
# 同步文件到服务器
rsync -avz --delete \
themes/your-theme/ \
$SSH_USERNAME@$SSH_HOST:$DEPLOY_PATH/wp-content/themes/your-theme/
# 执行远程命令
ssh $SSH_USERNAME@$SSH_HOST << 'ENDSSH'
# 设置文件权限
chown -R www-data:www-data $DEPLOY_PATH/wp-content/themes/your-theme
chmod -R 755 $DEPLOY_PATH/wp-content/themes/your-theme
# 清除 WordPress 缓存
wp cache flush --path=$DEPLOY_PATH
# 如果是主题更新,重新激活主题
wp theme activate your-theme --path=$DEPLOY_PATH
# 记录部署日志
echo "Deployed at $(date)" >> /var/log/wp-deploy.log
ENDSSH
- name: Notify success
if: success()
run: echo "✅ 部署成功!"
- name: Notify failure
if: failure()
run: echo "❌ 部署失败,请检查日志"
六、进阶功能:自动回滚
如果部署后发现问题,需要快速回滚。添加回滚功能:
name: Deploy with Rollback
on:
push:
branches: [ main ]
workflow_dispatch:
inputs:
rollback:
description: 'Rollback to previous version'
required: false
default: 'false'
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
with:
fetch-depth: 0 # 获取所有历史版本
- name: Setup SSH
uses: webfactory/[email protected]
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
- name: Backup current version
run: |
ssh $SSH_USERNAME@$SSH_HOST << 'ENDSSH'
if [ -d "$DEPLOY_PATH/wp-content/themes/your-theme" ]; then
cp -r $DEPLOY_PATH/wp-content/themes/your-theme \
$DEPLOY_PATH/wp-content/themes/your-theme.backup.$(date +%Y%m%d%H%M%S)
fi
ENDSSH
- name: Deploy or Rollback
# ... 部署逻辑 ...
- name: Health check
run: |
# 部署后检查网站是否正常
curl -f https://your-site.com || exit 1
七、我踩过的坑
坑 1:SSH 权限问题
最初我用 root 用户部署,后来发现太危险。建议创建专用部署用户,限制权限。
坑 2:文件所有权错误
rsync 同步的文件所有者是 wpdeploy,需要改为 www-data,否则 WordPress 无法写入。
坑 3:缓存没清除导致更新不生效
一定要在部署后执行`wp cache flush`,否则前端看到的还是旧版本。
坑 4:部署过程中网站短暂不可用
如果更新文件多,同步过程中可能出现文件不完整。解决方案:
- 使用 rsync 的--delete 参数
- 先在临时目录解压,再原子性替换
- 在低峰期部署
八、多环境部署
如果有测试环境和生产环境,可以配置多环境部署:
jobs:
deploy-staging:
if: github.ref == 'refs/heads/develop'
# 部署到测试环境
deploy-production:
if: github.ref == 'refs/heads/main'
needs: deploy-staging # 测试环境成功后再部署生产
# 部署到生产环境
九、添加通知功能
部署完成后发送到 Telegram 或邮件通知:
- name: Send Telegram notification
if: always()
run: |
if [ "${{ job.status }}" == "success" ]; then
MESSAGE="✅ 部署成功:${{ github.repository }}"
else
MESSAGE="❌ 部署失败:${{ github.repository }}"
fi
curl -X POST "https://api.telegram.org/bot${{ secrets.TG_BOT_TOKEN }}/sendMessage" \
-d "chat_id=${{ secrets.TG_CHAT_ID }}&text=$MESSAGE"
十、监控和日志
在服务器端创建日志文件,记录每次部署:
#!/bin/bash # /usr/local/bin/wp-deploy-log.sh cat /var/log/wp-deploy.log | tail -50 # 查看最近部署 grep "Deployed at" /var/log/wp-deploy.log
总结
使用 GitHub Actions 部署 WordPress 后,我的工作效率提升明显:
- ✅ 部署时间从 10 分钟缩短到 2 分钟
- ✅ 零人为错误(配置好后无需手动操作)
- ✅ 有完整的部署历史可追溯
- ✅ 支持快速回滚
- ✅ 免费、安全、可靠
唯一的前期投入是配置时间(约 30 分钟),但一劳永逸。
来源:https://mjj.728.hk/