meta-description: 使用GitHub Actions实现WordPress自动化部署完整教程,详解CI/CD工作流配置。

keywords: GitHub Actions,自动化部署,CI/CD,WordPress部署,自动发布

# 使用GitHub Actions自动化部署WordPress

本文详细介绍如何使用GitHub Actions实现WordPress代码的自动化部署,构建完整的CI/CD工作流。

## 为什么需要自动化部署

| 手动部署问题 | 自动化优势 |

|--------------|------------|

| 步骤繁琐易出错 | 一键部署 |

| 多人协作冲突 | 自动合并 |

| 无版本记录 | Git追溯 |

| 回滚困难 | 一键回滚 |

## 准备工作

### 1. 仓库结构规划


wordpress-theme/
├── .github/
│   └── workflows/
│       ├── deploy-staging.yml
│       └── deploy-production.yml
├── theme/
│   ├── style.css
│   ├── functions.php
│   └── ...
└── README.md

### 2. 服务器准备


# 在服务器上创建部署用户
sudo adduser deployer
sudo usermod -aG www-data deployer

# 设置SSH密钥认证
mkdir -p /home/deployer/.ssh
cat id_rsa.pub >> /home/deployer/.ssh/authorized_keys
chmod 700 /home/deployer/.ssh
chmod 600 /home/deployer/.ssh/authorized_keys

## 配置GitHub Actions

### 基础部署工作流


# .github/workflows/deploy.yml
name: Deploy to Production

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      
      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '8.2'
          
      - name: Validate composer.json
        run: composer validate --strict
        
      - name: Run tests
        run: |
          composer install
          ./vendor/bin/phpunit

  deploy:
    needs: test
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      
      - name: Deploy to Server
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.HOST }}
          username: ${{ secrets.USERNAME }}
          key: ${{ secrets.SSH_KEY }}
          script: |
            cd /var/www/html/wp-content/themes/my-theme
            git pull origin main
            composer install --no-dev
            wp cache flush

### 多环境部署


# 分环境部署配置
name: Deploy

on:
  push:
    branches: [ develop, main ]

jobs:
  deploy-staging:
    if: github.ref == 'refs/heads/develop'
    runs-on: ubuntu-latest
    steps:
      - name: Deploy to Staging
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.STAGING_HOST }}
          username: deployer
          key: ${{ secrets.SSH_KEY }}
          script: |
            cd /var/www/staging/wp-content/themes/my-theme
            git pull origin develop
            wp cache flush --url=https://staging.example.com

  deploy-production:
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - name: Deploy to Production
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.PRODUCTION_HOST }}
          username: deployer
          key: ${{ secrets.SSH_KEY }}
          script: |
            cd /var/www/html/wp-content/themes/my-theme
            git pull origin main
            composer install --no-dev --optimize-autoloader
            wp cache flush

## 高级配置

### 使用环境变量


# 在GitHub仓库设置中添加secrets
env:
  WP_ENV: production
  DB_HOST: ${{ secrets.DB_HOST }}
  DB_PASSWORD: ${{ secrets.DB_PASSWORD }}

steps:
  - name: Create .env file
    run: |
      echo "WP_ENV=${{ env.WP_ENV }}" > .env
      echo "DB_PASSWORD=${{ env.DB_PASSWORD }}" >> .env

### 数据库迁移


- name: Export Database
  run: |
    ssh deployer@${{ secrets.HOST }} \
      "wp db export /tmp/backup-$(date +%Y%m%d).sql \
      --path=/var/www/html"

- name: Import Database to Staging
  run: |
    scp /tmp/local-db.sql \
      deployer@${{ secrets.STAGING_HOST }}:/tmp/
    ssh deployer@${{ secrets.STAGING_HOST }} \
      "wp db import /tmp/local-db.sql \
      --path=/var/www/staging"

### 资源编译


- name: Setup Node.js
  uses: actions/setup-node@v3
  with:
    node-version: '18'
    cache: 'npm'

- name: Install Dependencies
  run: npm ci

- name: Build Assets
  run: |
    npm run build
    npm run build:css

## 回滚策略

### 自动回滚配置


- name: Deploy with Rollback
  run: |
    # 记录当前版本
    ssh deployer@production \
      "cd /var/www/html && git rev-parse HEAD > /tmp/previous_version"
    
    # 尝试部署
    ssh deployer@production << 'EOF'
      cd /var/www/html
      git pull origin main
      if ! wp core is-installed; then
        git reset --hard $(cat /tmp/previous_version)
        exit 1
      fi
    EOF
    
    # 如果失败则回滚
    if [ $? -ne 0 ]; then
      echo "Deployment failed, rolling back..."
      ssh deployer@production \
        "cd /var/www/html && \
         git reset --hard $(cat /tmp/previous_version)"
      exit 1
    fi

## 通知集成

### Slack通知


- name: Slack Notification
  uses: 8398a7/action-slack@v3
  with:
    status: ${{ job.status }}
    text: '部署完成:{{ github.repository }}'
    webhook_url: ${{ secrets.SLACK_WEBHOOK }}
  if: always()

### 邮件通知


- name: Send Email
  uses: dawidd6/action-send-mail@v3
  with:
    server_address: smtp.gmail.com
    server_port: 587
    username: ${{ secrets.MAIL_USERNAME }}
    password: ${{ secrets.MAIL_PASSWORD }}
    subject: '部署通知:{{ github.repository }}'
    body: '部署{{ job.status }}'
    to: admin@example.com

## 最佳实践

1. 分分支保护:main分支禁止直接push,必须通过PR

2. 多环境验证:staging → production 逐步部署

3. 自动化测试:部署前运行单元测试

4. 备份策略:部署前自动备份数据库和文件

5. 监控告警:部署后自动健康检查

## 常见问题

| 问题 | 解决方案 |

|------|----------|

| SSH连接失败 | 检查密钥权限(600) |

| 部署超时 | 增加timeout-minutes |

| 权限错误 | 确保deployer属于www-data组 |

| 依赖安装失败 | 使用npm ci替代npm install |

通过GitHub Actions实现自动化部署后,可以将部署时间从30分钟缩短到3分钟,同时大幅提升代码质量。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。