2.27.2. Деплой с помощью GitHub Actions

GitHub Actions — это набор средств автоматизации рабочих процессов на GitHub. С их помощью можно запускать различные действия при наступлении определённых событий. Одним их примеров является автоматическая выгрузка кода проекта с GitHub на хостинг при пуше изменений в репозиторий.

Важные моменты:

  • Каталог на хостинге при деплое не очищается. Файлы, которых нет в репозитории, из каталога не удаляются.

Настройка автоматического деплоя на примере экшена FTP Deploy.

  1. Создайте на хостинге FTP-пользователя с доступом к каталогу, куда должен выполняться деплой.
  2. Отключите ограничения доступа по FTP.
  3. Откройте свой репозиторий на GitHub.
  4. Добавьте необходимые для деплоя данные в секреты:

    Как добавлять секреты:

    1. Переключитесь на вкладку «Settings».
    2. В меню справа выберите «Secrets → Actions».
    3. Нажмите «New repository secret».
    4. Укажите название секрета в поле «Name» и значение в поле «Value».
    5. Нажмите «Add secret».

    Каждый параметр добавляется как отдельный секрет.

    Name Value
    REMOTE_HOST Укажите хост FTP-сервера из данных для доступа по FTP.
    FTP_USER Укажите логин FTP-пользователя из данных для доступа по FTP.
    FTP_PASSWORD Укажите пароль FTP-пользователя.
    FTP_PATH Укажите относительный путь от каталога доступа FTP-пользователя к каталогу на хостинге, куда должен выполняться деплой. Внимание! Путь обязательно должен заканчиваться слешем /. Также, если в вашем проекте есть каталоги lib или etc, каталог доступа FTP-пользователя должен быть таким, чтобы они оказались не в корне.
  5. Настройте экшен:
    1. Переключитесь на вкладку «Actions».
    2. Нажмите «set up a workflow yourself» или сначала «New workflow», а затем «set up a workflow yourself».
    3. Замените код в поле «Edit new file» на такой:
      name: FTP deploy on push
      on: push
      jobs:
        web-deploy:
          name: Deploy
          runs-on: ubuntu-latest
          steps:
          - name: Get latest code
            uses: actions/checkout@v2
          - name: Sync files
            uses: SamKirkland/FTP-Deploy-Action@4.3.0
            with:
              server: ${{ secrets.REMOTE_HOST }}
              username: ${{ secrets.FTP_USER }}
              password: ${{ secrets.FTP_PASSWORD }}
              server-dir: ${{ secrets.FTP_PATH }}
    4. Нажмите «Start commit» и затем «Commit new file».
  6. Переключитесь на вкладку «Actions» и проверьте статус деплоя. Для просмотра подробностей нажмите на название рабочего процесса в списке «All workflows» и затем на «build» — в случае успеха возле каждой операции должна стоять галочка.

Важные моменты:

  • Для деплоя по SSH необходимо отключение ограничений доступа по IP к API. API используется для добавления и удаления IP GitHub из списка разрешённых для доступа по SSH.
  • После деплоя добавленный IP GitHub обязательно должен удаляться из списка разрешённых для доступа по SSH. Если IP не удалять, то в случае достижения лимита добавленных адресов деплой перестанет работать.
  • Каталог на хостинге при деплое очищаются. Содержимое каталога будет соответствовать содержимому репозитория.

Настройка автоматического деплоя на примере экшена Rsync Deployments Action.

Принцип работы:

  1. Определяется внешний IP GitHub, с которого будет выполняться подключение к хостингу.
  2. Внешний IP добавляется через API в список разрешённых для доступа по SSH.
  3. Выполняется деплой с помощью rsync.
  4. Внешний IP удаляется через API из списка разрешённых для доступа по SSH.
  1. Настройте доступ к API:
    1. Удалите все IP из списка разрешённых.
  2. Настройте SSH-аутентификацию по ключам:
    1. Сгенерируйте и добавьте ключ в учётную запись.
    2. Привяжите ключ к хостинг-аккаунту, куда должен выполняться деплой.
  3. Откройте свой репозиторий на GitHub.
  4. Добавьте необходимые для деплоя данные в секреты:

    Как добавлять секреты:

    1. Переключитесь на вкладку «Settings».
    2. В меню справа выберите «Secrets → Actions».
    3. Нажмите «New repository secret».
    4. Укажите название секрета в поле «Name» и значение в поле «Value».
    5. Нажмите «Add secret».

    Каждый параметр добавляется как отдельный секрет.

    Name Value
    ADM_TOOLS_API_TOKEN Укажите токен для доступа к хостингу по API.
    ADM_TOOLS_ACCOUNT_ID Укажите ID хостинг-аккаунта, куда должен выполняться деплой (не путать с ID учётной записи). Например, если открыть раздел «Хостинг → SSH-доступ», то в адресной строке браузера будет адрес вида https://adm.tools/hosting/account/123456/ssh/. Цифры в адресе это и есть ID хостинг-аккаунта.
    REMOTE_HOST Укажите хост из данных для доступа по SSH.
    REMOTE_USER Укажите логин из данных для доступа по SSH.
    REMOTE_KEY Вставьте данные приватного ключа в формате PEM (начинается с -----BEGIN RSA PRIVATE KEY-----). Внимание! Ключ должен быть приватный, не публичный.
    REMOTE_PATH Укажите абсолютный путь к каталогу на хостинге, куда должен выполняться деплой.
  5. Настройте экшен:
    1. Переключитесь на вкладку «Actions».
    2. Нажмите «set up a workflow yourself» или сначала «New workflow», а затем «set up a workflow yourself».
    3. Замените код в поле «Edit new file» на такой:
      name: SSH deploy on push
      on: push
      jobs:
        build:
          runs-on: ubuntu-latest
          steps:
            - name: Get public IP
              id: ip
              uses: haythem/public-ip@v1.2
            - name: Add IP to whitelist
              id: addip
              run: |
                curl -H "Content-Type: application/json" -H "Authorization: Bearer ${{ secrets.ADM_TOOLS_API_TOKEN }}" --request POST --data '{"account_id": "${{ secrets.ADM_TOOLS_ACCOUNT_ID }}", "ip": "${{ steps.ip.outputs.ipv4 }}"}' https://adm.tools/action/hosting/account/ssh/ip/send/
            - uses: actions/checkout@v2
            - name: rsync deploy
              uses: burnett01/rsync-deployments@5.2
              with:
                switches: -avzr --delete
                path: .
                remote_host: ${{ secrets.REMOTE_HOST }}
                remote_user: ${{ secrets.REMOTE_USER }}
                remote_key: ${{ secrets.REMOTE_KEY }}
                remote_path: ${{ secrets.REMOTE_PATH }}
            - name: Remove IP from whitelist
              id: removeip
              run: |
                curl -H "Content-Type: application/json" -H "Authorization: Bearer ${{ secrets.ADM_TOOLS_API_TOKEN }}" --request POST --data '{"account_id": "${{ secrets.ADM_TOOLS_ACCOUNT_ID }}", "ip": "${{ steps.ip.outputs.ipv4 }}"}' https://adm.tools/action/hosting/account/ssh/ip/delete_by_ip/
    4. Нажмите «Start commit» и затем «Commit new file».
  6. Переключитесь на вкладку «Actions» и проверьте статус деплоя. Для просмотра подробностей нажмите на название рабочего процесса в списке «All workflows» и затем на «build» — в случае успеха возле каждой операции должна стоять галочка.

Внимание!

При каждом деплое на почту учётной записи и в Telegram будет приходить уведомление о том, что был изменён список IP-адресов для доступа по SSH.
Содержание