使用 GitHub Actions 自动化部署 WordPress 完整实战

手动部署 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/


已发布

分类

来自

标签: