Мой YML-конфиг для GitHub CI/CD

Сейчас в локальной среде я разворачиваю свои проекты, используя Local, инструмент от WP Engine. Это очень быстро и удобно, но сейчас не про него.

Сейчас про GitHub CI/CD. Его суть в том, чтобы «деплоить» локальный проект на хостинг.

Раньше я по старинке подключался через FTP и перезаливал файлы. С помощью же CI/CD можно написать правила для GitHub и он по этим правилам сам всё сделает при обновлении проекта на GitHub.

Эти правила пишутся в разрешении .yml и находятся в корне проекта в папке .github.

Я очень часто сталкиваюсь с инструкциями написанными под Docker, но по факту не важно с чем вы работаете в локальной среде. OpenServer, Local, XAMP, MAMP, Docker, Denwer или что угодно еще — все подходит.

Важное условие, что вы используете GItHub и осуществляете «push» проекта на этот сервис.

В локальной среде я, как правило, работаю с несколькими директориями:

  • в themes директория с клиентской темой
  • в plugins директории с кастомными плагинами
  • в mu-plugins неотключаемый плагин (часто просто с регистрацией новых типов записи)

На GitHub улетают только эти папки, с которыми я работаю. И тут начинается магия CI/CD:

  • все папки архивируются в wpcontent.zip
  • архив заливается на хостинг
  • GitHub удаляет прошлые версии этих директорий
  • wpcontent.zip распаковывается
  • на время всей операции включается режим обновления (maintenance)
  • после распаковки wpcontent.zip удаляется и режим обновления отключается

Ниже сам код этой магии, но это только один из сценариев. Настроить можно очень кастомно и заливать проект не на один хостинг, но и на несколько сразу.

name: CI/CD Deploy

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    env:
      REMOTE_DIR: папка_сайта_на_сервере
    steps:
    - name: Checkout
      uses: actions/checkout@master

    - name: Prepare plugins and theme zip
      run: zip -r wpcontent.zip wp-content

    - name: Copy Zips to Server
      uses: appleboy/scp-action@master
      with:
        host: ${{ secrets.SSH_HOST }}
        username: ${{ secrets.SSH_USERNAME }}
        password: ${{ secrets.SSH_PASSWORD }}
        port: ${{ secrets.SSH_PORT }}
        source: "./wpcontent.zip"
        target: "${{ env.REMOTE_DIR }}"

    - name: Copy Maintenance to Server
      uses: appleboy/scp-action@master
      with:
        host: ${{ secrets.SSH_HOST }}
        username: ${{ secrets.SSH_USERNAME }}
        password: ${{ secrets.SSH_PASSWORD }}
        port: ${{ secrets.SSH_PORT }}
        source: "_maintenance"
        target: "${{ env.REMOTE_DIR }}"

    - name: Rename _maintenance to .maintenance
      uses: appleboy/ssh-action@v1.0.3
      with:
        host: ${{ secrets.SSH_HOST }}
        username: ${{ secrets.SSH_USERNAME }}
        password: ${{ secrets.SSH_PASSWORD }}
        port: ${{ secrets.SSH_PORT }}
        script: |
          mv "${{ env.REMOTE_DIR }}_maintenance" "${{ env.REMOTE_DIR }}.maintenance"

    - name: Update Plugins and themes
      uses: appleboy/ssh-action@v1.0.3
      with:
        host: ${{ secrets.SSH_HOST }}
        username: ${{ secrets.SSH_USERNAME }}
        password: ${{ secrets.SSH_PASSWORD }}
        port: ${{ secrets.SSH_PORT }}
        script: |
          rm -rf "${{ env.REMOTE_DIR }}wp-content/plugins/wpadminpro-core"
          rm -rf "${{ env.REMOTE_DIR }}wp-content/mu-plugins/wpadminpro.general.php"
          rm -rf "${{ env.REMOTE_DIR }}wp-content/themes/wpadminpro-theme"
          unzip -o "${{ env.REMOTE_DIR }}wpcontent.zip" -d "${{ env.REMOTE_DIR }}"

    - name: Disable Maintenance Mode and Remove Zips
      uses: appleboy/ssh-action@v1.0.3
      with:
        host: ${{ secrets.SSH_HOST }}
        username: ${{ secrets.SSH_USERNAME }}
        password: ${{ secrets.SSH_PASSWORD }}
        port: ${{ secrets.SSH_PORT }}
        script: |
          rm -f "${{ env.REMOTE_DIR }}.maintenance" 
          rm -f "${{ env.REMOTE_DIR }}wpcontent.zip"

Какие моменты здесь важны?

  • REMOTE_DIR — укажите свой путь до папки с сайтом на сервере, можно узнать у техподдержки хостинга
  • ${{ secrets.SSH_HOST }} и т.д. — host (сервер), port, username и password также можно узнать у техподдержки хостинга и указать их надо в «секретах» проекта на ГитХаб. Это нужно для безопасности ваших данных.

Есть ли минусы? Да.

  • При неаккуратности можно слить данные хостинга в общий доступ
  • Локальная БД никак не экспортируется, возможно я просто не знаю как, но если необходимо полностью залить проект с компьютера на хостинг со всей базой данных — это не тот вариант.