Прозрачное развертывание с GitHub Actions (ru)

github

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

Как мы разворачиваем вручную? В простейшем случае подключаемся к серверу, вытягиваем репозиторий и перезапускаем приложение.

Автоматизируем этот процесс. Начнём с подключения. Обычно это выглядит так:

ssh root@192.168.0.1 -i ~/.ssh/id_rsa25519

Нам нужны три компонента для доступа:

  1. IP-адрес сервера
  2. Имя пользователя
  3. Приватный SSH-ключ Для “чистого” развертывания автоматизируем все шаги. Чтобы GitHub Actions мог подключиться к серверу, передадим данные через секреты.

В репозитории GitHub зайдите в SettingsSecuritySecrets and VariablesActions. Добавьте три секрета: SSH_USER, SSH_HOST, SSH_KEY. Не забудьте добавить публичный ключ в ~/.ssh/authorized_keys на сервере. Первый шаг завершён.

Далее — вытягивание репозитория. Если сервер чистый, его нужно клонировать. Для приватных репозиториев вы можете столкнуться с ошибкой:

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

Сгенерируйте SSH-ключи на сервере:

ssh-keygen -C github -t ed25519

Добавьте публичный ключ в Deploy keys в настройках репозитория GitHub. Создайте секрет SSH_PROJECT_PATH для пути к проекту.

Финальный шаг — GitHub Actions. Создайте файл .gitub/workflows/deploy.yaml (имя не важно):

name: Deploy
on:
  push:
    branches:
      - main
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Pull repo
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.SSH_HOST }}
          username: ${{ secrets.SSH_USER }}
          key: ${{ secrets.SSH_KEY }}
          script: |
            cd ${{ secrets.SSH_PROJECT_PATH }}
            git pull origin main --rebase
      - name: Compose down
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.SSH_HOST }}
          username: ${{ secrets.SSH_USER }}
          key: ${{ secrets.SSH_KEY }}
          script: |
            cd ${{ secrets.SSH_PROJECT_PATH }}
            docker compose down
      - name: Compose up
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.SSH_HOST }}
          username: ${{ secrets.SSH_USER }}
          key: ${{ secrets.SSH_KEY }}
          script: |
            cd ${{ secrets.SSH_PROJECT_PATH }}
            docker compose up -d

В этом примере я использую Docker для перезапуска сервисов. Выберите свой подход!```

Thanks for reading!

I'd love to hear your comments on the email.